In der Socket -Programmierung von PHP wird die Funktion von Socket_Set_Block () verwendet, um den Socket auf den Blockierungsmodus einzustellen. Im Blockierungsmodus warten E/A -Operationen wie Socket_accept () oder Socket_Read ( ), bis die Daten verfügbar sind oder die Verbindung abgeschlossen ist. Dies ist besonders wichtig für Serverprogramme, die Client -Anfragen synchronisieren müssen.
Dieser Artikel kombiniert Socket_Create () und Socket_Bind (), um zu demonstrieren, wie ein Socket -Server basierend auf dem Blockierungsmodus erstellt wird.
SOCKKET_SET_BLOCK (Ressource $ Socket): bool
Diese Funktion setzt den angegebenen Socket in den Blockierungsmodus, und der Rückgabewert ist booleschen, wodurch die Einstellung erfolgreich ist.
Der Blockierungsmodus ist das Standardverhalten. Wenn Sie jedoch Socket_Set_NonBlock () angerufen haben, müssen Sie Socket_Set_Block () zur Wiederherstellung verwenden.
Im Folgenden finden Sie ein vollständiges PHP -Server -Beispiel, bei dem Funktionen wie Socket_Create () , Socket_Bind () , Socket_Listen () und Socket_accept () und explizit den Blockierungsmodus festgelegt werden.
<code> & lt;? php // TCP -Socket $ socket = socket_create (af_inet, sock_stream, Sol_tcp) erstellen; if ($ socket === false) {Die ("Socket_Create () fehlgeschlagen:". socket_strerror (socket_last_error ()). "\ n"); } // auf den Blockierungsmodus einstellen
if (! socket_set_block ($ socket)) {
Die ("kann nicht auf den Blockierungsmodus eingestellt:". Socket_Strerror (Socket_Last_error ($ Socket)). "\ n");
}
// IP und Port binden
$ host = '0.0.0.0';
$ port = 12345;
if (! socket_bind ($ socket, $ host, $ port)) {
Die ("Socket_Bind () fehlgeschlagen:". Socket_Strerror (Socket_Last_error ($ Socket)). "\ n");
}
// Hören Sie sich die Verbindung an
if (! socket_listen ($ socket, 5)) {
Die ("Socket_Listen () fehlgeschlagen:". Socket_Strerror (socket_last_error ($ socket)). "\ n");
}
echo "Der Server startet, hör in {$ host}: {$ port} ... \ n";
while (wahr) {
Echo "Warten auf die Kundenverbindung ... \ n";
$ client = socket_accept ($ socket);
if ($ client === false) {
echo "socket_accept () fehlgeschlagen:". SOCKKET_STRERROR (SOCKKET_LAST_ERROR ($ SOCKKET)). "\N";
weitermachen;
}
echo "Der Client ist verbunden,Daten lesen...\n";
// Client -Nachrichten lesen(Block, bis Daten empfangen werden)
$input = socket_read($client, 1024);
echo "Eine Nachricht erhalten: " . trim($input) . "\n";
$response = "Willkommen bei einer Verbindung zum Server!Du hast geschickt:" . trim($input);
socket_write($client, $response, strlen($response));
socket_close($client);
}
// Schließen Sie den Hauptbuchse
Socket_Close ($ Socket);
</code>
Sie können das Telnet -Tool verwenden, um eine Verbindung zum Server herzustellen:
telnet 127.0.0.1 12345
Geben Sie einen beliebigen Text ein und der Server antwortet auf das, was Sie gesendet haben.
Der Blockierungsmodus ist für die folgenden Szenarien geeignet:
Einfacher Serienservermodell
Es werden jeweils nur eine Clientverbindung verarbeitet
Dienstleistungen, die wenig Echtzeit erfordern
Bei hohen gleichzeitigen Anwendungen wird jedoch in der Regel empfohlen, den nicht blockierenden Modus in Verbindung mit Multi-Process- oder asynchronen Methoden zu verwenden.
Bei Debugging und Bereitstellung wird empfohlen, Socket -Fehlerinformationen in Kombination mit ERROR_LOG- oder Protokolldateien auszugeben, um schnell Probleme zu finden. Beispielsweise können Fehler in eine Datei geschrieben werden:
error_log("socket_error: " . socket_strerror(socket_last_error()), 3, "/var/log/php_socket_error.log");
Über Socket_Set_Block () können wir das E/A -Verhalten von Socket flexibel steuern. In einigen Fällen kann ein explizites Einstellen des Blockierungsmodus aufgrund von Standardverhaltensänderungen Ausnahmeprobleme vermeiden. Stellen Sie in Kombination mit Socket_Create () und Socket_Bind () sicher, dass die logische Reihenfolge korrekt ist, dh erstellen, dann den Hör- und Blockiermodus festlegen und dann ein stabiles Socket -Serverprogramm erstellen.
Wenn Sie es im obigen Beispiel auf dem Server bereitstellen, können Sie einen Verbindungstest an http://gitbox.net:12345 über eine Browser- oder API -Anforderung (tatsächlich gemäß Ihrer IP- und Portkonfiguration) senden.
Ich hoffe, dieser Artikel wird für Sie hilfreich sein, um die Verwendung von Socket_Set_Block () zu verstehen.