1

我对 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 &");
?>

我需要这个,因为我想将此文件用于保管箱 webhook 链接,并且它必须在 10 秒内给出响应,而处理更改的文件有时需要更多时间。所以这个文件必须告诉对方运行,并给出响应,而不是等待对方完成。

当在代码中使用 shell_exec 时,文本会在文件中无限次输出,没有它可以正常工作,但我需要以某种方式调用另一个文件。

编辑- 我也尝试了 exec(),因为上面的答案使用它而不是 shell_exec,结果是一样的。

4

2 回答 2

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
     );
?>
于 2016-11-27T20:33:09.457 回答
0

此错误仅影响 PHP 的 CGI 版本,CGI 模块将调用的命令替换为脚本本身导致无限循环。

为了防止这种情况,你应该调用“php-cli”而不是“php”:

shell_exec("php-cli $realpath > /dev/null 2>/dev/null &");
于 2016-11-28T16:27:30.680 回答