shell_exec导致无限循环

时间:2014-08-22 00:07:22

标签: php dropbox-api webhooks dropbox-php

我遇到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,结果是一样的。

2 个答案:

答案 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 &");