2012-05-25 74 views
1

我的PHP腳本通過ZeroMQ與在後端運行的PHP守護進程進行通信並等待消息時出現問題。如果守護進程可能關閉,請求的php等待無盡的時間。如果我重新加載頁面Firefox結束無限循環,我必須重新啓動Apache2來終止運行請求。特別是在守護進程沒有完成的時候,這真的很煩人。有人知道我可以如何設置超時時間,或者只是說,在守護進程不可訪問時跳過發送請求(然後向管理員發送消息,服務器關閉併發送錯誤)?ZeroMQ PHP超時

我想是這樣的:

$context = new ZMQContext(1); 
$req = new ZMQSocket($context, ZMQ::SOCKET_REQ); 

$req->connect("tcp://localhost:5557"); 

$read = $write = array(); 

// Poll socket for a reply, with timeout 
$poll = new ZMQPoll(); 
$poll->add($req, ZMQ::POLL_OUT); 
$events = $poll->poll($read, $write, 3000); 
     $errors = $poll->getLastErrors(); 

if($errors) 
    echo "No connection"; 
else 
    echo "connection"; 

... $data = .... 
$req->send(json_encode($data)); 

第二個問題,我用PHP-守護程序shaneharter,有時當後臺程序沒有啓動,因爲錯誤的正確或我關閉它與CRTL + C zeromq仍保留地址,當我重新啓動守護程序時會引發異常,此地址已被使用。 我可以輕鬆銷燬所有ZeroMQ連接嗎?

回答

1

您不需要輪詢發送簡單的消息。我認爲一個PUSH插座將爲您提供更好的服務。設置一個合理的逗留值,這將嘗試向PULL套接字對方發送消息,無論是否正在偵聽。

$context = new ZMQContext(); 
$socket = new ZMQSocket($context, ZMQ::SOCKET_PUSH); 
$socket->setSockOpt(ZMQ::SOCKOPT_LINGER, 2000); 
$socket->connect("tcp://localhost:5557"); 
$socket->send($data); 
+0

你知道如何設置超時這個例子嗎?我嘗試了SOCKOPT_SNDTIMEO,但如果服務器關閉,它不起作用。 – stmn