在PHP中执行exec()或system(),不等待输出

在PHP中执行exec()或system(),不等待输出,php,command,system,exec,delay,Php,Command,System,Exec,Delay,我想从PHP脚本中触发eider exec()或system()中的shell命令,但这是一项需要花费一些时间才能完成的任务,有没有办法触发它并毫不延迟地继续运行PHP页面加载 编辑:我在CentOS 6,PHP5.3上,请使用ajax请求激活exec部分…然后继续执行其他任务。这应该可以: shell_exec("nohup yourcommand > /dev/null 2> /dev/null &"); 编辑:对不起,我不知道为什么我排除了&把它放在背景 2> 将ST

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


编辑:我在CentOS 6,PHP5.3上,请使用ajax请求激活exec部分…然后继续执行其他任务。这应该可以:

shell_exec("nohup yourcommand > /dev/null 2> /dev/null &");
编辑:对不起,我不知道为什么我排除了&把它放在背景
2> 将STDOUT和STDERR重定向到/dev/null。

取决于您使用的操作系统

对于linux:

pclose(popen("php somefile.php &","r"));
请注意结尾处的安培表(非常重要)

对于windows:

pclose(popen("start php.exe somefile.php","r"));
这里的
start
关键字很重要


希望这有帮助。

< P>这不直接回答你的问题,但是你应该考虑在后台进程中使用Con作业或使用诸如BeaStAcDeD这样的队列进行视频转换工作。

通过这种方式,您可以在后台堆叠ffmpeg工作,而不会阻塞Web服务器

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

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

您可能会发现一些有用的工具:

我所做的:

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
}

命令运行但存在延迟,这是完整的命令:
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-ss80 videos/images/1.jpg>/dev/null 2>/dev/null”)相同延迟,命令执行正常。也许ffmpeg只是起到了不同的作用?我自己用PHP和ffmpeg测试了一下,现在它可以工作了。它可能可以工作,但应该有一种更简单、更可靠的方法,比如在exec()或system()末尾加一个参数;我没有达到-1级。盖伊给出了一个简短的回答。也许不喜欢,但仍然是一个公平的解决方案。在尝试了任何其他解决方案后,最终使用了您的建议。非常感谢你!我尝试了
exec(“php video\u processor.php&”)
和延迟是相同的,如果我在video_processor.php内设置了
睡眠(10)
,那么我的父脚本也会等待10秒
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-ss80 videos/images/1.jpg&“,“r”)谢谢派对::)哇,我真不敢相信这是多么容易和简单!绝妙的解决方案!我以前对此进行过详细的研究,其他解决方案都建议采用复杂的策略来分叉或线程化PHP进程;从Windows10创建者更新(1703)开始,“开始”命令的“/B”后台开关不起作用。很高兴看到不需要它。似乎只需要
标题('Content-Length:0');冲洗()给我