PHP shell_exec 等待脚本完成? [复制]
Posted
技术标签:
【中文标题】PHP shell_exec 等待脚本完成? [复制]【英文标题】:PHP shell_exec wait for script to done? [duplicate] 【发布时间】:2012-07-16 11:12:09 【问题描述】:我有一个 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。
关于如何解决这个问题的任何想法?还是运行进程队列的更好方法?
【问题讨论】:
你为什么使用 nohup 和 &?只需在前台运行您的命令! 你还关心答案吗? 【参考方案1】:shell_exec 不是您的问题的原因。它会等待并返回您的命令的输出。但是,您不能在后台启动命令并使用 nohup。
nohup 是您正在调用的命令,但一旦它启动其子进程,它将立即退出,因此,shell_exec 不会等待该进程完全的。您还应该避免使用 & 在后台运行该命令。
【讨论】:
【参考方案2】:我首先建议不要从 PHP 执行代码,而是尽可能使用 PHP 包装器和库。
我看到的一个问题是您的处理是同步的,这意味着用户将不得不等待服务器响应而对正在发生的事情没有任何线索。 他甚至可能会刷新页面,这会增加您服务器的负载而无法控制,这是一个非常严重的问题。这将启用 DOS 攻击。
我建议将 AJAX 用于这些长时间运行的任务。您可以在网页上显示一些内容以显示进度并在完成后更新它(AJAX)或切换到另一个页面。 您甚至可以通过在 javascript 中捕获该事件并终止进程来处理用户退出页面的情况。
【讨论】:
顺便说一句,您没有检查命令的返回码。那么用户也不知道操作是否成功? 无论如何都不会返回,因为 shell_exec() 返回其调用的输出。但是,包括 stderr 在内的所有内容都将转到 /dev/null。如果不打算进行用户交互,它可能至少应该转到日志文件。以上是关于PHP shell_exec 等待脚本完成? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
在后台运行 php shell_exec 时显示加载栏或 gif
Libreoffice shell_exec 在 PHP 脚本中失败
无法使用PHP shell_exec执行powershell脚本函数
为啥这个带有 shell_exec 调用的 PHP 脚本从 Windows 10 的命令行运行,而不是浏览器/本地主机?