Heim  >  Artikel  >  Backend-Entwicklung  >  Socket-Funktion in PHP

Socket-Funktion in PHP

不言
不言Original
2018-05-04 15:16:111723Durchsuche

Dieser Artikel stellt hauptsächlich die Socket-Funktion in PHP vor, die einen bestimmten Referenzwert hat. Jetzt kann ich sie mit allen teilen, die sie benötigen.

Um eine Socket-basierte Anwendung zu erstellen, benötigen Sie Erfahren Sie mehr über den Socket-Betrieb. Hier sind einige wichtige Socket-Funktionen in PHP.

1. socket_create ( int $domain , int $type , int $protocol )

Diese Funktion wird zum Erstellen eines Sockets verwendet. Sie verfügt über drei Parameter und der Rückgabewert ist ein Handle (Ressource).

$domain gibt die beim Erstellen des Sockets verwendete Kommunikationsprotokollfamilie an. Die optionalen Werte sind:

  • AF_INET: Internetprotokoll basierend auf IPv4

  • AF_INET6: Internetprotokoll basierend auf IPv6

  • AF_UNIX: Lokales UNIX-Kommunikationsprotokoll

$type gibt den Interaktionstyp der Socket-Kommunikation an, der ist optional. Der Wert ist:

  • SOCK_STREAM: Bietet serialisierte, zuverlässige, verbindungsbasierte Vollduplex-Bytestream-Übertragung, unterstützt TCP

  • SOCK_DGRAM: Bietet Datagramm-Stil, verbindungslos, feste maximale Länge, automatische Adressierungsfunktionsübertragung, unterstützt UDP

  • SOCK_SEQPACKET: Bietet serialisierte, zuverlässige, zweikanalige, verbindungsbasierte Datagrammübertragung

  • SOCK_RAW: Bietet das ursprüngliche Netzwerkzugriffsprotokoll, kann manuell Sockets erstellen spezielle Protokolltypen, unterstützt ICMP-Anfragen (z. B. Ping)

  • SOCK_RDM: Bietet zuverlässige Datagrammübertragung, die Reihenfolge kann nicht garantiert werden

$protocol gibt an, welches spezifische Übertragungsprotokoll der Socket verwendet, einschließlich ICMP, UDP und TCP. Die Konstante SOL_UDP entspricht UDP und die Konstante SOL_TCP entspricht der Konstante TCP.

2 > ( Ressource $socket , Zeichenfolge $address [, int $port = 0 ] )Diese Funktion wird verwendet Binden Sie die IP-Adresse und den Port an das von socket_create erstellte Handle. Es verfügt über drei Parameter und gibt einen booleschen Wert zurück.

$socket ist ein erforderlicher Parameter, der das von der Funktion socket_create erstellte Handle darstellt

$address ist ein erforderlicher Parameter, der die zu bindende IP-Adresse darstellt

$port ist ein optionaler Parameter, der die zu bindende Portnummer darstellt. Er gibt an, welcher Port zur Überwachung von Socket-Verbindungen verwendet wird Die Funktion socket_create ist der erste. Wenn der erste Parameter AF_INET ist, muss dieser Parameter angegeben werden.

3 socket_listen ( resource $socket [, int $backlog = 0 ] )

Diese Funktion wird verwendet für Überwachung Die Socket-Verbindung, auf die zugegriffen werden soll, kann nur verwendet werden, wenn der Interaktionstyp des Sockets SOCK_STREAM oder SOCK_SEQPACKET ist Zwei Parameter geben einen booleschen Wert zurück.

$socket ist ein erforderlicher Parameter, der das von der socket_create-Funktion erstellte Handle darstellt (und an den Host gebunden wurde). )

$backlog ist ein optionaler Parameter, der die maximale Anzahl von Verbindungen angibt, die in der Warteschlange auf die Verarbeitung warten (Rückstand zulässig).

4.

socket_set_block ( ressource $socket )Diese Funktion wird verwendet, um das Socket-Handle in den Blockierungsmodus zu versetzen. Sie hat nur einen erforderlichen Parameter und gibt einen booleschen Wert zurück. Es kann einen nicht blockierenden Modus-Socket in einen blockierenden Modus umwandeln.

Wenn Sie einen Vorgang (Empfangen, Senden, Verbinden, Akzeptieren usw.) in einem Socket im Blockierungsmodus ausführen, pausiert das Skript die Ausführung, bis es ein Signal empfängt oder den Vorgang abschließt.

$socket ist ein erforderlicher Parameter, der ein gültiges Socket-Handle darstellt (erstellt durch socket_create oder socket_accept).

Eine kurze Einführung in den Unterschied zwischen Blockierungsmodus und Nichtblockierungsmodus:

Nicht blockierend bedeutet, dass die Funktionsoperation den aktuellen Thread nicht blockiert, bis das Ergebnis nicht sofort erhalten werden kann, sondern sofort zurückkehrt. Das Blockieren bedeutet, dass Sie nicht zurückkehren dürfen, bis Sie die Arbeit abgeschlossen haben. Sie müssen eine Antwort von der anderen Partei erhalten, bevor Sie mit dem nächsten Schritt fortfahren können. Insbesondere bei vielen Benutzern ist es notwendig, es auf nicht blockierend einzustellen. Wenn es sich um einen Blockierungsmodus handelt und zwei Clients gleichzeitig verbunden sind und der Server die Anfrage eines Clients verarbeitet, wird die Anfrage des anderen Clients blockiert. Erst nachdem die Angelegenheiten des vorherigen Clients verarbeitet wurden, wird die Anfrage des letzteren Clients verarbeitet. wird darauf reagiert.

5. socket_write ( resource $socket , string $buffer [, int $length = 0 ] )

