Aktueller Standort: Startseite> Neueste Artikel> So kombinieren Sie Socket_Create, Socket_Bind und Socket_Set_Block

So kombinieren Sie Socket_Create, Socket_Bind und Socket_Set_Block

gitbox 2025-05-28

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.

1. Einführung in Socket_Set_Block

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.

2. Vollständiges Beispiel für die Implementierung der Verbindungen der Blockiermodus

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>

3. Client -Testmethode

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.

4. Praktische Anwendungsszenarien

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.

5. Tipps

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

6. Zusammenfassung

Ü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.