2012-07-17 99 views
-4

我有一个PHP脚本,用于查询数据库中要完成的工作列表,并基于它在数据库中找到的内容(基本上是一个进程队列)来触发其他PHP脚本。PHP shell_exec等待脚本完成?

队列运行器脚本执行的一些脚本可能需要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。

有关如何解决此问题的任何想法?或者更好的方式来运行一个流程队列?

+0

你为什么使用** nohup **和**&**?只需在前台运行你的命令! – inVader 2012-07-17 14:11:46

+0

你甚至关心答案吗? – inVader 2012-07-20 14:36:42

回答

3

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

nohup的是你在呼唤,但只要它已经开始它的子进程将退出immediatelly,因此,了shell_exec不会等待完成这一进程的命令。您还应该避免在后台运行该命令,并使用&

0

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

我看到的一个问题是您的处理是同步的,这意味着用户将不得不等待服务器响应而不知道发生了什么。 他甚至可能刷新页面,这会增加服务器的负载而无法控制,这是一个非常严重的问题。这将启用DOS攻击

我建议AJAX为这些长期运行的任务。您可以显示某些内容以显示网页上的进度,并在完成后更新(AJAX)或切换到其他页面。 你甚至可以通过在javascript中捕获该事件并杀死该进程来处理用户退出该页面的情况。

+0

顺便说一句,你没有检查命令的返回码。那么用户不知道操作的成功吗? – tiktak 2012-07-17 14:08:42

+0

因为shell_exec()返回其调用的输出,所以不会有返回。但是,包括stderr在内的所有内容都将转到/ dev/null。如果没有用户交互意图,那么至少应该转到日志文件。 – inVader 2012-07-18 08:05:31