我遇到shell_exec问题。我试着在一个单独的线程中运行另一个php文件,根据这个答案:https://stackoverflow.com/a/222445/1999929 我有这个非常简单的代码:
<?php
$realpath = realpath("./second.php");
file_put_contents("./log.txt","\nFirst php running!\n",FILE_APPEND);
shell_exec("php $realpath > /dev/null 2>/dev/null &");
?>
我需要这个,因为我想将此文件用于dropbox webhook链接,并且必须在10秒内给出响应,而处理更改的文件有时需要更多时间。所以这个文件必须告诉其他人运行,并给出响应,而不是等待对方完成。
当在代码中使用shell_exec时,文本在文件中无限次输出,没有它工作正常,但我需要以某种方式调用另一个文件。
编辑 - 我也尝试了exec(),因为上面的答案使用了它而不是shell_exec,结果是一样的。
答案 0 :(得分:1)
问题在于ENV,ENV中的某些东西与第二次调用PHP冲突,使PHP调用无限次第二个文件。这将产生一个叉炸弹。
但是如果你只是将$ env数组重置为空数组,那么第二个文件将被正确调用。
shell_exec()或exec()都不能操作$ ENV。 你需要使用“proc_open”:
resource proc_open ( $cmd , $descriptorspec , &$pipes [, $cwd [, $env]] )
所以:
<?php
$env = array();
$realpath = realpath("./second.php");
file_put_contents("./log.txt","\nFirst php running!\n",FILE_APPEND);
proc_open(
"php $realpath > /dev/null 2>/dev/null &",
$descriptorspec,
$pipes,
__DIR__,
$env
);
?>
答案 1 :(得分:0)
这个bug只影响PHP的CGI版本,CGI模块用脚本本身替换调用的命令导致无限循环。
为了防止这种情况,你应该调用“php-cli”而不是“php”:
shell_exec("php-cli $realpath > /dev/null 2>/dev/null &");