2016-08-08 1 views
1

Création d'une connexion de socket Web à l'aide du cliquet php. J'ai connecté un client et ensuite exécuté une requête (il faudra environ 20 secondes pour exécuter la requête) pendant ce temps j'essaye de connecter un autre client et je vois que la connexion du socket Web est en attente (essayant toujours de changer de protocole) . Plus tard quand la réponse est venue pour la demande initiale, je vois que le serveur imprime 'new connection established' (j'ai gardé cette instruction dans ma fonction onOpen).Boucle d'événements à cliquet bloquée

Si la réaction de php fonctionne sur le même principe que NodeJs alors même si le traitement prend beaucoup de temps, la connexion ne devrait-elle pas s'établir?

Pourquoi la connexion du socket Web est-elle bloquée en raison de la partie d'exécution ultérieure?

Répondre

0

Eh bien, ce n'est pas tout à fait exact. Ratchet PHP et NodeJS ne sont pas des pois dans un pod. Ils ne fonctionnent pas exactement de la même manière. Ce que fait Ratchet PHP, utilise des flux d'E/S non bloquants. C'est tout, depuis les connexions TCP/IP faites à votre serveur WS, jusqu'aux autres connexions IO facilitées par le framework.

Cependant, vous répondez que vous exécutez une requête, que je suppose être une requête de base de données? Si vous avez établi vous-même la connexion à cette base de données et non via la fonction de flux d'E/S non bloquante de Ratchet, la requête de base de données se passe sur un socket TCP/UNIX bloquant. Ce qui veut dire que PHP doit s'asseoir à et attendre que vos dbms répondent à la requête avant de pouvoir continuer à exécuter du code. Pendant ce temps, votre serveur WebSocket ne peut pas répondre à d'autres demandes, accepter d'autres connexions ou même exécuter une autre ligne de code jusqu'à ce que le système de base de données réponde, car le socket TCP est dans un état WAIT. Il est juste assis dans l'attente de données à venir dans le tuyau.

+1

Alors, comment utilisez-vous la fonction de flux d'E/S sans blocage au lieu de créer vous-même la connexion à la base de données? – TheStoryCoder