管理长时间运行的php脚本的最佳方法?

2022-08-30 07:59:26

我有一个PHP脚本,需要很长时间(5-30分钟)才能完成。为了以防万一,脚本使用curl从另一台服务器抓取数据。这就是它花费这么长时间的原因;它必须等待每个页面加载,然后才能处理它并移动到下一个页面。

我希望能够启动脚本并让它一直存在,直到它完成,这将在数据库表中设置一个标志。

我需要知道的是,如何在脚本完成运行之前结束 http 请求。另外,php脚本是执行此操作的最佳方法吗?


答案 1

当然,这可以用PHP完成,但是你不应该把它作为后台任务来做 - 新进程必须与启动它的进程组分离。

由于人们一直对这个FAQ给出相同的错误答案,我在这里写了一个更完整的答案:

http://symcbean.blogspot.com/2010/02/php-and-long-running-processes.html

从评论中:

简短的版本只是“为什么”的原因,在这里包含有点长。shell_exec('echo /usr/bin/php -q longThing.php | at now');

更新 +12 年

虽然这仍然是调用长时间运行的代码的好方法,但限制甚至禁用Web服务器中的PHP启动其他可执行文件的能力对安全性是有好处的。由于这会将日志运行事物的行为与启动它的行为分离,因此在许多情况下,使用守护程序或cron作业可能更合适。


答案 2

快速而肮脏的方法是在php中使用该函数。这基本上是说:不要在乎用户做什么,运行这个脚本直到它完成。如果它是一个面向公众的站点,这有点危险(因为如果脚本被启动20次,你最终可能会同时运行20 ++个版本的脚本)。ignore_user_abort

“干净”的方式(至少恕我直言)是当你想要启动进程时设置一个标志(例如在数据库中),并每小时(左右)运行一次cronjob来检查是否设置了该标志。如果已设置,则启动长时间运行的脚本,如果未设置,则不会发生。


推荐