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

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


当前回答

我还发现Symfony Process Component在这方面很有用。

use Symfony\Component\Process\Process;

$process = new Process('ls -lsa');
// ... run process in background
$process->start();

// ... do other things

// ... if you need to wait
$process->wait();

// ... do things after the process has finished

在GitHub回购中查看它是如何工作的。

其他回答

Php-execute-a-background-process有一些很好的建议。我觉得我的很好,但我有偏见:)

我还发现Symfony Process Component在这方面很有用。

use Symfony\Component\Process\Process;

$process = new Process('ls -lsa');
// ... run process in background
$process->start();

// ... do other things

// ... if you need to wait
$process->wait();

// ... do things after the process has finished

在GitHub回购中查看它是如何工作的。

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

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

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

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

在Linux中,您可以通过在命令末尾附加&号来在一个新的独立线程中启动一个进程

mycommand -someparam somevalue &

在Windows系统中,可以使用“start”DOS命令

start mycommand -someparam somevalue

如果没有使用队列,你可以像这样使用proc_open():

    $descriptorspec = array(
        0 => array("pipe", "r"),
        1 => array("pipe", "w"),
        2 => array("pipe", "w")    //here curaengine log all the info into stderror
    );
    $command = 'ping stackoverflow.com';
    $process = proc_open($command, $descriptorspec, $pipes);