PHP shell_exec是否等待脚本完成?

PHP shell_exec是否等待脚本完成?,php,ffmpeg,shell-exec,Php,Ffmpeg,Shell Exec,我有一个PHP脚本,它在数据库中查询要完成的作业列表,并根据在数据库中找到的内容(基本上是一个进程队列)触发其他PHP脚本 队列运行器脚本执行的某些脚本可能需要30秒左右的时间才能完成转换视频、调整图像大小等操作 问题是队列运行器脚本中的shell_exec调用处理脚本,但不等待它们完成,从而导致队列无法完成 队列运行程序脚本: #!/usr/bin/php <?php // Loop through database and find jobs to be done sh

我有一个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

有没有办法解决这个问题?还是运行进程队列的更好方法?

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


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

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

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

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

BTW,您没有检查命令的返回代码。那么用户也不知道该操作是否成功?因为shell_exec返回其调用的输出,所以无论如何都不会返回。但是,包括stderr在内的所有内容都将转到/dev/null。如果没有用户交互,它至少应该转到日志文件。为什么要使用nohup和&?只需在前台运行您的命令!你在乎答案吗?