2014-06-09 3 views
0

현재 ZMQ를 사용하여 메시지를 보내고받는 간단한 코드를 시도하고 있습니다. 내가 콘솔에서이 스크립트를 실행하면 코드는ZMQ를 통해 메시지가 전송되지 않음

/* Create new queue object, there needs to be a server at the other end */ 
    $queue = new ZMQSocket(new ZMQContext(), ZMQ::SOCKET_REQ); 
    $queue->connect("tcp://127.0.0.1:5555"); 

/* Assign socket 1 to the queue, send and receive */ 
    $retries = 5; 
    $sending = true; 

/* Start a loop */ 
    do { 
    try { 
    /* Try to send/receive */ 
    if ($sending) { 
     echo "Sending message\n"; 
     $queue->send("This is a message", ZMQ::MODE_NOBLOCK); 
     $sending = false; 
    } else { 
     echo "Got response: " . $queue->recv(ZMQ::MODE_NOBLOCK) . "\n"; 
     echo 'Complete'; 
     break; 
    } 
    } catch (ZMQSocketException $e) { 
    /* EAGAIN means that the operation would have blocked, retry */ 
    if ($e->getCode() === ZMQ::ERR_EAGAIN) { 
     echo " - Got EAGAIN, retrying ($retries)\n"; 
    } else { 
     die(" - Error: " . $e->getMessage()); 
    } 
    } 
    /* Sleep a bit between operations */ 
    usleep(5); 
    } while (--$retries); 

다음과 같다, 내 출력은 내가 아직 거기에 던져 오류가 없지만, 비록 내 메시지가 실제로 전송되지 있다고 생각

Sending message 
Got response: 
Complete 

입니다. 또한 netstat 명령을 실행했지만 포트 5555에서 수신 대기하는 프로세스를 찾지 못했습니다. 이상적으로 하나 (현재) 여야합니다. 그러나 연결을 만드는 동안 예외가 발생하지 않습니다. 내가 누락 된 것이 있습니까?

답변

0

프로세스가 포트 5555에서 수신 대기 중이라고 말하면 서버가 가동되지 않고 있음을 의미합니다. 서버가 없어도 클라이언트가 오류를 던지지는 않을 것이고, 서버를 설정하고 서버가 온라인 상태가 될 때까지 기다릴 것입니다 (적어도 여기서는 특정 설정으로).

이 경우 비 차단 모드를 사용 중이므로 루프를 통해 첫 번째 전달 메시지를 보냅니다 (왜 루프에서 메시지를 보내고 있습니까?)하지만 ' 서버가 없기 때문에 실제로 아무것도 보내지 않습니다. 그런 다음 루프를 통해 두 번째 패스를 수신하려고 시도하지만 소켓이 수신 준비가되지 않았기 때문에 예외가 발생하지 않고 자동으로 실패하는 것처럼 보입니다. 예외가 발생하지 않으므로 break 문에 도달하고 루프를 종료하면 완료됩니다.

첫 번째 사항은 먼저 루프 앞에 send 호출이 발생해야한다는 것입니다.이 작업은 한 번만 수행하려는 것입니다.

그런 다음 recv 일 때 결과를 변수에 저장하고 공터 테스트를하십시오. try/catch 코드를 그대로 둡니다. 그 결과는 다음과 같이해야합니다 : 난 아직도 실제 문제가 생각이 그것을 합리적으로 좀 더 행동하게 클라이언트 코드에 약간의 수정을 염두에 두어야 ...

/* Create new queue object, there needs to be a server at the other end */ 
$queue = new ZMQSocket(new ZMQContext(), ZMQ::SOCKET_REQ); 
$queue->connect("tcp://127.0.0.1:5555"); 

/* Assign socket 1 to the queue, send and receive */ 
$retries = 5; 
echo "Sending message\n"; 
$queue->send("This is a message", ZMQ::MODE_NOBLOCK); 

/* Start a loop */ 
do { 
    try { 
     /* Try to receive */ 
     $response = $queue->recv(ZMQ::MODE_NOBLOCK); 
     if (!empty($response)) { 
      echo "Got response: " . $response . "\n"; 
      echo 'Complete'; 
      break; 
     } 
     else { 
      echo "we probably haven't even sent the original request yet, retrying ($retries)\n"; 
     } 
    } 
    catch (ZMQSocketException $e) { 
     /* EAGAIN means that the operation would have blocked, retry */ 
     if ($e->getCode() === ZMQ::ERR_EAGAIN) { 
      echo " - Got EAGAIN, retrying ($retries)\n"; 
     } else { 
      die(" - Error: " . $e->getMessage()); 
     } 
    } 
    /* Sleep a bit between operations */ 
    usleep(5); 
} while (--$retries); 

echo "END OF LINE"; 

서버의 ISN 그 달리지 마.

+0

감사합니다. 나는 이것을 점검 할 것이다. 사실이 코드는 php.net 문서 사이트 –

+0

에서 바로 고른 것입니다. 또한 나는 rabbitmq와 같이 zmq 서버를 시작해야한다는 안내를 발견하지 못했습니다. ZMQ 서버를 시작하는 방법을 보여주는 가이드를 알려주십시오. –

+0

그럼 ...이 스크립트가 실행중인 유일한 스크립트라고 말하는 것입니까? 내가 "서버"라고 말할 때, 나는 "당신이 당신의 메시지를 보내고 싶어하는 다른 스크립트"라고 말합니다. 보내려는 ZMQ를 실행하는 다른 프로세스가 없으면 응답을 보내거나받을 수 없습니다. – Jason

0

서버 코드를 추가하십시오. 당신은 클라이언트 코드를 보여주고 있습니다. 문제가 서버에있는 것 같고 서버가 netstat에 표시되지 않는다고 말하면 문제가있을 것입니다.

관련 문제