Aktueller Standort: Startseite> Neueste Artikel> Richtige Verwendung von Socket_Set_Block im PHP-Dienst mit mehreren Threadede/Multi-Process

Richtige Verwendung von Socket_Set_Block im PHP-Dienst mit mehreren Threadede/Multi-Process

gitbox 2025-05-28

Beim Erstellen von Hochleistungs-PHP-Server-Seiten-Diensten ist es häufig erforderlich, mit mehreren Thread- oder Multi-Process-Modellen zu verwenden, um gleichzeitige Verbindungen zu verarbeiten. Socket -Programmierung ist ein wichtiges Mittel, um dieses Ziel zu erreichen. Beim Umgang mit Sockelverbindungen werden jedoch die Einstellungen von Blockierung und Nichtblockierung zu zentral. Die von PHP bereitgestellten Funktionen von Socket_Set_Block () und Socket_Set_NonBlock () können verwendet werden, um dieses Verhalten zu steuern. Wenn Sie sie vernünftigerweise verwenden, können Sie verhindern, dass Fäden oder Prozesse aufgrund von E/A -Blockieren, Verbesserung der Servicestabilität und Reaktionsfähigkeit stecken bleiben.

In diesem Artikel wird vorgestellt, wie die Funktion socket_set_block () korrekt in einem Multi-Thread- oder Multi-Process-PHP-Dienst verwendet wird, um Blockierungsprobleme zu vermeiden und seine Anwendungsszenarien und Best Practices in Kombination mit bestimmten Codebeispielen zu erläutern.

1. Der Unterschied zwischen Blockierung und nicht blockierenden Steckdosen

Standardmäßig blockiert Socket. Wenn Sie eine Funktion wie Socket_Read () oder Socket_accept () in einen blockierenden Socket aufrufen. Wenn keine Daten gelesen werden oder keine neue Verbindung vorliegt, wartet der Anruf, bis die Bedingung erfüllt ist.

Dies ist kein Problem im Einzel-Thread-Modell, aber in einer Umgebung mit mehreren Threaden oder Multi-Process kann dies zu einer Verschwendung von Ressourcen führen, wenn ein Kinderfaden oder ein Kinderprozess keine Zeitressourcen veröffentlichen kann, oder sogar das Programm ist tot.

Nicht blockierende Steckdosen werden nicht warten, sie kehren sofort zurück, und wenn derzeit keine Daten vorhanden sind, wird ein Fehler zurückgegeben (normalerweise Eagain oder EWOUDBLOCK ). Sie können den Fehlercode erhalten und ihn über Socket_Last_error () verarbeiten.

2. Das Zeitpunkt der korrekten Verwendung von Socket_Set_Block ()

Socket_Set_Block () wird verwendet, um den Socket auf den Blockierungsmodus einzustellen, während sein inverser Funktion Socket_Set_Nonblock () zum Einstellen des Nicht-Blocking-Modus verwendet wird.

Bei Multithreading oder Multiprocessing sind die empfohlenen Strategien:

  • Im Haupt-Thread- oder übergeordneten Vorgang nimmt der Hörbuchse einen nicht blockierenden Modus an, um zu vermeiden, dass die Blockierung akzeptiert wird.

  • In einem untergeordneten Thread- oder untergeordneten Prozess kann eine einzelne Kundenverbindung auf den Blockierungsmodus umgestellt werden, um die Verarbeitung einer vollständigen Anforderungslogik zu erleichtern.

  • In Ereignisschleifen oder Modi mit Select () und Stream_Select () wird empfohlen, den Nicht-Blocking-Modus zu verwalten.

3. Beispiel: Anwendung im Multi-Process-PHP-Dienst

Hier ist ein Beispiel für einen PHP-Dienst, der auf einem Multi-Process-Modell basiert, das zeigt, wie man socket_set_block () korrekt verwendet, um Blockierungsprobleme zu vermeiden:

<Code> & lt;? php set_time_limit (0);

$ host = '0.0.0.0';
$ port = 9000;

// Socket erstellen
$ server = socket_create (af_inet, sock_stream, sol_tcp);
socket_bind ($ server, $ host, $ port);
socket_listen ($ server);
socket_set_nonblock ($ server); // Stellen Sie den Hauptbuchsen in den Nicht-Blocking-Modus ein

Echo "Server mit {$ host}: {$ port} \ n";

while (wahr) {
$ client = @socket_accept ($ server);

 if ($client === false) {
    usleep(100000); // vermeidenCPULeerlauf
    continue;
}

$pid = pcntl_fork();

if ($pid == -1) {
    die("Fork failed\n");
} elseif ($pid == 0) {
    // Subprozess
    socket_close($server); // Subprozess不需要监听Socket

    socket_set_block($client); // Einrichten des KundenSocketIm Blockierungsmodus

    $input = socket_read($client, 1024);
    $output = strtoupper(trim($input));
    socket_write($client, "You said: $output\n");

    socket_close($client);
    exit(0);
} else {
    // Elternprozess
    socket_close($client); // Elternprozess不处理客户端Socket
    pcntl_wait($status, WNOHANG); // vermeiden僵尸进程
}

}
?>
</code>

In diesem Beispiel verwendet der Hauptprozess einen nicht blockierenden Socket, um auf die Verbindung zu warten, wodurch Socket_accept () Blockierung vermieden wird. Während des untergeordneten Prozesss wechseln wir den Socket, der mit dem Kunden wieder in den Blockierungsmodus interagiert, was die sequentielle Verarbeitung von Ein- und Ausgabe ermöglicht, und die Logik ist einfacher und zuverlässiger.

4. Zusätzliche Vorschläge und Vorsichtsmaßnahmen

  1. Stellen Sie Block und Nonblock nicht so ein, dass sie gleichzeitig eine Steckdose einschalten , da dies zu einer Zustandsverwirrung führen kann. Es ist einfacher, Prozesse oder Threads zu verwalten, die Verantwortlichkeiten definieren.

  2. Das Anhören mehrerer nicht blockierender Steckdosen mit Select () ist eine effizientere Möglichkeit, ein ereignisorientiertes Modell anzupassen.

  3. Die Serienfunktionen von PHP von Stream_Socket_* bieten in einigen Szenarien eine freundlichere Kapselung und können auch mit Stream_Set_Blocking () verwendet werden, um das Blockierungsverhalten zu steuern.

  4. Nicht in Panik, wenn Fehlercodes wie "Ressource vorübergehend nicht verfügbar" erscheinen. Dies ist eines der Eigenschaften nicht blockierender Steckdosen und muss durch logische Wiederholung oder Ereignisabfragen aufgelöst werden.

5. Zusammenfassung

Die rationale Verwendung von Socket_Set_Block () und Socket_Set_Nonblock () ist der Schlüssel zum Erstellen effizienter PHP -Netzwerkdienste. Insbesondere in einer Umgebung mit Multi-Thread- oder Mehrprozess können die Klärung der Verantwortlichkeiten und das Festlegen geeigneter Blockierungsmodi nicht nur Faden-/Prozessblockierungsprobleme vermeiden, sondern auch die Geschwindigkeit und Stabilität der Service-Reaktionsdienste verbessern.

In den oben genannten Beispielen und Strategien glaube ich, dass Sie diese Sockelfunktionen in tatsächlichen Projekten besser nutzen können, um einen robusten PHP -Hintergrunddienst zu erstellen. Wenn Sie eine private GIT-Dienstleistung oder eine Echtzeit-Kommunikationsplattform wie <Code> gitbox.net </code> erstellen, ist eine präzise Socket-Steuerung ein unverzichtbarer Teil.