Maison  >  Article  >  développement back-end  >  fonction socket en PHP

fonction socket en PHP

不言
不言original
2018-05-04 15:16:111723parcourir

Cet article présente principalement la fonction socket en PHP, qui a une certaine valeur de référence. Maintenant, je la partage avec tout le monde. Les amis dans le besoin peuvent s'y référer

Pour créer une application basée sur socket, vous devez Pour en savoir plus sur le fonctionnement des sockets, voici quelques fonctions importantes des sockets en PHP.

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

Cette fonction est utilisée pour créer un socket. Elle a trois paramètres et la valeur de retour est un handle (ressource).

$domain précise la famille de protocoles de communication utilisée lors de la création du socket. Les valeurs facultatives sont :

  • AF_INET : Protocole Internet basé sur IPv4

  • AF_INET6 : Protocole Internet basé sur IPv6

  • AF_UNIX : protocole de communication local UNIX

$type spécifie le type d'interaction de la communication socket, qui est facultatif La valeur est :

  • SOCK_STREAM : fournit une transmission de flux d'octets sérialisée, fiable, en duplex intégral, basée sur la connexion, prend en charge TCP

  • SOCK_DGRAM : fournit un type de datagramme, sans connexion, d'une longueur maximale fixe, une transmission de fonction d'adressage automatique, prend en charge UDP

  • SOCK_SEQPACKET : fournit une transmission de datagrammes sérialisée, fiable, à double canal et basée sur la connexion.

  • SOCK_RAW : fournit un protocole d'accès réseau original, peut construire manuellement des sockets de types de protocoles spéciaux, prend en charge les requêtes ICMP (telles que ping)

  • SOCK_RDM : fournit une transmission de datagramme fiable, la commande ne peut pas être garantie

$protocol spécifie le protocole de transmission spécifique utilisé par le socket, notamment ICMP, UDP et TCP. La constante SOL_UDP correspond à UDP et la constante SOL_TCP correspond à la constante. TCP.

2. socket_bind ( ressource $socket , chaîne $adresse [, int $port = 0 ] )

Cette fonction est utilisée Liez l'adresse IP et le port au handle créé par socket_create. Il a trois paramètres et renvoie une valeur booléenne.

$socket est un paramètre obligatoire, représentant le handle créé par la fonction socket_create

$address est un paramètre obligatoire, représentant l'adresse IP à lier

$port est un paramètre facultatif, représentant le numéro de port à lier. Il spécifie quel port est utilisé pour surveiller les connexions de socket lorsque le. La fonction socket_create est la première. Lorsque le premier paramètre est AF_INET, ce paramètre doit être spécifié.

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

Cette fonction est utilisée pour surveillance La connexion socket à laquelle accéder ne peut être utilisée que lorsque le type d'interaction de la socket est SOCK_STREAM ou SOCK_SEQPACKET . Deux paramètres, renvoie une valeur booléenne.

$socket est un paramètre obligatoire, représentant le handle créé par la fonction socket_create (et a été lié à l'hôte )

$backlog est un paramètre facultatif, indiquant le nombre maximum de connexions en attente de traitement dans la file d'attente (backlog autorisé).

4.

socket_set_block ( ressource $socket )Cette fonction est utilisée pour définir le handle du socket en mode blocage. Elle n'a qu'un seul paramètre obligatoire et renvoie une valeur booléenne. Il peut convertir un socket en mode non bloquant en mode bloquant.

Lors de l'exécution d'une opération (réception, envoi, connexion, acceptation, etc.) dans un socket en mode blocage, le script suspendra l'exécution jusqu'à ce qu'il reçoive un signal ou termine l'opération.

$socket est un paramètre obligatoire, représentant un handle de socket valide (créé par socket_create ou socket_accept).

Une brève introduction à la différence entre le mode bloquant et le mode non bloquant :

Non bloquant signifie que l'opération de fonction ne bloquera pas le thread actuel jusqu'à ce que le résultat ne puisse pas être obtenu immédiatement, mais reviendra immédiatement. Le blocage signifie que vous n'êtes pas autorisé à revenir tant que vous n'avez pas terminé le travail. Vous devez obtenir une réponse de l'autre partie avant de pouvoir passer à l'étape suivante. Surtout lorsqu'il y a de nombreux utilisateurs, il est nécessaire de le régler sur non bloquant. S'il s'agit du mode blocage, si deux clients sont connectés en même temps, lorsque le serveur traite la demande d'un client, la demande de l'autre client sera bloquée. Ce n'est qu'après le traitement des affaires du client précédent que la demande de ce dernier client sera traitée. sera répondu.

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

Cette fonction est utilisée pour écrire des données tampon d'une taille spécifiée sur le socket. Elle a trois paramètres et renvoie le nombre d'octets des données écrites.

$socket est un paramètre obligatoire et représente un handle de socket valide.

$buffer est un paramètre obligatoire, spécifiant les données de chaîne à écrire.

$length est un paramètre facultatif, spécifiant le nombre d'octets de données écrits tour à tour dans le socket, si sa valeur est supérieure que 🎜>Le nombre d'octets dans $buffer, il interceptera silencieusement jusqu'à la longueur de $buffer en octets.

6. socket_read ( ressource $socket , int $length [, int $type = PHP_BINARY_READ ] )Cette fonction est utilisée pour lire des données d'une longueur d'octet spécifiée à partir du socket. Elle a trois paramètres et renvoie les données de chaîne lues.

$socket est un paramètre obligatoire et représente un handle de socket valide.
$length est un paramètre obligatoire, spécifiant la longueur des octets à lire.

$type est un paramètre facultatif. La valeur par défaut est PHP_BINARY_READ, ce qui signifie une lecture sécurisée des données binaires ; PHP_NORMAL_READ signifie arrêter la lecture lorsque r ou n est rencontré.

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

Cette fonction est utilisée pour implémenter une connexion socket persistante, c'est-à-dire une connexion longue, et renvoie un handle. La différence entre celui-ci et fsockopen est que la connexion établie par pfsockopen ne sera pas déconnectée une fois le script exécuté.

8.

socket_set_option ( ressource$socket , int$level , int$optname , mixed$optval )Cette fonction est utilisée pour définir les options de contrôle du socket. Elle possède quatre paramètres et renvoie une valeur booléenne.

$socket est un paramètre obligatoire et représente un handle de socket valide.

$level est un paramètre obligatoire, spécifiant le niveau de protocole auquel le l'option fonctionne. , prenez généralement la constante SOL_SOCKET.

$optname est un paramètre obligatoire, spécifié Le nom de l’option à contrôler. $optval Est un paramètre obligatoire qui spécifie la valeur de l'option.

9. socket_last_error ([ ressource$socket ] )

Cette fonction est utilisée pour obtenir le dernier code d'erreur généré par n'importe quelle fonction socket, et la valeur de retour est un entier.

10. >$errno )Cette fonction est utilisée pour obtenir la description de l'erreur représentée par le code d'erreur, et la valeur de retour est une chaîne . En tant que programmeur non bas niveau, il est très difficile de comprendre en profondeur le mécanisme d'implémentation interne du socket. Il nous suffit de comprendre que le socket est un ensemble de fonctions encapsulées par le système d'exploitation pour implémenter la communication de processus. . Il va créer et il suffit d'appeler. Les caractéristiques du langage et le positionnement de PHP déterminent qu'il ne convient qu'aux clients socket, mais pas aux serveurs socket. Étant donné que le socket est principalement orienté vers la couche inférieure et le développement de services réseau, le côté serveur est généralement implémenté dans des langages tels que C ou Java. Cela peut mieux faire fonctionner la couche inférieure et résoudre les problèmes rencontrés dans le développement de services réseau. (comme la concurrence, le blocage, etc.) Il existe également des solutions matures et complètes, mais PHP n'est évidemment pas adapté à ce scénario d'application. En fait, PHP exploite la base de données MySQL via des sockets. C'est précisément parce que les sockets protègent le protocole sous-jacent, simplifiant ainsi l'interconnexion entre les services réseau. En plus des sockets implémentés dans les langages traditionnels côté serveur, avec la popularité du HTML5, les WebSockets implémentés dans les clients de navigateur émergent également progressivement. FlashSocket est également une bonne solution.

Pour faire fonctionner le socket sur le client, vous pouvez utiliser des fonctions telles que fsockopen, socket_create ou stream_socket_client si c'est le cas. PHP5, il est recommandé d'utiliser stream_socket_client.

Exemple d'application interactive Socket : utilisez socket pour soumettre un formulaire

Créez un nouveau fichier test.php sur

http : // demo.com/index.php?id=1 Soumettez les données du formulaire, le code est le suivant

[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连接
?>

Les points suivants sont à noter :

  • 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事务处理操作示例


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn