我有一个PHP脚本,需要调用shell脚本,但根本不关心输出。shell脚本执行了许多SOAP调用,完成起来很慢,因此我不想在PHP请求等待应答时降低它的速度。事实上,PHP请求应该能够在不终止shell进程的情况下退出。
我已经研究了各种exec()、shell_exec()、pcntl_fork()等函数,但它们似乎都不能提供我想要的东西。(或者,即使他们这样做,我也不清楚是如何做到的。)有什么建议吗?
我有一个PHP脚本,需要调用shell脚本,但根本不关心输出。shell脚本执行了许多SOAP调用,完成起来很慢,因此我不想在PHP请求等待应答时降低它的速度。事实上,PHP请求应该能够在不终止shell进程的情况下退出。
我已经研究了各种exec()、shell_exec()、pcntl_fork()等函数,但它们似乎都不能提供我想要的东西。(或者,即使他们这样做,我也不清楚是如何做到的。)有什么建议吗?
当前回答
我发现唯一对我有效的方法是:
shell_exec('./myscript.php | at now & disown')
其他回答
使用命名fifo。
#!/bin/sh
mkfifo trigger
while true; do
read < trigger
long_running_task
done
然后,每当您想启动长时间运行的任务时,只需向触发器文件写入一个换行符(非阻塞)。
只要您的输入小于PIPE_BUF,并且它是一个单独的write()操作,您就可以将参数写入fifo并在脚本中显示为$REPLY。
如果它“不关心输出”,脚本的exec不能被调用和后台进程?
编辑-结合@AdamTheHut对这篇文章的评论,你可以把它添加到对exec的调用中:
" > /dev/null 2>/dev/null &"
这将把stdio (first >)和stderr(2>)重定向到/dev/null并在后台运行。
做同样的事情还有其他方法,但这是最简单的。
上述双重定向的替代方法:
" &> /dev/null &"
我用at来做这个,因为它真的开始了一个独立的过程。
<?php
`echo "the command"|at now`;
?>
如果没有使用队列,你可以像这样使用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);
在Linux中,您可以通过在命令末尾附加&号来在一个新的独立线程中启动一个进程
mycommand -someparam somevalue &
在Windows系统中,可以使用“start”DOS命令
start mycommand -someparam somevalue