原则ODM在游标上调用->toArray会导致由exec调用的CLI脚本执行一个void返回(仅在exec/shell_


Doctrine ODM Calling ->toArray on a Cursor causes CLI script called by exec to do a void return (only on exec/shell_exec call)

我使用CLI脚本来做一些事情。今天我想把它改成在浏览器上显示结果,而不是在终端上。当从终端调用时,它每次都可以完美地工作,但当我从exec php命令中调用它时,当有对doctrine Cursor::toArray的调用时,则不可以。

执行以下代码行:

        $parses=$dm->createQueryBuilder("App'Document'Parse")
                ->field('positions.website')->equals($name)
                ->getQuery()->execute();
        /* @var $parses Doctrine'ODM'MongoDB'Cursor */
        $details=[];


        foreach($parses as $parse){
            /* some other things */
        }

        echo json_encode($details);

当调用form terminal (php cli.php find parses -site test.com)时,它返回给我一个漂亮的json文档。

但是现在我想在浏览器上显示它。然后我做一个小脚本(http可访问)调用'exec("php cli.php找到解析-站点test.com")'。它什么也没给我。(也尝试过shell_exec;也尝试了其他脚本:他们工作)

现在我删除foreach循环。我得到了下面的代码:

        $parses=$dm->createQueryBuilder("App'Document'Parse")
                ->field('positions.website')->equals($name)
                ->getQuery()->execute();
        /* @var $parses Doctrine'ODM'MongoDB'Cursor */
        $details=[];
        echo json_encode($details);

当我从exec调用它时:它返回给我一个漂亮的空json字符串

(请记住,当我直接从终端调用它时,每个case仍然有效)

现在我尝试在条形光标上调用->toArray():

        $parses=$dm->createQueryBuilder("App'Document'Parse")
                ->field('positions.website')->equals($name)
                ->getQuery()->execute();
        /* @var $parses Doctrine'ODM'MongoDB'Cursor */
        $details=[];
        $parses->toArray();
        echo json_encode($details);

当我从exec或shell exec调用它时,它什么也不返回,但是当从终端本身调用它时,它返回一个很好的"array(0){}"。

它尝试了其他脚本与exec和shell exec,他们都工作,做得很好,只有当他们不使用Doctrine游标到数组

当您从终端运行PHP脚本时,它在运行用户的许可下运行。当您在web服务器上运行PHP脚本时,它将以服务器进程的权限运行。

检查运行脚本的用户是否具有访问web目录中相同文件的权限。

还有,你打开error_reporting并检查error_log文件了吗?