PHP脚本在通过命令行运行时提供输出,但不通过浏览器

时间:2014-04-11 06:27:49

标签: php shell ubuntu command-line

当我通过命令行运行我的程序时,我的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();

    }
}

3 个答案:

答案 0 :(得分:2)

是的,我们可以:)

查看http://www.php.net/manual/en/function.flush.php - 当您需要在响应完成之前输出时,这是永久运行脚本的方法。

另外看看那里的第一个用户评论 - 它是关于用str_pad()发送4KB块,因为在达到特定数量的数据之前,浏览器往往根本不显示任何内容。

答案 1 :(得分:1)

如果脚本在while循环中运行并且永远运行,那肯定会发生。

在浏览器中运行脚本会超时,因为脚本没有完成,所以不会输出内容。

在命令行上运行脚本时,脚本将逐行执行,输出将显示

答案 2 :(得分:1)

为什么循环需要永远运行?如果它永远不会完成,它将永远不会实际向客户返回响应。

当php运行时,它会在您添加到缓冲区时在缓冲区中构建一个HTML文档,然后立即发送该页面。

如果循环在每次迭代时为页面生成内容,您可能希望在循环中经过一定数量的循环后停止它,这样您就不会向用户发送无限的数据流。

如果你正在做一些计算等事情,你应该考虑使用JavaScript,并对php脚本进行AJAX调用。