我有一个PHP脚本,需要调用shell脚本,但根本不关心输出。shell脚本执行了许多SOAP调用,完成起来很慢,因此我不想在PHP请求等待应答时降低它的速度。事实上,PHP请求应该能够在不终止shell进程的情况下退出。
我已经研究了各种exec()、shell_exec()、pcntl_fork()等函数,但它们似乎都不能提供我想要的东西。(或者,即使他们这样做,我也不清楚是如何做到的。)有什么建议吗?
我有一个PHP脚本,需要调用shell脚本,但根本不关心输出。shell脚本执行了许多SOAP调用,完成起来很慢,因此我不想在PHP请求等待应答时降低它的速度。事实上,PHP请求应该能够在不终止shell进程的情况下退出。
我已经研究了各种exec()、shell_exec()、pcntl_fork()等函数,但它们似乎都不能提供我想要的东西。(或者,即使他们这样做,我也不清楚是如何做到的。)有什么建议吗?
当前回答
使用命名fifo。
#!/bin/sh
mkfifo trigger
while true; do
read < trigger
long_running_task
done
然后,每当您想启动长时间运行的任务时,只需向触发器文件写入一个换行符(非阻塞)。
只要您的输入小于PIPE_BUF,并且它是一个单独的write()操作,您就可以将参数写入fifo并在脚本中显示为$REPLY。
其他回答
您也可以运行PHP脚本作为daemon或cronjob: #!/usr/bin/php q
在linux上,您可以执行以下操作:
$cmd = 'nohup nice -n 10 php -f php/file.php > log/file.log & printf "%u" $!';
$pid = shell_exec($cmd);
这将在命令提示符处执行命令,然后只返回PID,您可以检查> 0以确保它工作正常。
这个问题类似:PHP有线程吗?
我发现唯一对我有效的方法是:
shell_exec('./myscript.php | at now & disown')
我用这个…
/**
* Asynchronously execute/include a PHP file. Does not record the output of the file anywhere.
* Relies on the PHP_PATH config constant.
*
* @param string $filename file to execute
* @param string $options (optional) arguments to pass to file via the command line
*/
function asyncInclude($filename, $options = '') {
exec(PHP_PATH . " -f {$filename} {$options} >> /dev/null &");
}
(PHP_PATH是一个const类型,如define('PHP_PATH', '/opt/bin/php5')或类似定义)
它通过命令行传入参数。要在PHP中读取它们,请参阅argv。
Php-execute-a-background-process有一些很好的建议。我觉得我的很好,但我有偏见:)