In PHP ist die Socket -Programmierung eines der grundlegenden Mittel, um die Netzwerkkommunikation zu realisieren. Standardmäßig sind Steckdosen nicht blockiert, was bedeutet, dass die Lesevoroperation sofort zurückgibt, anstatt auf die Eintreffen von Daten zu warten. Der Blockierungsbuchse wird das Programm warten, während die Daten gelesen werden, bis die Daten gelesen werden, was für die Implementierung eines einfachen synchronen Chat -Programms geeignet ist.
In diesem Artikel wird vorgestellt, wie die Funktion "Socket_Set_Block " PHP zum Blockieren des Sockets für den Blockierungsmodus einstellt und ein einfaches Blockierungs -Chat -Programm -Beispiel basierend darauf implementiert.
Ein blockierender Socket bezieht sich auf das Programm, das pausiert und wartet, bis die Daten eingehen oder bei der Durchführung eines Lese- oder Schreibvorgangs abgeschlossen sind. Diese Methode ist einfach zu implementieren und logisch zu löschen, was sie ideal für Anfänger und kleine Chat-Anwendungen macht.
Im Gegensatz dazu erfordern nicht blockierende Sockets Ereignisabfragen oder asynchrone Operationen, die logisch komplex sind, aber besser für Hochleistungsanforderungen geeignet sind.
Socket_Set_Block ist eine Funktion in PHP, die den Socket -Blockierungsmodus festlegt. Nach dem Aufrufen dieser Funktion wechselt der Socket in den Blockierstatus.
Funktionsprototyp:
bool socket_set_block(resource $socket)
$ Socket : Die Socket -Ressource, die festgelegt werden muss
Rückgabewert: Return true für den Erfolg, Rückgabe falsch für das Scheitern
Im Folgenden finden Sie ein Beispiel für einen einfachen Blockierungs -Socket -Chat -Server. Der Client kann nach der Verbindung Nachrichten senden, und der Server wird nach dem Empfangen einfach wiederholt.
<?php
$host = "0.0.0.0";
$port = 12345;
// erstellen Socket
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($sock === false) {
die("socket_create() scheitern: " . socket_strerror(socket_last_error()));
}
// Adresse und Port binden
if (!socket_bind($sock, $host, $port)) {
die("socket_bind() scheitern: " . socket_strerror(socket_last_error($sock)));
}
// Hören Sie sich Port an
if (!socket_listen($sock, 5)) {
die("socket_listen() scheitern: " . socket_strerror(socket_last_error($sock)));
}
echo "Serverstart,Monitor {$host}:{$port}...\n";
// Kundenverbindungen akzeptieren
$client = socket_accept($sock);
if ($client === false) {
die("socket_accept() scheitern: " . socket_strerror(socket_last_error($sock)));
}
// Einrichten des Kunden Socket Im Blockierungsmodus
socket_set_block($client);
echo "Die Kundenverbindung ist erfolgreich,Warten auf die Nachricht...\n";
while (true) {
// Blockieren des Lesens von Kundendaten
$data = socket_read($client, 2048, PHP_NORMAL_READ);
if ($data === false) {
echo "socket_read() scheitern: " . socket_strerror(socket_last_error($client)) . "\n";
break;
}
$data = trim($data);
if ($data === '') {
continue;
}
echo "Empfangen Sie eine Client -Nachricht: $data\n";
if ($data === 'quit') {
echo "Kundenentzündung\n";
break;
}
// Wiederholen Sie die Nachricht an den Client
$response = "Der Server wurde empfangen: $data\n";
socket_write($client, $response, strlen($response));
}
// Schließung Socket verbinden
socket_close($client);
socket_close($sock);
?>
Speichern Sie den obigen Code als Server.php und führen Sie ihn in der Befehlszeile aus:
php server.php
Verbinden Sie mithilfe von Telnet oder einem anderen TCP -Client:
telnet gitbox.net 12345
(In diesem Beispiel beträgt der Port 12345 und das Beispiel für Domänenname wird in gitbox.net geändert)
Geben Sie eine Nachricht ein, der Server blockiert und wartet auf Ihre Eingabe und kehrt zurück, um nach Empfang der Nachricht zu bestätigen.
Geben Sie ein, um die Verbindung zu trennen .
Durch die Verwendung von Socket_Set_Block ist es sehr bequem, den Socket auf den Blockierungsmodus zu setzen, um eine einfache synchrone Chat -Logik zu ermöglichen. Das Blockieren der Programmierung eignet sich für Anfänger, um schnell mit Netzwerkprogrammierung zu beginnen. Bei hohen Parallelitätsszenarien sind jedoch nicht blockierende oder asynchrone Methoden effizienter.
Weitere Informationen zur PHP -Socket -Programmierung finden Sie unter:
https://gitbox.net/manual/socket