2012-06-03 70 views
2

我正在開發一個系統,該前端包含基於CakePHP框架和基於Java的後端的前端。這兩個生態系統之間的通信是通過從CakePHP控制器向RabbitMQ代理髮送JSON消息來完成的。當消息被使用時,結果將被髮送回前端。 現在,我需要消費該消息並將控制器的結果推送到用戶瀏覽器。對於PHP的一部分,我用phpamqplib,但它需要有新郵件時聽一個無限循環:將結果從RabbitMQ隊列推送到CakePHP前端

 $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秒的最長執行已超過。 我真的需要幫助。聽取新消息並將結果推送到視圖中的最佳解決方案是什麼?

謝謝

乾杯。

回答

0

我強烈推薦這個轉換到基於AJAX的基礎設施,並重新因子代碼做到這一點:

  1. CakePHP可以一個AJAX調用加載頁面每x秒
  2. 的AJAX網址獲得從隊列中剩餘的元素,並將它們輸出

您的代碼看起來不完整的,所以我不能完全重構它,但你可以改變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 */ 
    } 
} 

並在完成時關閉通道。

如果您真的想使用push,您的其他選擇是使用web套接字。做一個搜索,或this tutorial可能會幫助你開始。

相關問題