3

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

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

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

为了做到这一点,我编写了一个脚本,将它的状态和位置存储在一个 xml 文件中,并在移动位置之前执行脚本的一部分。

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

或者我可能完全是在叫错树!

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

请帮忙!!!

4

5 回答 5

2

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

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

对于 PID:

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

您需要访问 php 的 exec()(和朋友)和命令行工具,如 linux 的“ps”。

对于时间戳:

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

你必须弄清楚X应该是你自己多久。

于 2010-04-17T13:53:10.640 回答
1

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

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

于 2010-04-17T13:20:31.797 回答
1

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

于 2010-04-17T13:25:13.687 回答
1

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

于 2010-04-17T13:25:26.773 回答
0

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

于 2010-04-17T13:40:59.573 回答