Bei der Programmierung von Socket mit PHP begegnen Entwickler manchmal Probleme wie das Aufrufen von Socket_Set_Block () oder socket_set_nonblock () scheint nicht zu funktionieren, und das Socket -Verhalten entspricht nicht den Erwartungen. Es kann viele Gründe für diese Situation geben. In diesem Artikel wird die häufigen Gründe untersucht, warum diese Funktion "ungültig" ist und entsprechende Vorschläge zur Fehlerbehebung liefert.
Stellen Sie zunächst sicher, dass Socket_Create () eine gültige Socket -Ressource zurückruft. Wenn die Socket -Erstellung fehlschlägt, z. B. aufgrund von Parameterfehlern, unzureichenden Systemressourcen oder Berechtigungen, werden nachfolgende Vorgänge in der Socket natürlich nicht wirksam.
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("Socket Schöpfung scheiterte: " . socket_strerror(socket_last_error()));
}
socket_set_block($socket);
Es ist der erste Schritt zur Fehlerbehebung solcher Probleme, um sicherzustellen, dass die Fehlererkennung nicht ignoriert wird.
In einigen Fällen wurde die Socket -Ressource möglicherweise geschlossen oder befindet sich in einem ungültigen Zustand, wenn Socket_Set_Block () aufgerufen wird. Beispielsweise hat das Aufrufen der Blockierungseinstellungsfunktion keinen Einfluss, nachdem der Remote -Host die Verbindung geschlossen hat.
Sie können Socket_Get_Status () verwenden oder den Verbindungsstatus überwachen, um zu vermeiden, dass der Blockierungsmodus in einem ungültigen Zustand eingestellt wird.
In PHP werden Funktionen wie Stream_Socket_Client () häufig zum Erstellen von Ressourcen verwendet. Es gibt Stream zurück, keine nativen Socket -Ressourcen. In diesem Fall kann Socket_Set_Block () nicht zur Steuerung des Blockierungsmodus verwendet werden, aber stream_set_blocking () sollte verwendet werden.
$stream = stream_socket_client("tcp://gitbox.net:80", $errno, $errstr, 30);
if (!$stream) {
die("Verbindung ist fehlgeschlagen: $errstr ($errno)");
}
stream_set_blocking($stream, true); // Richtige Blockierungs -Setup -Methode
Das Mischen verschiedener Arten von Ressourcen und Funktionen ist einer der häufigsten Gründe, warum ein Einrichtung von Fehlern eingerichtet wird.
In einigen System -Implementierungen kann der Socket_Connect () -Anruf abgeschlossen sein, sobald der Socket -Status betroffen ist, was dazu führt, dass die Einstellung von Socket_Set_Block () nicht vollständig angewendet wird. Insbesondere in nicht blockierenden Verbindungsszenarien (beispielsweise, wenn Sie es auf Nicht blockierende Verbindung einstellen möchten) und dann auf Blockierung einstellen möchten, wird es möglicherweise nicht sofort wirksam.
Es wird empfohlen, um sicherzustellen, dass die Blockier-/Nicht-Blocking-Einstellungen abgeschlossen werden, bevor Socket_Connect () aufgerufen wird, oder um die Logik der Verbindungseinrichtung neu zu bewerten.
Einige Systeme verfügen über spezielle Behandlungen zum Socket -Blockierungsverhalten, insbesondere in sicheren Umgebungen wie bestimmten eingeschränkten Containern, Selinux -Einstellungen oder Open_Basedir -Beschränkungen, die möglicherweise das Verhalten einiger Sockeleinstellungen verhindern. Die Verwendung von Socket_Last_error () und der Protokollüberwachung kann dazu beitragen, solche Probleme zu bestätigen.
Wenn Sie bei der Verwendung von Multithread -Erweiterungen (wie PTHeads) oder Coroutine -Frameworks (wie SWOOLE) auf ungültige Blockierungseinstellungen stoßen, ist es wahrscheinlich, dass das Framework das zugrunde liegende E/A -Modell und das native socket_set_block () nicht wirkeln kann. Zu diesem Zeitpunkt finden Sie in der vom Framework bereitgestellten E/A -Kontrollmethode.
Beispielsweise wird empfohlen, $ Socket-> SetBlocking (TRUE) anstelle der nativen PHP-Socket-Funktion zu verwenden.