【问题标题】:PHP wait for exec to finish and output the resultPHP 等待 exec 完成并输出结果
【发布时间】:2016-09-22 14:25:58
【问题描述】:

我有一个 php 文件,它从 URL 中接收几个参数,然后运行一个 exec 命令,我想在其中等待并显示 exec 的结果。此 exec 命令大约需要 20-30 秒才能完成。它永远不会完成,因为网页只是收到一个 nginx 502 bad gateway 错误(超时)。而不是扩展 nginx 超时错误,因为长时间挂起连接是不好的做法,我如何在后面运行 php 的 exec然后在完成后将其返回到页面上? 或者有没有更好的方法来完成这个而不使用 php?

【问题讨论】:

  • 你必须告诉 nginx 这个特定的脚本是长时间运行的,所以它不会超时。
  • 给我们一些更多的细节和一个例子。我最初的想法是您需要一个 cron 作业和一个用于网页显示的缓存
  • @MarcB 我怎样才能用 nginx 挑出这个脚本并告诉它不要超时?我在 nginx 和 php-fpm confs 中尝试了各种设置,但没有成功。
  • 你需要异步运行exec srypt,例如在python中我使用celery,还有一个php客户端:github.com/gjedeer/celery-php

标签: php api exec


【解决方案1】:

让 PHP 触发一个 exec 到一个分叉的脚本,以便它在后台运行(以 & 结尾)。然后该页面应返回一些 js,这些 js 通过 ajax 请求定期轮询服务器以检查原始脚本的状态。该脚本应将其 STDOUT 和 STDERR 输出到唯一文件,以便轮询脚本可以检查状态。

编辑:如果您需要知道脚本的退出代码,请将其包装在另一个脚本中:

#/bin/bash
uniqId=$1
yourscript $uniqId &
myPid=$!
echo $myPid > $uniqId'.pid'
wait $myPid
echo $? > $uniqId'.returned'

致电./wrapper.sh someIdUniqueToClient &。未经测试,但你明白了要点。

【讨论】:

  • 我之前完成过类似的任务,是正确的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-13
  • 1970-01-01
  • 2021-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多