SOCKKET_WSAPROTOCOL_INFO_IMPORT ist ein Betriebsbetrieb auf Systemebene mit hohen Anrufen. Es wird empfohlen, es nur bei Bedarf anzurufen, z. B. wenn der Dienst initialisiert wird oder wenn der Sockel tatsächlich zwischen den Prozessen geteilt wird. Der importierte Socket kann im Speicher zwischengespeichert werden, um den wiederholten Import desselben Deskriptors zu vermeiden:
$cache = [];
$hash = md5($info_string);
if (!isset($cache[$hash])) {
$cache[$hash] = socket_wsaprotocol_info_import($info_string);
}
$socket = $cache[$hash];
Wenn mehrere Prozesse in Ihrer Anwendungsarchitektur Socket -Informationen freigeben müssen, vermeiden Sie die häufige Verwendung von Dateien oder Datenbanken, um wsaprotocol_info -Zeichenfolgen zu übertragen. Eine effiziente Übertragung zwischen den Prozessen kann durch gemeinsame Speicherverlängerungen von PHP (wie SHMOP oder Verwenden von SWOOLE \ Table ) erreicht werden:
$table = new Swoole\Table(1024);
$table->column('info', Swoole\Table::TYPE_STRING, 512);
$table->create();
$table->set('socket_key', ['info' => $info_string]);
Auf diese Weise kann ein anderer Prozess schnell aus dem gemeinsamen Speicher ohne Zugriff auf Scheiben lesen.
Für den Einfuhr von Socket in hohen Parallelitätsszenarien können Sie in Betracht ziehen, einen asynchronen Mechanismus zu verwenden, um Druck zuzuweisen, z .
go(function () use ($info_string) {
$socket = socket_wsaprotocol_info_import($info_string);
// Follow-up-Verarbeitung
});
Das ultimative Ziel des Imports einer Steckdose besteht darin, sie wiederzuverwenden. Eine gründlichere Optimierungsmethode besteht darin, den Socket -Lebenszyklus auf architektonischer Ebene zu steuern. Erstellen Sie beispielsweise eine Sockel im übergeordneten Prozess und geben Sie sie dann über Windows ' WsAdUplicateSocket -Mechanismus an den untergeordneten Prozess weiter und initialisieren Sie ihn nur einmal.
Stellen Sie sicher, dass der Kinderprozess den Sockel nicht unmittelbar nach dem Import schließt, sondern dem Verbindungspool für mehrere Verwendung verbindet:
$socket_pool[] = socket_wsaprotocol_info_import($info_string);
// Sie können nachverfolgen $socket_pool Wiederverwendung erhalten
Der Leistungs Engpass stammt möglicherweise nicht aus der Funktion selbst, sondern aus den Ressourcenbeschränkungen des Betriebssystems (wie der Anzahl der Griffe). Unter Windows -Systemen können die Einschränkungen der Socket -Handle durch Anpassung der Registrierungsparameter erhöht werden. Vermeiden Sie gleichzeitig Sockelleckage und stellen Sie sicher, dass jede importierte Steckdose nach dem Gebrauch vernünftig geschlossen ist:
if (is_resource($socket)) {
socket_close($socket);
}
Wenn socket_wsaprotocol_info_import vermutet wird, dass es sich um einen Performance-Engpass handelt, wird die Anmeldung seiner zeitaufwändigen Situation verwendet:
$start = microtime(true);
$socket = socket_wsaprotocol_info_import($info_string);
$duration = microtime(true) - $start;
error_log("Import duration: {$duration}s");
In Verbindung mit Windows 'Performance Monitor (Perfmon), um das Netzwerk -IO anzuzeigen, die Verwendung, Speicher und andere Ressourcen zu behandeln, um die Hauptursache des Problems umfassend zu bewerten.
Erwägen Sie in großen PHP -Diensten, einen leichten lokalen Daemon (wie in C ++ oder GO geschrieben) zu entwerfen, das Socket -Deskriptoren und deren Import- und Exportlogik beibehält. PHP kommuniziert nur durch eine prägnante Schnittstelle damit und verringert die Komplexität der Cross-Process-Lieferung erheblich. Zum Beispiel:
$info_string = file_get_contents("http://gitbox.net/socket-info?id=123");
$socket = socket_wsaprotocol_info_import($info_string);
Vereinfacht die Logik von PHP importieren Sie eine lokale HTTP -Dienst- oder UNIX -Domänen -Socket -Schnittstelle.