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

     2023-02-16     212

关键词:

【中文标题】将结果从 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消息队列笔记(代码片段)

目录RabbitMQ概念四大核心概念核心部分测试"HelloWorld"测试WorkQueues消息应答自动应答手动应答消息应答方法消息自动重新入队手动应答测试持久化队列持久化消息持久化不公平分发预取值消息确认开启发布确认单个确认发布... 查看详情

rabbitmq消息队列笔记(代码片段)

目录RabbitMQ概念四大核心概念核心部分测试"HelloWorld"测试WorkQueues消息应答自动应答手动应答消息应答方法消息自动重新入队手动应答测试持久化队列持久化消息持久化不公平分发预取值消息确认开启发布确认单个确认发布... 查看详情

rabbitmq的安装配置和使用及整合springboot(代码片段)

1.RabbitMQRabbitMQ是一个消息中间件:它接受并转发消息。你可以把它当做一个快递站点,当你要发送一个包裹时,你把你的包裹放到快递站,快递员最终会把你的快递送到收件人那里,按照这种逻辑RabbitMQ是一个... 查看详情

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

】从Array推送到Azure队列覆盖消息?[node.JS]【英文标题】:PushtoAzurequeueoverwritingmessagefromArray?[node.JS]【发布时间】:2021-03-2604:24:59【问题描述】:我有一个数组,其中包含一些我想发送到天蓝色队列的对象。我有一个简单的数组,... 查看详情

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

】从Laravel(NodeJS)外部推送到Laravel队列【英文标题】:PushtoLaravelqueuefromoutsideLaravel(NodeJS)【发布时间】:2017-07-1620:50:28【问题描述】:我有一个作为纯API应用程序运行的Laravel5.3安装,需要从多个不同的应用程序连接。一切正常... 查看详情

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

】EventMachine和em-websocket-从队列中读取并推送到通道【英文标题】:EventMachineandem-websocket-readingfromaqueueandpushingtoachannel【发布时间】:2012-10-3115:55:09【问题描述】:我正在使用eventmachine读取HornetQ主题,推送到由EMwebsocket连接订阅的... 查看详情

将数据从 rest api 推送到 sql 数据库的最佳方法是啥?

...我可以使用它从第二个获取更多数据。我想将第二个api的结果推送到我在phpMyAdmin中的sq 查看详情

如何配置 Azure 服务总线队列以将消息推送到客户端而不进行轮询?

】如何配置Azure服务总线队列以将消息推送到客户端而不进行轮询?【英文标题】:HowtoconfigureAzureServiceBusQueuestopushmessagestoclientswithoutpolling?【发布时间】:2019-04-1708:52:44【问题描述】:我是Azure服务总线的新手,我发现我需要不... 查看详情

PHP错误将作业推送到延迟队列中,而使用--tries = 0

】PHP错误将作业推送到延迟队列中,而使用--tries=0【英文标题】:PHPerrorpushesJobinDelayedqueuewhile--tries=0isused【发布时间】:2017-10-3121:58:09【问题描述】:我正在使用主管在我的lumen5.2设置上运行作业。我的主管conf。看起来像这样[pr... 查看详情

rabbitmq死信队列dlx应用

...有被消费,则会把消息推送到DLX_QUEUE死信队列中。所以在RabbitMQ3.5.8版本之后,可以利用官方的rabbitmq-delayed-message-exchange插件来实现消息的延迟发送,可以避免上面所说的问题。RabbitMQ实现消息延迟推送 查看详情

为啥不将数据库查询中的移动结果推送到变量中?

】为啥不将数据库查询中的移动结果推送到变量中?【英文标题】:Whydoesn\'tpushmoveresultsfromDBqueryintovariable?为什么不将数据库查询中的移动结果推送到变量中?【发布时间】:2017-08-1816:55:33【问题描述】:意图在我的路由中建立... 查看详情

将数据从多个输入推送到状态数组

】将数据从多个输入推送到状态数组【英文标题】:Pushdatafrommultipleinputstostatearray【发布时间】:2017-09-1205:18:41【问题描述】:我的程序生成的输入很少,我尝试将数据推送到我的状态数组exportdefaultclassTransmittersTableextendsComponentc... 查看详情

存储 for 循环结果以推送到 HTML

】存储for循环结果以推送到HTML【英文标题】:StoringforloopresulttopushintoHTML【发布时间】:2019-03-1209:20:49【问题描述】:编辑:已解决。在这里乐于助人的人帮助我解决了这个问题后,我意识到这个问题与我的getElementsByClassName选择... 查看详情

从 Databricks 将日志推送到 Log Analytics

】从Databricks将日志推送到LogAnalytics【英文标题】:PushinglogstoLogAnalyticsfromDatabricks【发布时间】:2019-04-0219:55:13【问题描述】:我在Databricks集群中收集了日志,但我需要推送到Azure中的LogAnalytics以进行公共日志收集什么都没试过... 查看详情

将导航从 UITabbarController 推送到 UIViewController

】将导航从UITabbarController推送到UIViewController【英文标题】:PushNavigatefromUITabbarControllertoUIViewController【发布时间】:2013-10-2214:49:51【问题描述】:我正在使用UITabbarController,它有三个孩子UIViewController,分别命名为FirstViewController... 查看详情

如何将数据从 HAWQ 推送到 GREENPLUM?

】如何将数据从HAWQ推送到GREENPLUM?【英文标题】:HowtopushdatafromHAWQintoGREENPLUM?【发布时间】:2014-06-0910:20:13【问题描述】:我有一个不稳定的客户,他想在经过一些预处理后将数据从HAWQ推送到GREENPLUM。有没有办法做到这一点?... 查看详情

如何将数据从文件c ++推送到向量

】如何将数据从文件c++推送到向量【英文标题】:Howtopushdatatoavectorfromafilec++【发布时间】:2020-08-1514:20:24【问题描述】:我在“.csv”文件中有一些数据表。我想将这些数据从该文件推送到向量。我尝试了push_back。但它对我没有... 查看详情

SpringAMQP RabbitMQ如何在没有Exchange的情况下直接发送到队列

】SpringAMQPRabbitMQ如何在没有Exchange的情况下直接发送到队列【英文标题】:SpringAMQPRabbitMQhowtosenddirectlytoQueuewithoutExchange【发布时间】:2017-09-1012:14:57【问题描述】:我正在使用带有Rabbit模板的SpringAMQP。如何将消息直接发送到省略... 查看详情