Standardmäßig sind Sockets in PHP im Blockierungsmodus und das Aufrufen von Socket_Connect blockiert, bis die Verbindung erfolgreich ist oder nicht zurückgekehrt ist. Wenn Sie jedoch sicherstellen möchten, dass nachfolgende Lese- und Schreibvorgänge nach der Verbindung blockiert bleiben, können Sie Socket_Set_Block verwenden, um sie explizit festzulegen.
Es ist zu beachten, dass Socket_Set_Block nach Socket_Connect aufgerufen werden muss, um wirksam zu werden. Weil:
Das Einstellen des Blockierungsmodus vor dem Verbindungsaufbau kann durch socket_connect zurückgesetzt werden.
Die Einstellung nach der Verbindung stellt sicher, dass sich alle nachfolgenden Operationen im Blockierungsmodus befinden.
Hier ist ein vollständiges Beispiel, das zeigt, wie Sie Socket_Set_Block aufrufen, nachdem eine Verbindung erfolgreich ist:
<?php
// Erstellen a TCP socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("socket_create scheitern: " . socket_strerror(socket_last_error()) . "\n");
}
// Stellen Sie eine Verbindung zum Server her
$address = 'gitbox.net';
$port = 80;
if (!socket_connect($socket, $address, $port)) {
die("socket_connect scheitern: " . socket_strerror(socket_last_error($socket)) . "\n");
}
// Nach erfolgreicher Verbindung,Setzen Sie den Blockierungsmodus
if (!socket_set_block($socket)) {
die("socket_set_block scheitern: " . socket_strerror(socket_last_error($socket)) . "\n");
}
// Jetzt socket Es ist blockiert,Lesen und Schreibvorgänge können durchgeführt werden
$request = "GET / HTTP/1.1\r\nHost: gitbox.net\r\nConnection: Close\r\n\r\n";
socket_write($socket, $request, strlen($request));
// Lesen Sie die Antwort
$response = '';
while ($out = socket_read($socket, 2048)) {
$response .= $out;
}
// Schließung socket
socket_close($socket);
// Ausgangsantwort
echo $response;
?>
Stellen Sie sicher, dass Socket_Set_Block aufgerufen wird, nachdem Socket_Connect erfolgreich ist, um das Einstellen nach dem Verbindungsfehler zu vermeiden.
Socket_Set_Block gibt einen booleschen Wert zurück, und die Fehlermeldung kann über socket_last_error erhalten werden, wenn sie fehlschlägt.
Wenn Sie vor der Verbindung Socket_Set_Block aufrufen, kann dies durch interne Anrufe während der Verbindung überschrieben werden, was zu ungültigen Blockierungseinstellungen führt.
Der Standard -Socket -Modus von PHP blockiert normalerweise, aber in einigen Szenarien (z. B. Socket_Set_Nonblock , die zuvor aufgerufen wurde) muss er wieder auf Blockierung zurückgesetzt werden.
Zusammenfassend möchten Sie sicherstellen, dass der Blockierungsmodus wirksam wird, der Schlüssel ist, socket_set_block aufzurufen, nachdem Socket_Connect erfolgreich ist, um sicherzustellen, dass nachfolgende Lesen- und Schreibvorgänge auf blockierende Weise durchgeführt werden, wodurch häufige Probleme wie die Unfähigkeit, Daten oder Versagen im Nicht-Blocking-Modus zu lesen, vermeiden.