长进程php

时间:2010-04-17 13:17:23

标签: php long-running-processes

我需要运行一个非常长的PHP脚本(四个半,五个小时)。

脚本有时会成功运行,但有时会被莫名其妙地杀死(可能与共享托管有关吗?)。

我认为运行脚本的解决方案可能是较小的块。

为了做到这一点,我写了一个脚本来存储它的状态&在移动位置之前,在xml文件中定位并执行一个脚本块。

我在连接脚本的最后一点时遇到问题,这应该结束当前进程&重新执行脚本。

或者我正在咆哮错误的树!

我已经阅读了我在SO和其他地方可以找到的内容,但我仍然没有更聪明:(

请帮助!!!

5 个答案:

答案 0 :(得分:2)

考虑到你有一个永远运行但不会导致不一致数据的脚本,你可以使用一个cronjob。

问题是您需要知道您的脚本是否仍在运行,因为您可能不想启动它两次。我想到的两个解决方案是脚本的进程ID(getmypid())或使用时间戳。

对于PID:

  • 在脚本启动时保存PID(到/ tmp / script_pid)
  • 每分钟触发cronjob。查找具有保存PID的活动进程,如果未找到则启动。

你需要访问php的exec()(以及朋友)和linux'“ps”等命令行工具。

对于时间戳:

  • 每次迭代都保存时间戳。
  • 每分钟触发cronjob。如果时间戳早于X,则启动新进程。

你必须弄清楚X应该是多长时间。

答案 1 :(得分:1)

PHP不是运行长脚本的首选语言。我假设你在浏览器中运行它?尝试通过SSH登录并使用php /path/to/script.php运行脚本。

如果您可以在本地运行,则可以在本地计算机上安装基本的Apache / PHP安装,然后运行它。如果您没有shell访问权限,请使用此选项。

答案 2 :(得分:1)

如果可能的话,我会尝试将长时间运行的进程拆分为自己的进程。让您的PHP脚本启动计算,然后查找可能已完成的线索(类似于包含当前计算进度的状态文件)。然后你甚至可以使用AJAX技术为用户提供一个很好的小进度条;)

答案 3 :(得分:1)

如果您可以在此服务器上访问cron,则可以每分钟运行一次脚本来处理下一个数据块。

答案 4 :(得分:0)

我同意Josh的观点,并建议您尽可能以其他方式对桌面应用程序进行编程。 PHP肯定不是为这样的东西构建的,这需要脚本运行4-5个小时。这可以肯定max_execution_time或脚本占用共享主机中的CPU但移动到桌面应用程序或SSH是我建议的锻炼。