In PHP gibt es viele Möglichkeiten, die Verbindung bei der Verwendung von Sockets für die Netzwerkkommunikation zu schließen. Unter ihnen ist die Funktion stream_socket_shutdown eine häufige Art und Weise, mit der Entwickler den Stillstand des Sockels körniger steuern können. Das Verständnis der Rolle von Stream_Socket_Shutdown und deren anwendbaren Szenarien ist entscheidend für die Verbesserung der Robustheit und Leistung des Codes.
stream_socket_shutdown ist eine Methode, die in PHP verwendet wird, um Socket -Verbindungen zu schließen. Im Gegensatz zu einfacher fcLose () oder socket_close () bietet es mehr Kontrolloptionen, sodass Entwickler auswählen können, ob das Lesen und Schreiben von Vorgängen schließen und die Verbindung vollständig schließen soll. Der Funktionsprototyp lautet wie folgt:
<span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-title function_ invoke__">stream_socket_shutdown</span></span><span>(resource </span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$how</span></span><span>);
</span></span>
$ Socket : Repräsentiert die zu geschlossene Socket -Ressource.
$ wie : steuert die geschlossene Art des Betriebs. Es kann Folgendes sein:
Stream_shut_rd : Schalten Sie nur die Lesevoroperation aus und behalten Sie die Schreibfunktion.
Stream_Shut_Wr : Schalten Sie nur die Schreiboperation aus und pflegen Sie die Lesefunktion.
Stream_Shut_RDWR : Schließt gleichzeitig Lesen und Schreiben von Vorgängen und schließt die Verbindung vollständig.
In einigen Anwendungsszenarien muss der Client oder Server nach dem Senden von Daten nicht mehr schreiben, sondern warten Sie, bis die andere Partei antwortet. Nachdem die HTTP -Anfrage abgeschlossen ist, sendet der Client beispielsweise keine Daten mehr, sondern muss nur darauf warten, dass der Server eine Antwort zurückgibt. Zu diesem Zeitpunkt können Sie Stream_Socket_Shutdown verwenden, um den Schreibvorgang zu schließen, den Ressourcenverbrauch zu reduzieren und die Leistung zu verbessern.
Beispielcode:
<span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_client</span></span><span>(</span><span><span class="hljs-string">"tcp://example.com:80"</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">fwrite</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-string">"GET / HTTP/1.1\r\nHost: example.com\r\n\r\n"</span></span><span>);
</span><span><span class="hljs-comment">// Schließen Sie den Schreibvorgang, nachdem Sie die Anfrage gesendet haben,Keine Daten mehr gesendet</span></span><span>
</span><span><span class="hljs-title function_ invoke__">stream_socket_shutdown</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, STREAM_SHUT_WR);
</span><span><span class="hljs-comment">// Serverantwort lesen</span></span><span>
</span><span><span class="hljs-variable">$response</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fread</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span></span>
In diesem Beispiel hat der Client die HTTP -Anforderung gesendet und muss keine Daten mehr an den Server schreiben, sodass die Schreibvor Operation durch Aufrufen von Stream_Socket_Shutdown geschlossen wird.
In einigen Anwendungen muss der Client oder Server möglicherweise nur Daten von der anderen Partei lesen und keine Daten mehr senden. Zu diesem Zeitpunkt können Sie Stream_Socket_Shutdown verwenden, um den Schreibvorgang zu schließen, um sicherzustellen, dass die Verbindung nicht mehr unnötige Schreibressourcen verbraucht. In einigen Modi des FTP -Protokolls müssen Clients und Server beispielsweise nur Daten ohne Schreiben lesen.
Beispielcode:
<span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_client</span></span><span>(</span><span><span class="hljs-string">"tcp://example.com:21"</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">fwrite</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-string">"USER anonymous\r\n"</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">fwrite</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-string">"PASS anonymous\r\n"</span></span><span>);
</span><span><span class="hljs-comment">// Keine Daten mehr gesendet,Schließen Sie den Schreibvorgang</span></span><span>
</span><span><span class="hljs-title function_ invoke__">stream_socket_shutdown</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, STREAM_SHUT_WR);
</span><span><span class="hljs-comment">// Lesen Sie die vom Server zurückgegebene Antwort</span></span><span>
</span><span><span class="hljs-variable">$response</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fread</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span></span>
Durch das Ausschalten des Schreibvorgangs kann unnötiger Ressourcenverbrauch reduziert werden und der Kommunikationsprozess kann sichergestellt werden, dass sie effizienter sind.
Für einige Anwendungen, die eine wechselseitige Kommunikation erfordern, z. B. Live-Chat-Systeme oder Online-Spiele, rufen sie normalerweise Stream_Socket_Shutdown auf, nachdem sie den Datenaustausch auf der Client oder Server abgeschlossen haben, um die Verbindung vollständig zu schließen und alle zugehörigen Ressourcen zu veröffentlichen. Verwenden Sie Stream_Shut_RDWR, um die Verbindung zu schließen und sicherzustellen, dass sowohl Lesen als auch Schreibvorgänge ordnungsgemäß beendet werden.
Beispielcode:
<span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_client</span></span><span>(</span><span><span class="hljs-string">"tcp://example.com:12345"</span></span><span>);
</span><span><span class="hljs-comment">// Führen Sie einen Zwei-Wege-Datenaustausch durch</span></span><span>
</span><span><span class="hljs-title function_ invoke__">fwrite</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-string">"Hello Server!"</span></span><span>);
</span><span><span class="hljs-variable">$response</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fread</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);
</span><span><span class="hljs-comment">// Schließen Sie die Verbindung nach Abschluss der Zwei-Wege-Kommunikation vollständig</span></span><span>
</span><span><span class="hljs-title function_ invoke__">stream_socket_shutdown</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, STREAM_SHUT_RDWR);
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span></span>
Zu diesem Zeitpunkt müssen beide Parteien die Kommunikation nicht mehr fortsetzen. Rufen Sie Stream_Socket_Shutdown auf, um die Lese- und Schreibvorgänge zu schließen, um sicherzustellen, dass die Socket -Verbindung vollständig geschlossen ist.
In einigen besonderen Fällen kann die Netzwerkverbindung aufgrund einer abnormalen Unterbrechung oder eines abnormalen Fehlers geschlossen werden. Verwenden Sie Stream_Socket_Shutdown , um den Abschaltprozess des Sockets körniger zu steuern. Wenn beispielsweise eine Netzwerkunterbrechung oder eine Anwendungsausnahme auftritt, kann der Lese- oder Schreibvorgang optional ausgeschaltet werden, um eine fortgesetzte Ressourcenbelegung zu verhindern.
Beispielcode:
<span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_client</span></span><span>(</span><span><span class="hljs-string">"tcp://example.com:80"</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$socket</span></span><span>) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"Unable to connect to server"</span></span><span>);
}
</span><span><span class="hljs-comment">// Angenommen, einige Fehler treten auf,Hören Sie auf, Daten zu schreiben</span></span><span>
</span><span><span class="hljs-title function_ invoke__">stream_socket_shutdown</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, STREAM_SHUT_WR);
</span><span><span class="hljs-comment">// Lesen Sie die Fehlermeldung fort oder benachrichtigen Sie den Benutzer</span></span><span>
</span><span><span class="hljs-variable">$response</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fread</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span></span>
Wenn eine Ausnahme oder ein Fehler auftritt, vermeiden wir weitere Versuche, Daten zu schreiben, um die Auswirkungen auf den Server durch Schließen des Schreibvorgangs zu mildern.
Einige Anwendungen müssen möglicherweise einen Zeitüberschreitungsmechanismus implementieren, dh der aktiven Schließung der Socket -Verbindung, wenn die Verbindung lange nicht reagiert. In diesem Fall kann Stream_Socket_Shutdown verwendet werden, um Verbindungen zu schließen, die nicht mehr benötigt werden, um zu vermeiden, dass Sie auf Sackgassen oder langfristige Belegung von Netzwerkressourcen warten.
Beispielcode:
<span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_client</span></span><span>(</span><span><span class="hljs-string">"tcp://example.com:80"</span></span><span>, </span><span><span class="hljs-variable">$errno</span></span><span>, </span><span><span class="hljs-variable">$errstr</span></span><span>, </span><span><span class="hljs-number">30</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$socket</span></span><span>) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"Unable to connect: <span class="hljs-subst">$errstr</span></span></span><span> (</span><span><span class="hljs-subst">$errno</span></span><span>)");
}
</span><span><span class="hljs-comment">// Stellen Sie den Zeitüberschreitungsmechanismus fest,Schließen Sie die Verbindung nach der Zeitüberschreitung</span></span><span>
</span><span><span class="hljs-title function_ invoke__">stream_set_timeout</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">10</span></span><span>); </span><span><span class="hljs-comment">// Stellen Sie die Zeitüberschreitungszeit auf10Zweite</span></span><span>
</span><span><span class="hljs-variable">$response</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fread</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">feof</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Connection timed out or completed.\n"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">stream_socket_shutdown</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, STREAM_SHUT_RDWR);
}
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span></span>
Wenn die Verbindung nicht innerhalb von 10 Sekunden reagiert, wird Stream_Socket_Shutdown aufgerufen, um die Verbindung zu schließen.
Stream_Socket_Shutdown ist eine sehr nützliche Funktion in PHP, die eine feinkörnige Kontrolle über den Verschluss der Steckdose bietet. Es ist für eine Vielzahl von Szenarien geeignet, einschließlich Schließung von Schreibvorgängen während der Einweg-Kommunikation, dem Schließen von Verbindungen nach bidirektionaler Kommunikation, der Ausnahme von Netzwerkausnahmen usw. kann den Entwicklern dabei helfen, die Netzwerkressourcen effektiver zu verwalten und die Anwendungsstabilität und -leistung zu verbessern.