Heim  >  Artikel  >  Backend-Entwicklung  >  Warum ist PHP nicht für Sockets geeignet?

Warum ist PHP nicht für Sockets geeignet?

(*-*)浩
(*-*)浩Original
2019-10-19 15:02:212366Durchsuche

Als Nicht-Low-Level-Programmierer ist es sehr schwierig, den internen Implementierungsmechanismus von Sockets zu verstehen. Wir müssen nur verstehen, dass Sockets eine Reihe von Funktionen sind, die vom Betriebssystem gekapselt werden, um die Prozesskommunikation zu implementieren genug, um es zu erstellen und aufzurufen.

Warum ist PHP nicht für Sockets geeignet?

Die Spracheigenschaften und die Positionierung von PHP bestimmen, dass es nur für Socket-Clients und nicht für Socket-Server geeignet ist.

Da Socket hauptsächlich auf die unterste Schicht und die Entwicklung von Netzwerkdiensten ausgerichtet ist, wird die Serverseite im Allgemeinen in Sprachen wie C oder Java implementiert. Dadurch kann die unterste Schicht besser bedient werden Lösen Sie Probleme, die bei der Entwicklung von Netzwerkdiensten auftreten. Es gibt ausgereifte und vollständige Lösungen für Probleme (wie Parallelität, Blockierung usw.), aber PHP ist für dieses Anwendungsszenario offensichtlich nicht geeignet. (Empfohlenes Lernen: PHP-Video-Tutorial)

Tatsächlich betreibt PHP die MySQL-Datenbank über Sockets. Dies liegt genau daran, dass Sockets das zugrunde liegende Protokoll abschirmen und Netzwerkdienste miteinander verbinden wird einfach.

Mit der Popularität von HTML5 tauchen nach und nach auch WebSockets auf, die in Browser-Clients implementiert sind. Dies ist auch eine gute Lösung. .

Um Socket auf dem Client zu betreiben, können Sie Funktionen wie fsockopen, socket_create oder stream_socket_client verwenden. Wenn es sich um PHP5 handelt, wird die Verwendung von stream_socket_client empfohlen.

Beispiel für eine interaktive Socket-Anwendung: Verwenden von Socket zum Senden eines Formulars

Erstellen Sie eine neue test.php-Datei und gehen Sie zu http://demo .com/index .php?id=1 Formulardaten senden, der Code lautet wie folgt:

<?php
$data = array(&#39;comment&#39;=>&#39;this is a robot comment&#39;);
$data = http_build_query($data);
 
$out = "POST http://demo.com/index.php?id=1 HTTP/1.1\r\n";  // 通过POST方式发送数据
$out .= "Host: demo.com\r\n";
$out .= "Content-type: application/x-www-form-urlencoded; charset=UTF-8\r\n";
$out .= "Content-length: ".strlen($data)."\r\n";
$out .= "User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:48.0) Gecko/20100101 Firefox/48.0"."\r\n";
$out .= "Connection: close"."\r\n"."\r\n";    // 注意:此处有两个 \r\n
 
$out .= $data."\r\n";   // 正文数据
 
$fp = fsockopen("demo.com", 80, $errno, $errstr, 30);  // 创建socket客户端连接
 
// $fp = stream_socket_client("tcp://demo.com:80", $errno, $errstr, 30);  推荐这种写法
 
fwrite($fp, $out);    // 向服务器发送数据
 
while (!feof($fp)) {
    echo fgets($fp, 1280);    // 读取服务器响应的数据
}
fclose($fp);  // 关闭socket连接
?>

Sie müssen auf die folgenden Punkte achten:

Die Der erste Parameter von fsockopen kann auch die IP-Adresse verwenden. Geben Sie keine http://-Zeichenfolge an, es sei denn, Sie verwenden SSL usw.

Anforderungsheader müssen nicht unbedingt alle Headerfelder mitbringen, im Allgemeinen nur einige Kernheader werden benötigt

Im letzten Header gibt es zwei Zeilenumbrüche nach Connection

Achten Sie auf das Codierungsproblem

Das obige ist der detaillierte Inhalt vonWarum ist PHP nicht für Sockets geeignet?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn