Maison  >  Article  >  cadre php  >  la réception de Swoole n'est pas déclenchée

la réception de Swoole n'est pas déclenchée

(*-*)浩
(*-*)浩original
2019-12-14 14:13:012513parcourir

la réception de Swoole n'est pas déclenchée

onReceive

Cette fonction est rappelée lorsque des données sont reçues, ce qui se produit dans le processus de travail. Prototype de fonction : (Apprentissage recommandé : tutoriel vidéo swoole)

function onReceive(swoole_server $server, int $fd, int $reactor_id, string $data);

$server, Objet serveur

$fd, l'identifiant unique de la connexion client TCP

$reactor_id, l'ID du thread Reactor où se trouve la connexion TCP

$data, le contenu des données reçues peut être du texte ou du contenu binaire

À propos de $fd et $ Explication détaillée de réacteur_id

L'option de protocole automatique n'est pas activée, le maximum de données reçues par onReceive à la fois est de 64K

L'option de traitement automatique du protocole est activée, onReceive recevra le paquet de données complet, le maximum ne dépasse pas package_max_length

Prend en charge le format binaire, $data peut être des données binaires

Utilisez le protocole open_eof_check/open_length_check/open_http_protocol fourni par la couche inférieure pour garantir l'intégrité du paquet de données

N'utilisez pas le traitement du protocole sous-jacent, analysez les données et fusionnez/divisez vous-même les paquets de données dans le code PHP après onReceive.

Par exemple : vous pouvez ajouter un $buffer = array() au code et utiliser $fd comme clé pour enregistrer les données de contexte. Chaque fois que des données sont reçues, un épissage de chaîne est effectué, $buffer[$fd] .= $data, puis il est jugé si la chaîne $buffer[$fd] est un paquet de données complet.

Par défaut, le même fd sera attribué au même Worker, afin que les données puissent être fusionnées. Lors de l'utilisation de dispatch_mode = 3.

La demande de données est préventive et les données envoyées depuis le même fd peuvent être divisées en différents processus. Par conséquent, la méthode d'épissage de paquets ci-dessus ne peut pas être utilisée

Concernant les problèmes de collage de paquets tels que le protocole SMTP, le client peut émettre 2 instructions en même temps. Il peut être reçu sur le serveur en une seule fois, auquel cas la couche application doit le décompresser elle-même. SMTP est sous-packagé via rn, donc éclater("rn", $data) est nécessaire dans le code métier pour diviser les paquets de données.

S'il s'agit d'un service de requête-réponse, il n'est pas nécessaire d'envisager de diviser les données. La raison en est qu'une fois que le client a lancé une requête, il doit attendre que le serveur renvoie les données de réponse de la requête en cours avant de lancer une deuxième requête. Il n'enverra pas deux requêtes en même temps

.

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