当我通过命令行运行我的程序时,我的PHP脚本工作正常并正确输出。
但是当我通过我的浏览器运行它,然后它处理正常,但我打印的输出 - 没有显示。
(注意:我的脚本在while循环中运行,它将永远运行)
代码 - 我正在编写类文件的一部分
public function call($n) {
global $argv;
$this->response = null;
$this->corr_id = uniqid();
$msgBody = 'test msg';
//Create queue
$this->createQueue($queueName);
$msg = new AMQPMessage(
(string) $msg_body,
array('correlation_id' => $this->corr_id,
'reply_to' => $this->callback_queue,
'priority' => 2)
);
$this->channel->basic_publish($msg, '', $queueName);
while(!$this->response) {
$this->channel->wait();
}
return $this->response;
}
$response = call();
createQueue()函数在另一个类
中function createQueue($queueName='')
{
$exchange = 'router';
$queue = 'msgs';
$consumer_tag = 'consumer';
$connection = new AMQPConnection(HOST, PORT, USER, PASS, VHOST);
$channel = $connection->channel();
$channel->queue_declare($queueName, false, false, false, false);
echo " [x] Awaiting for message\n";
$callback = function($req) {
$n = $req->body;
echo "$n\n";
$msg = new AMQPMessage(
'msg',
array('correlation_id' => $req->get('correlation_id'))
);
$req->delivery_info['channel']->basic_publish(
$msg, '', $req->get('reply_to'));
$req->delivery_info['channel']->basic_ack(
$req->delivery_info['delivery_tag']);
};
$channel->basic_qos(null, 1, null);
$channel->basic_consume($queueName, '', false, false, false, false, $callback);
while(count($channel->callbacks)) {
$channel->wait();
}
}
答案 0 :(得分:2)
是的,我们可以:)
查看http://www.php.net/manual/en/function.flush.php - 当您需要在响应完成之前输出时,这是永久运行脚本的方法。
另外看看那里的第一个用户评论 - 它是关于用str_pad()
发送4KB块,因为在达到特定数量的数据之前,浏览器往往根本不显示任何内容。
答案 1 :(得分:1)
如果脚本在while循环中运行并且永远运行,那肯定会发生。
在浏览器中运行脚本会超时,因为脚本没有完成,所以不会输出内容。
在命令行上运行脚本时,脚本将逐行执行,输出将显示
答案 2 :(得分:1)
为什么循环需要永远运行?如果它永远不会完成,它将永远不会实际向客户返回响应。
当php运行时,它会在您添加到缓冲区时在缓冲区中构建一个HTML文档,然后立即发送该页面。
如果循环在每次迭代时为页面生成内容,您可能希望在循环中经过一定数量的循环后停止它,这样您就不会向用户发送无限的数据流。
如果你正在做一些计算等事情,你应该考虑使用JavaScript,并对php脚本进行AJAX调用。