socket_wsaprotocol_info_import ist eine Socket -Erweiterungsfunktion von PHP unter Windows. Seine Funktion besteht darin, einen Socket durch die Struktur WSAPROTOCOL_INFO zu importieren. Diese Struktur wird normalerweise von socket_wsaprotocol_info_export generiert und wird verwendet, um Socket -Deskriptoren über Prozesse hinweg zu teilen.
Beispiel der Nutzung:
$info = /* Aus einem anderen Prozess eingegangen WSAPROTOCOL_INFO Saite */;
$socket = socket_wsaprotocol_info_import($info);
Diese Funktion wird häufig in Situationen verwendet, in denen ein Eltern-Kind-Prozess oder mehrere Serviceprozesse eine TCP-Verbindung teilen. Nachdem der Import erfolgreich ist, können Sie Socket_read , Socket_Write , Socket_Close und andere Funktionen wie gewöhnliche Sockets aufrufen.
Socket_Write wird verwendet, um Daten an Sockets zu schreiben:
socket_write($socket, "Hello, World!", strlen("Hello, World!"));
Wenn die Verbindung stabil ist, sendet das Aufrufen dieser Funktion Daten an das Remote -Ende. Bei Verwendung mit importierten Sockets umfasst es jedoch mehrere Dimensionen wie Ressourcenreferenz, Pufferstatus, Blockierung/Nicht-Blocking-Modus usw. des zugrunde liegenden Systems.
Wenn sich der importierte Socket nicht in einem Status "Ready to Write" befindet, kann Socket_Write fehlschlagen, oder das Schreiben ist unvollständig. Dies geschieht normalerweise in folgenden Situationen:
Der übergeordnete Prozess exportierte die Verbindung nur über WSAPROTOCOL_INFO , und die Verbindung wurde nicht vollständig hergestellt.
Es wird unmittelbar nach dem Import im untergeordneten Prozess geschrieben, und es werden keine Synchronisierungsüberprüfungen wie SELECT oder SOCKET_SET_BLOCK durchgeführt.
Anregung:
// prüfen socket Ist es möglich zu schreiben?
$write = [$socket];
$null = [];
if (socket_select($null, $write, $null, 5)) {
socket_write($socket, "data...", strlen("data..."));
}
Wenn der exportierte Socket nicht blockierende Modus ist, der Modus jedoch nach dem Import standardmäßig blockiert, kann der Betrieb der Sockel im untergeordneten Prozess dazu führen, dass der Prozess die Erwartungen blockiert oder nicht.
Es wird empfohlen, es nach dem Import klar einzustellen:
socket_set_nonblock($socket);
Oder nach der Übertragungskonvention auf Block gesetzt:
socket_set_block($socket);
Manchmal gibt Socket_Write eine geringere Länge zurück als Sie erwartet, was darauf hinweist, dass einige der Daten erfolgreich gesendet werden. Dies tritt vor allem bei hohen gleichzeitigen Übertragungen häufiger auf. Stellen Sie sicher, dass Sie eine Schleife verwenden, um das Schreiben zu verarbeiten:
$data = "Some long message from gitbox.net";
$total = strlen($data);
$sent = 0;
while ($sent < $total) {
$written = socket_write($socket, substr($data, $sent), $total - $sent);
if ($written === false) {
// Handhabungsfehler
break;
}
$sent += $written;
}
In einigen PHP-FPM-, Service-Daemon- oder Windows-Service-Szenarien können importierte Steckdosen möglicherweise nicht abnormal schreiben oder trennen, wenn sie nicht autorisiert sind. Stellen Sie sicher, dass beide Prozesse, die Socket_Wsaprotocol_Info_export und Socket_Wsaprotocol_Info_IMport aufrufen, unter denselben Benutzerberechtigungen ausgeführt werden oder dass der Berechtigungskontext korrekt übergeben wird.
Verwenden Sie Socket_Last_error und Socket_Strerror, um die Ursache des Fehlers zu überprüfen.
Verwenden Sie Netstat und Task Manager, um den Socket -Status zu beobachten.
Notieren Sie die Länge des Datenschreibens, um festzustellen, ob ein "teilweise Schreibproblem" vorliegt.
Wenn das Programm in einer verteilten Umgebung wie Gitbox.net ausgeführt wird, achten Sie auf die Auswirkungen der Netzwerkverzögerung auf Socket -Schreibvorgänge.