2012-06-03 1 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(); 
     } 
    } 

이 오류가 발생하는 아파치 서버를 자극되어 있기 때문에 30 초 최대 실행 초과되었습니다. 정말 도움이 필요합니다. 새로운 메시지를 듣고 그 결과를보기로 밀어 넣는 가장 좋은 해결책은 무엇입니까?

감사합니다.

건배.

답변

0

내가보기 엔 재 요인이 할 수있는 코드를 AJAX를 기반 인프라에이 변환 추천과 :

  • 아약스 URL마다 페이지 x 초를로드

    1. CakePHP의는 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 */ 
        } 
    } 
    

    완료되면 채널을 닫습니다.

    다른 옵션은 밀어 넣기를 실제로 사용하려는 경우 웹 소켓을 사용하는 것입니다. 수색을하거나 this tutorial을 시작하면 도움이 될 것입니다.

  • 관련 문제