2

CakePHP フレームワークで構築されたフロントエンドと Java ベースのバックエンドで構成されるシステムを開発しています。この 2 つのエコシステム間の通信は、JSON メッセージを CakePHP コントローラーから RabbitMQ ブローカーに送信することによって実行されます。メッセージが消費されると、結果がフロントエンドに送り返されます。ここで、メッセージを消費し、結果をコントローラーからユーザーのブラウザーにプッシュする必要があります。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();
        }
    }

私のコントローラーでは、最大実行時間が 30 秒を超えているため、これにより Apache サーバーがエラーをスローします。ここで本当に助けが必要です。新しいメッセージをリッスンし、結果をビューにプッシュするための最良のソリューションは何ですか?

ありがとう

乾杯。

4

1 に答える 1

0

これを AJAX ベースのインフラストラクチャに変換し、コードをリファクタリングしてこれを行うことを強くお勧めします。

  1. CakePHP は x 秒ごとにページをロードするために AJAX 呼び出しを行います
  2. 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 */
    }
}

完了したらチャネルを閉じます。

本当にプッシュを使用したい場合の他のオプションは、Web ソケットを使用することです。検索を行うか、このチュートリアルが開始に役立つ場合があります。

于 2012-06-26T20:56:21.940 に答える