在循环中,PHP echo不会运行

时间:2014-06-12 15:20:31

标签: php debugging phpunit xdebug

我的一个phpunit测试中有一个函数可以执行此操作:

    echo "Order id: ".$order->id."\n";
    $email = $this->getOrderEmail($order->id);
    while($email === null) {
        echo "Sleeping for order id ".$order->id."\n";
        $this->saything();
        sleep(1);
        $email = $this->getOrderEmail($order->id);
    }
    echo "Got email: ".$email->MessageID."\n";

它为多个订单运行相同的代码。 saything()方法只是回应时间()。

当我运行它时,第一次执行代码时,它正确地回应。然而,当它为第二个订单运行它时,它回显“收到的电子邮件”,所以我知道它已退出循环,然后它似乎停止处理。

当我使用xdebug跟踪执行时,我看到它仍然在循环中 - 它调用saything,调用time(),并且应该回显它(字面意思:echo time();) - 但是没有。所以time()调用正在发生,但echo()不是。它命中睡眠,然后getOrderEmail返回null,触发循环重复但不回显“sleep for ...”消息。

所以我可以在xdebug跟踪中清楚地看到它被卡在无限循环中,但没有任何东西进入stdout!为什么不?某处某处有错误吗?我试过调用flush(),但没有做任何事情。我该如何调试?另外:当它已经在循环之后执行了一行时,它怎么还能在循环中?我已经检查了进程列表,它绝对不是分叉,所以我无法想到它可以退出循环,同时仍然在循环中,并调用echo而不回显任何东西。

我知道这个问题可能是代码中的其他地方,但它太大了,不能在这里发布整个事情。关于如何解决这个问题的任何想法?

1 个答案:

答案 0 :(得分:0)

来自PHP手册:

" flush()可能无法覆盖Web服务器的缓冲方案,并且它对浏览器中的任何客户端缓冲没有影响。它也不会影响PHP的用户空间输出缓冲机制。这意味着如果使用ob_flush()和flush(),则必须同时调用ob输出缓冲区。"

您应该尝试使用ob_flush();