我的一个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而不回显任何东西。
我知道这个问题可能是代码中的其他地方,但它太大了,不能在这里发布整个事情。关于如何解决这个问题的任何想法?
答案 0 :(得分:0)
来自PHP手册:
" flush()可能无法覆盖Web服务器的缓冲方案,并且它对浏览器中的任何客户端缓冲没有影响。它也不会影响PHP的用户空间输出缓冲机制。这意味着如果使用ob_flush()和flush(),则必须同时调用ob输出缓冲区。"
您应该尝试使用ob_flush();