Diese Funktion wird verwendet, um Pufferdaten einer bestimmten Größe in den Socket zu schreiben. Sie verfügt über drei Parameter und gibt die Anzahl der Bytes der geschriebenen Daten zurück.

$socket ist ein erforderlicher Parameter und stellt ein gültiges Socket-Handle dar.

$buffer ist ein erforderlicher Parameter, der die zu schreibenden Zeichenfolgendaten angibt.

$length ist ein optionaler Parameter, der die Anzahl der Bytes an Daten angibt, die der Reihe nach in den Socket geschrieben werden, wenn sein Wert größer ist als 🎜>Die Anzahl der Bytes in $buffer, es wird stillschweigend bis zur Länge von $buffer in Bytes abgefangen.

6 socket_read ( resource $socket , int $length [, int $type = PHP_BINARY_READ ] )Diese Funktion wird verwendet, um Daten der angegebenen Bytelänge aus dem Socket zu lesen. Sie verfügt über drei Parameter und gibt die gelesenen String-Daten zurück.

$socket ist ein erforderlicher Parameter und stellt ein gültiges Socket-Handle dar.
$length ist ein erforderlicher Parameter, der die Länge der zu lesenden Bytes angibt.

$type ist ein optionaler Parameter. Der Standardwert ist PHP_BINARY_READ, was bedeutet, dass der andere optionale Wert ist PHP_NORMAL_READ bedeutet, das Lesen zu stoppen, wenn r oder n angetroffen wird.

7. pfsockopen ( string $hostname [, int $port = -1 [, int &$errno [, string &$errstr [, float $timeout = ini_get("default_socket_timeout") ]]]] )

Diese Funktion wird verwendet, um eine dauerhafte Socket-Verbindung, also eine lange Verbindung, zu implementieren und ein Handle zurückzugeben. Der Unterschied zu fsockopen besteht darin, dass die von pfsockopen hergestellte Verbindung nach der Ausführung des Skripts nicht getrennt wird.

8. socket_set_option ( resource$socket , int$level , int$optname , mixed$optval )

Diese Funktion wird verwendet, um die Steuerungsoptionen des Sockets festzulegen. Sie verfügt über vier Parameter und gibt einen booleschen Wert zurück.

$socket ist ein erforderlicher Parameter und stellt ein gültiges Socket-Handle dar.

$level ist ein erforderlicher Parameter, der die Protokollebene angibt, auf der die Option funktioniert. Nehmen Sie im Allgemeinen die Konstante SOL_SOCKET.

$optname ist ein erforderlicher Parameter, der angegeben wird Der Name der zu steuernden Option. $optval ist ein erforderlicher Parameter, der den Wert der Option angibt.

9. socket_last_error ([ Ressource$socket ] )

Diese Funktion wird verwendet, um den letzten von einer Socket-Funktion generierten Fehlercode abzurufen, und der Rückgabewert ist eine Ganzzahl.

10. >$errno )Diese Funktion wird verwendet, um die durch den Fehlercode dargestellte Fehlerbeschreibung abzurufen, und der Rückgabewert ist eine Zeichenfolge . Als Nicht-Low-Level-Programmierer ist es sehr schwierig, den internen Implementierungsmechanismus von Socket genau zu verstehen. Wir müssen nur verstehen, dass Socket eine Reihe von Funktionen ist, die vom Betriebssystem gekapselt werden, um die Prozesskommunikation zu implementieren . Es wird erstellt und es reicht aus, nur anzurufen. Die Spracheigenschaften und die Positionierung von PHP bestimmen, dass es nur für Socket-Clients, nicht jedoch 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 und Probleme bei der Entwicklung von Netzwerkdiensten gelöst werden (wie Parallelität, Blockierung usw.) Es gibt auch ausgereifte und vollständige Lösungen, aber PHP ist für dieses Anwendungsszenario offensichtlich nicht geeignet. Tatsächlich betreibt PHP die MySQL-Datenbank über Sockets. Dies liegt genau daran, dass Sockets das zugrunde liegende Protokoll abschirmen und so die Verbindung zwischen Netzwerkdiensten vereinfachen. Mit der Popularität von HTML5 tauchen nach und nach auch in Browser-Clients implementierte Sockets auf. FlashSocket ist ebenfalls eine gute Lösung.

Um den Socket auf dem Client zu betreiben, können Sie Funktionen wie fsockopen, socket_create oder stream_socket_client verwenden PHP5, es wird empfohlen, stream_socket_client zu verwenden.

Beispiel für eine interaktive Socket-Anwendung: Verwenden Sie Socket, um ein Formular einzureichen

Erstellen Sie eine neue test.php-Datei unter

http: // demo.com/index.php?id=1 Formulardaten senden, der Code lautet wie folgt

[php] view plain copy
<?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连接
?>

Folgende Punkte sind zu beachten:

  • fsockopen的第一个参数,也可以使用IP地址,不要带 http:// 字符串,除非使用SSL等

  • 请求头(headers)不一定要带上所有的头域,一般只需带上几个核心的header即可

  • 在最后一个header处,即 Connection 后有两个换行

  • 注意编码问题

如果是PHP5,建议使用 stream_socket_client 代替 fsockopen,也就是将下面的代码:

$fp = fsockopen("demo.com", 80, $errno, $errstr, 30);

改为:

$fp = stream_socket_client("tcp://demo.com:80", $errno, $errstr, 30);

在PHP中,99.9%的socket应用属于流套接字的范畴,由于数据包套接字和原始套接字涉及比较底层的协议知识,这里就不作深究,有兴趣的朋友可自行学习。

相关推荐:

PHP中PDO事务处理操作示例


Das obige ist der detaillierte Inhalt vonSocket-Funktion in PHP. 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