2014-02-14 5 views
9

Ich habe PHP-Websockets mit Ratchet getestet, und alles funktionierte perfekt, bis ZMQSocket :: send plötzlich ohne ersichtlichen Grund zu hängen begann.ZMQ hängend - ZMQSocket :: senden

$context = new ZMQContext(); 
$socket = $context->getSocket(ZMQ::SOCKET_PUSH, 'notify'); 
$res = $socket->send(json_encode($entryData)); //Hangs here. 

Bitte beachte, dass ich ZMQ :: MODE_NOBLOCK verwenden kann, und das wird die hängende zu stoppen, aber es das Problem nicht beheben. Der Client erhält immer noch nichts. Ich habe auch meine Box neu gestartet, wodurch das Problem nicht behoben wird.

  • Ubuntu 12.04.1 LTS
  • PHP Version 5.3.10 - FPM/(& CLI für den Push-Server)
  • ZMQ Erweiterung Version 1.1.2
  • libzmq Version 2.1.11

Update: schien ich meinen Code, um das Problem behoben haben durch Änderung:

$context = new ZMQContext(); 
$socket = $context->getSocket(ZMQ::SOCKET_PUSH, 'notify'); 
$socket->setSockOpt(ZMQ::SOCKOPT_LINGER, 30); //ADDED 
$socket->connect("tcp://localhost:5557"); //ADDED 
$res = $socket->send(json_encode($entryData)); 

Jetzt ist die Frage, warum hängt es in erster Linie, wenn es gut für etwa eine Stunde oder zwei funktionierte? Gibt es etwas, auf das ich achten muss?

+0

Zusätzlich zu meiner Antwort scheinen Sie eine ziemlich alte 0mq-Version zu verwenden. – JSON

+0

können Sie den Code auch für die andere Seite anzeigen? – flup

+0

Mögliches Duplikat: http://stackoverflow.com/questions/9040208/zeromq-push-socket-causes-client-to-not-terminate-when-no-process-is-listening – flup

Antwort

1

Zunächst bin ich mir nicht sicher, ob das eine gültige Antwort ist, aber ich spiele jetzt seit ein paar Tagen mit php-zmq und habe selbst einige Probleme. Ihre Frage führte mich zu einer Epiphanie, die wahrscheinlich meine Probleme lösen wird, und ich vermute, dass Ihre verwandt sein könnten.

Mit meinem letzten php-zmq-Problem habe ich die Round-Trip-Zeit zwischen meinem Laptop und meinem VPS mit der Auslöse-Methode in der zguide getestet. Alles, was ich getan habe, war eine Kopie des Skripts tripping.php auf meinem Laptop zu ändern, indem ich die URL zu meinem VPS hinzufügte, so dass es sich mit demselben Skript verbinden würde, das remote auf dem VPS lief. Ich habe den synchronen Abschnitt in einer langen Schleife ausgeführt und den asynchronen Abschnitt mit der gleichen for-Schleife.

Ich bemerkte, dass nur ein "Client" in der Lage war, während der synchronen Schleife zu verbinden, ob ich versuchte, mehrere Clients von meinem Laptop oder einen von meinem Laptop und einen von einem anderen Server zu verbinden man konnte sich zu einer bestimmten Zeit verbinden. Ich bemerkte auch im asynchronen Abschnitt, dass meine Nachrichten pro Sekunde von ungefähr 100 Nachrichten pro Sekunde auf ungefähr 2 Sekunden pro Nachricht fielen, sobald Nachrichten an meinem Laptop eintrafen. Mein Laptop kann problemlos 10+ HTTP-Anfragen pro Sekunde mit cURL durchführen, also sind 2 Sekunden pro Nachricht nicht netzwerkbezogen.

Ich bin seit 6 Jahren ein PHP-Erweiterung Entwickler und PHP-Core-Hacker und ich habe Probleme wie diese zuvor. Ich bin mir ziemlich sicher, dass es aus einem Parallelitätsproblem zwischen PHP-Benutzerbereich und den internen Zeromq-Threads stammt. Mit anderen Worten, die Zeromq IO-Threads senden Befehle an den Haupt-Zeromq-Thread, aber der Zeromq-Hauptthread wird innerhalb von PHP über die Zend-Engine ausgeführt und ist an das gleiche grundlegende Verhalten wie andere PHP-Methoden/-Funktionen gebunden. Ich bin mir noch nicht sicher, ob wir genau das gleiche Verhalten in PHP-zmq erwarten können, das wir in czmq oder anderen zeromq Bindings haben können - PHP ist von Natur aus sehr synchron und zeromq ist asynchron. Meine Erfahrung war größtenteils positiv, wenn in php-zmq nicht-blockierende Muster verwendet wurden.

Edit: um das mögliche Problem zu klären - Zeromq behandelt alle IO asynchron in separaten Threads. Blockierungsverhalten (wie beispielsweise req/rep) wird durch Nachrichtenaustausch zwischen den IO-Threads und dem Hauptthread anstelle der tatsächlichen Blockierung/synchronen IO erzeugt. Es ist die Nachrichtenübermittlung und Synchronisierung zwischen Threads, von denen ich denke, dass sie in PHP falsch funktionieren. Die "blockierungsfreien" Zeromq-Muster scheinen gut zu funktionieren.Die Blockierungsmuster funktionieren, zeigen jedoch in diesen Fällen ein merkwürdiges Verhalten.

Verwandte Themen