2012-05-25 3 views
1

J'ai un problème avec mon script PHP communiquant via ZeroMQ avec un démon PHP fonctionnant dans le backend et attendant des messages. Si le démon est en panne, le php demandeur attend un temps interminable. Si je recharge la page firefox se termine par une boucle sans fin et je dois redémarrer apache2 pour tuer la requête en cours. Surtout dans le développement quand le démon n'est pas fini, c'est vraiment énervant. Est-ce que quelqu'un sait comment je peux définir un délai, ou simplement dire, sauter la requête quand le démon n'est pas joignable (puis envoyer un message à admin, le serveur est en panne et renvoyer une erreur)?ZeroMQ PHP Timeout

J'ai essayé quelque chose comme ceci:

$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)); 

2ème question, j'utilise PHP-daemon de shaneharter, parfois, quand le démon ne démarre pas correctement en raison d'erreurs ou je l'ai fermé avec CRTL + C zeromq encore réserve l'adresse, quand je redémarre les démons, il lance une exception, cette adresse est déjà utilisée. Puis-je facilement détruire toutes les connexions ZeroMQ?

Répondre

1

Vous n'avez pas besoin d'interroger uniquement pour envoyer un message simple. Je pense qu'un socket PUSH vous servira mieux. Définissez une valeur raisonnable et essayez d'envoyer un message à la contrepartie de socket PULL, qu'elle soit en écoute ou non. Savez-vous comment définir le délai d'attente avec cet exemple?

$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

J'ai essayé SOCKOPT_SNDTIMEO mais cela ne fonctionne pas si le serveur est éteint. – stmn