将结果从 RabbitMQ 队列推送到 CakePHP 前端

Posted

技术标签:

【中文标题】将结果从 RabbitMQ 队列推送到 CakePHP 前端【英文标题】:Pushing results from RabbitMQ queue to CakePHP frontend 【发布时间】:2012-06-03 15:05:38 【问题描述】:

我正在开发一个系统,该系统由内置于 Cakephp 框架的前端和基于 Java 的后端组成。这两个生态系统之间的通信是通过从 CakePHP 控制器向 RabbitMQ 代理发送 JSON 消息来实现的。当消息被消费时,结果被发送回前端。 现在,我需要使用消息并将结果从控制器推送到用户浏览器。对于 PHP 部分,我使用的是 phpamqplib,但在侦听新消息时它需要有一个无限循环:

     $channel->basic_consume('AMQP.COMMAND.OUTPUT.QUEUE', 
            'consumer', 
            false, 
            false, 
            false, 
            false, 
            array($this, 'processMessage'));


    function shutdown($ch, $conn)
        $ch->close();
        $conn->close();
    
    register_shutdown_function('shutdown', $channel, $conn);

    while (count($channel->callbacks)) 
        $read   = array($conn->getSocket()); // add here other sockets that you need to attend
        $write  = null;
        $except = null;
        if (false === ($num_changed_streams = stream_select($read, $write, $except, 60))) 
            /* Error handling */
         elseif ($num_changed_streams > 0) 
            $channel->wait();
        
    

在我的控制器中,这会导致 Apache 服务器抛出错误,因为超过了 30 秒的最大执行时间。 我在这里真的需要帮助。侦听新消息然后将结果推送到视图的最佳解决方案是什么?

谢谢

干杯。

【问题讨论】:

【参考方案1】:

我强烈建议将其转换为基于 AJAX 的基础架构,并重构您的代码以执行此操作:

    CakePHP 每隔 x 秒进行一次 AJAX 调用以加载页面 AJAX URL 从队列中获取剩余元素,并输出它们

您的代码看起来不完整,所以我无法完全重构它,但您可以更改 AJAX URL 以执行以下操作:

if (count($channel->callbacks)) 
    $read   = array($conn->getSocket()); // add here other sockets that you need to attend
    $write  = null;
    $except = null;
    if (false === ($num_changed_streams = stream_select($read, $write, $except, 60))) 
        /* Error handling */
    

完成后关闭频道。

如果您真的想使用推送,您的另一个选择是使用网络套接字。进行搜索,或者this tutorial 可能会帮助您入门。

【讨论】:

以上是关于将结果从 RabbitMQ 队列推送到 CakePHP 前端的主要内容,如果未能解决你的问题,请参考以下文章

从 Array 推送到 Azure 队列覆盖消息?[node.JS]

从 Laravel(NodeJS)外部推送到 Laravel 队列

使用rabbitmq手动确认消息的,定时获取队列消息实现

使用 Docker 部署 canal,并将消息推送到 RabbitMQ

过期消息传递序列 RabbitMQ

EventMachine 和 em-websocket - 从队列中读取并推送到通道