-4

我有一个 PHP 脚本,它查询数据库以获取要完成的作业列表,并根据它在数据库中找到的内容(基本上是一个进程队列)触发其他 PHP 脚本。

队列运行器脚本执行的某些脚本可能需要 30 秒左右才能完成运行(转换视频、调整图像大小等)。

问题是队列运行器脚本中的 shell_exec() 调用处理脚本,但不等待它们完成,导致队列未完成。

队列运行器脚本:

#!/usr/bin/php
<?php
    // Loop through database and find jobs to be done
    shell_exec("nohup $command > /dev/null 2> /dev/null & echo $! &");
?>

直接从命令行运行作业脚本可以工作并创建 PDF。

有想法该怎么解决这个吗?还是运行进程队列的更好方法?

4

2 回答 2

3

shell_exec不是您的问题的原因。它会等待并返回您的命令的输出。但是,您不能在后台启动命令并使用nohup

nohup是您正在调用的命令,但一旦它启动了它的子进程,它将立即退出,因此,shell_exec不会等待该进程完成。您还应该避免使用&在后台运行该命令。

于 2012-07-17T14:05:14.670 回答
0

我首先建议不要从 PHP 执行代码,而是尽可能使用 PHP 包装器和库。

我看到的一个问题是您的处理是同步的,这意味着用户将不得不等待服务器响应而对正在发生的事情没有任何线索。他甚至可能会刷新页面,这会增加您服务器的负载而无法控制,这是一个非常严重的问题。这将启用DOS 攻击

我建议将 AJAX 用于这些长期运行的任务。您可以在网页上显示一些内容以显示进度并在完成后更新它(AJAX)或切换到另一个页面。您甚至可以通过在 javascript 中捕获该事件并终止进程来处理用户退出页面的情况。

于 2012-07-17T14:06:49.240 回答