2012-04-12 7 views
0

Ich schreibe PHP-Skript, das über lokale Unix-Sockets mit dem Server kommuniziert. 1) verbinden 2) Jetzt msg mit socket_write() (90% der Zeit mit niedriger Größe Blöcke, 10% groß) 3) erhalten die Antwort 4) in der Nähe Verbindungphp socket_write über blockierende und nicht blockierende Sockets

schicken, ich einfach socket_write haben () Implementierung wie vorgeschlagen bei comments from php manual "jean at briskula dot si 03-Feb-2011 03:00"

Scheint seine Arbeit gut auf Blockierungsmodus, aber ich möchte Timeouts für socket_write implementieren, daher denke ich (muss) zu verwenden nicht blockierender Modus, wenn socket_write() aufgerufen wird.

Gibt es irgendwelche Vorteile des blockierenden Modus gegenüber dem nicht blockierenden? Gibt es einen Grund, Timeouts zu realisieren? Wie man sie richtig realisiert? Irgendwelche Beispiele?

Versucht, auf einen while-Kreis zu schreiben, aber bekam === FALSCH, vielleicht muss socket_select() jedes Mal vor dem Aufruf von socket_write()?

ps. Diese Frage gilt auch für Socket_read() beim Lesen der Antwort vom Server

Antwort

1

Für ein PHP (Web-konfrontiert) Skript Senden von Daten an/Empfangen von Daten aus einem Backend-System über Sockets ohne die Möglichkeit für andere Verarbeitung in der Zwischenzeit (das ist im Grunde, warum Sie überhaupt nicht-blockierende Modus verwenden möchten), es hat keinen Sinn, die Komplikationen zu behandeln, die nicht-blockierende Modus verursacht.

Also, bleiben Sie mit blockierenden Modus.

+0

danke, aber was kann ich mit Situationen tun, die auftreten können, während Anfragen aus irgendeinem Grund zu lange (unendlich) gehen und dies wird Thread von C++ Server blockieren? Ich fühle, dass irgendwo Zeitüberschreitungen hinzugefügt werden müssen ... vielleicht auf C++ Seite, aber wie? SO_LINGER? – abrahab

+1

Wenn Ihre Sorge die C++ - Seite ist, verwenden Sie dort nicht blockierende Sockets, um Daten abzufragen, indem Sie eine Form von Timeout implementieren. Diese Antwort bezieht sich nur auf die PHP-Seite der Gleichung. Informationen zur Verwendung von nicht blockierenden E/A finden Sie unter http://stackoverflow.com/questions/6715736/using-select-for-non-blocking-socket. – modelnine

+0

danke, lassen Sie es immer noch so wie es ist, denn Lösung mit select() ist nicht nett und muss alle Threads Logik am vorhandenen Programm neu schreiben. vielleicht wird bei der Funktion etwas über ganze Socket Timeouts gelesen. Meiner Meinung nach ist SO_LINGER dafür verantwortlich. und thread mit freezed recv oder send wird nie für immer blocken. – abrahab