【问题标题】:How to debug popen() not working?如何调试 popen() 不起作用?
【发布时间】:2015-02-25 18:13:21
【问题描述】:

在我的 Linux 服务器上,我使用 shell_exec() 异步运行脚本。此功能在我用于开发的 Windows 上不可用,因此我尝试改用 popen()

我正在运行 Windows 10 x64、WampServer 2.5 x32 (PHP 5.5.12)。

我在 PHP 文件中有以下代码:

$cmd = '"C:\wamp\bin\php\php5.5.12\php.exe" "C:\wamp\www\path\to\file.php" "arg1" "arg2"';

        echo 'Running on DEV MACHINE: ' . $cmd . PHP_EOL;
        $handle = popen("start /B " . $cmd, "r");
        if ($handle === FALSE) {
            die("Unable to execute $cmd");
        }
        pclose($handle);

脚本执行没有任何错误,但 PHP 文件永远不会运行。我知道它们没有运行,因为我在最顶部放置了一个 SQL 查询来更新数据库中的字段以指示它们已运行。

正如您在上面的代码中看到的,我打印出传递给popen() 的命令。如果我将该命令粘贴到命令提示符中并执行它,则脚本运行良好。这证明问题出在popen()

我是否以某种方式错误地使用了popen()?如何调试问题所在?通常我会使用 XDebug 进行调试,但在这种情况下无法使用它。

【问题讨论】:

    标签: php windows background-process popen


    【解决方案1】:

    我始终无法让我的代码正常工作,但我从此处的另一个答案中找到了一种替代方法,并在此基础上将我的代码更改为使用以下代码并且它可以工作:

    $WshShell = new \COM("WScript.Shell");
    $oExec = $WshShell->Run($cmd, 0, false);
    

    【讨论】:

    • 你试过了吗:pclose(popen("start /B " . $cmd, "r"));
    • @Anthony 如果您查看代码,这正是我的问题所在。由于某种原因它不起作用。
    • 不,你有 popen() 然后是错误检查,然后是 pclose()。我建议使用 pclose(popen()),popen 位于 pclose 内。如果您查看代码,您会发现其中的差异。
    • @Anthony 这就是我最初的方式,但我将其更改为问题中的方式,以便我 可以 检查错误,因为我正在尝试调试.代码在任何情况下都是等效的..
    猜你喜欢
    • 1970-01-01
    • 2011-05-25
    • 2016-03-06
    • 2023-04-03
    • 1970-01-01
    • 2014-12-08
    • 2013-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多