【问题标题】:Run a second php file with a 20 second delay运行第二个 php 文件,延迟 20 秒
【发布时间】:2011-12-14 14:30:53
【问题描述】:

我需要在后台运行第二个 php 文件。问题是这个文件只需要在当前文件完成后运行 20 秒。我已经使用 exec("php test_script.php") 来运行该文件,但我无法让它等待。如果我使用 sleep() 如果暂停我当前的脚本。

更具体一点。我正在将文件上传到远程服务器。然后我需要在完成上传后等待大约 20 秒以检查服务器是否有响应。与此同时,我想继续处理当前文件。第二个文件将在后台执行所需的操作。目前我必须等待然后运行第二个文件。

【问题讨论】:

  • 那么你为什么不使用你当前的解决方案并在第二个文件的开头添加你的 sleep(20) 而不是在第一个文件的末尾使用它?
  • 带有 ajax 调用的 setTimeout() javascript 函数怎么样?
  • @ToniMichelCaubet 如果用户关闭浏览器选项卡,它不会触发。

标签: php exec delay background-process


【解决方案1】:

最简单的解决方案是be found here。基本上,像这样执行你的脚本:

exec('test_script.php >/tmp/output.txt &');

注意末尾的和号('&'),这将使命令在后台运行!您可以通过在 test_script.php 中添加 sleep 将脚本延迟 20 秒。

您的其他选项是通过客户端的 Javascript (AJAX) 触发第二个脚本;或在后台运行一个进程(或定期通过 cron 作业),该进程正在检查某种常见数据(例如数据库)的请求,如果需要处理此类请求,该进程将激活。

如果脚本必须运行,则 JavaScript 不是一个选项,因为用户可能决定离开您的页面,或者不执行 JavaScript,或者是恶意的并决定不执行该脚本特定的 JavaScript。

【讨论】:

    【解决方案2】:

    sleep() 调用放在你的test_script.php 文件中(在实际代码之前),然后在调用exec 时,确保将命令的输出重定向到一个文件。比如:

    exec("php test_script.php > /tmp/output.txt");
    

    这可以确保它不会中断第一个(调用)脚本的加载,并且它将是异步的。

    【讨论】:

    • 重定向输出如何使进程异步/在后台执行?
    • @nyarlathotep - 根据 PHP 手册:“如果使用此函数启动程序,为了使其继续在后台运行,必须将程序的输出重定向到文件或另一个输出流。否则将导致 PHP 挂起,直到程序执行结束。"
    • 有趣的是,德语 php 手册版本(对我来说首先出现在 google 上)没有这个额外的注释...
    • 另外,不过,我看到的解决方案通常也需要和号(&)
    • @nyarlathotep 他们并不需要,但最好把它放在那里。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多