【问题标题】:Executing an exec() or system() in PHP and do not wait for output在 PHP 中执行 exec() 或 system() 并且不等待输出
【发布时间】:2012-02-13 04:01:28
【问题描述】:

我想从 PHP 脚本中触发 eider exec() 或 system() 中的 shell 命令,但这是一项需要一段时间才能完成的任务,有没有办法触发它并继续运行 PHP 页面加载而不会有延迟?

编辑:我在 CentOS 6,PHP 5.3

【问题讨论】:

    标签: php command system exec delay


    【解决方案1】:

    使用 ajax 请求来激活 exec 部分...然后继续其他任务

    【讨论】:

    • 它可能会起作用,但应该有一种更简单、更可靠的方法,比如 exec() 或 system() 末尾的参数;
    • 我没有得到 -1 级别。盖伊给出了简短的回答。也许不喜欢,但仍然是一个公平的。
    • 在尝试了任何其他解决方案后,最终设法使用您的建议使其工作。非常感谢!
    【解决方案2】:

    这应该可行:

    shell_exec("nohup yourcommand > /dev/null 2> /dev/null &");
    

    编辑:对不起,不知道为什么我排除了 & 把它放到 bg 2> 将 STDOUT 和 STDERR 重定向到 /dev/null。

    【讨论】:

    • 命令运行但有延迟,这是完整的命令:shell_exec("ffmpeg -i 'videos/sample.mp4' -qmax 1 -vframes 1 -ss 80 videos/images/1.jpg 2> /dev/null");
    • 尝试:shell_exec("nohup ffmpeg -i 'videos/sample.mp4' -qmax 1 -vframes 1 -ss 80 个视频/图像/1.jpg > /dev/null 2> /dev/空")
    • 同样的延迟,命令执行良好。也许 ffmpeg 只是行为不同?
    • 刚刚自己用 PHP 和 ffmpeg 测试过,现在可以了。
    【解决方案3】:

    取决于您使用的操作系统。

    对于 Linux:

    pclose(popen("php somefile.php &","r"));
    

    注意末尾的符号(非常重要)。

    对于窗户:

    pclose(popen("start php.exe somefile.php","r"));
    

    这里start 关键字很重要。

    希望这会有所帮助。

    【讨论】:

    • 我试过exec("php video_processor.php &");,延迟是一样的,如果我在video_processor.php中设置sleep(10),那么我的父脚本也会等待10秒。
    • 试试pclose(popen("php video_processor.php &","r"));或pclose(popen("/usr/bin/php video_processor.php &","r"));(我假设你的PHP安装在默认位置)
    • 它适用于这个:pclose(popen("php video_processor.php &","r")); 所以我编辑了我的并且它有效:pclose(popen("ffmpeg -i 'videos/sample.mp4' -qmax 1 -vframes 1 -ss 80 videos/images/1.jpg &","r")); 谢谢。 :party: :)
    • 哇,我不敢相信这是多么容易和简单!绝妙的解决方案!我之前对此进行了一定长度的研究,并且所有其他解决方案都推荐了用于分叉或线程化 PHP 进程的复杂策略。
    • Windows 特定注释:我曾经使用:pclose(popen("start /B php.exe somefile.php","r"));从 Windows 10 创意者更新 (1703) 开始 - “开始”命令的“/B”背景开关不起作用。很高兴看到它不需要。
    【解决方案4】:

    这并不能直接回答您的问题,但您应该考虑在后台进程中使用 cron 作业或使用 Beanstalkd 等队列进行视频转换工作。

    这样,您可以在后台堆叠您的 ffmpeg 工作,而不会阻塞您的网络服务器。

    过去我在这两种方法(cron / queue)上都取得了很大的成功。

    其他一些关于后台进程的帖子:

    php execute a background process

    Run a ffmpeg process in the background

    Using ffmpeg, PHP and beanstalk

    一些您可能会觉得有用的工具:

    http://kevin.vanzonneveld.net/techblog/article/create_daemons_in_php/

    PEAR System_Daemon

    Pheanstalk, a Beanstalkd library for PHP

    【讨论】:

      【解决方案5】:

      我做什么:

      public function post_create()
      {
          ob_end_clean();
          header("Connection: close");
          ignore_user_abort(); // optional
          ob_start();
          echo "Tell ajax to gtfo!";
      
          $size = ob_get_length();
          header("Content-Length: $size");
          ob_end_flush(); // Strange behaviour, will not work
          flush();            // Unless both are called !
          // Do processing here
      }
      

      【讨论】:

      • 对我来说似乎只适用于header('Content-Length:0');flush();
      猜你喜欢
      • 1970-01-01
      • 2021-07-05
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-13
      • 2015-01-27
      • 2019-11-17
      相关资源
      最近更新 更多