我有一个PHP脚本,需要调用shell脚本,但根本不关心输出。shell脚本执行了许多SOAP调用,完成起来很慢,因此我不想在PHP请求等待应答时降低它的速度。事实上,PHP请求应该能够在不终止shell进程的情况下退出。

我已经研究了各种exec()、shell_exec()、pcntl_fork()等函数,但它们似乎都不能提供我想要的东西。(或者,即使他们这样做,我也不清楚是如何做到的。)有什么建议吗?


当前回答

如果它“不关心输出”,脚本的exec不能被调用和后台进程?

编辑-结合@AdamTheHut对这篇文章的评论,你可以把它添加到对exec的调用中:

" > /dev/null 2>/dev/null &"

这将把stdio (first >)和stderr(2>)重定向到/dev/null并在后台运行。

做同样的事情还有其他方法,但这是最简单的。


上述双重定向的替代方法:

" &> /dev/null &"

其他回答

我用at来做这个,因为它真的开始了一个独立的过程。

<?php
    `echo "the command"|at now`;
?>

在linux上,您可以执行以下操作:

$cmd = 'nohup nice -n 10 php -f php/file.php > log/file.log & printf "%u" $!';
$pid = shell_exec($cmd);

这将在命令提示符处执行命令,然后只返回PID,您可以检查> 0以确保它工作正常。

这个问题类似:PHP有线程吗?

您也可以运行PHP脚本作为daemon或cronjob: #!/usr/bin/php q

对所有Windows用户:我发现了一个运行异步PHP脚本的好方法(实际上它几乎适用于所有东西)。

它基于popen()和pclose()命令。并且在Windows和Unix上都能很好地工作。

function execInBackground($cmd) {
    if (substr(php_uname(), 0, 7) == "Windows"){
        pclose(popen("start /B ". $cmd, "r")); 
    }
    else {
        exec($cmd . " > /dev/null &");  
    }
} 

原始代码来自:http://php.net/manual/en/function.exec.php#86329

我发现唯一对我有效的方法是:

shell_exec('./myscript.php | at now & disown')