Prise en main persistante du domaine local dans php

Les réponses que j'ai trouvées à cette question (telles que ici , ici , et ici ) concernent tous pfsockopen (), qui semble orienté vers des connexions de socket non locales. Cependant, le code que j'ai écrit jusqu'à présent utilise php pour accéder à un serveur C ++ via une connexion locale. Je veux que cette connexion soit persistante (de sorte que je puisse l'utiliser pour Comet, par ailleurs). Voici ma version non persistante:

<?php session_start(); ... if (($sock = socket_create(AF_UNIX, SOCK_STREAM,0)) === false) { echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n"; exit(); } $sess_id = $_SESSION['sess_id']; $sock_str = '/tmp/sockdir/' . $sess_id; //The socket is named after the php session, not important if (socket_connect($sock, $sock_str) === false) { echo "socket_connect() to " . $sock_str . " failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n"; socket_close($sock); exit(); } $msg = $_GET['message']; // ... do things with $msg socket_close($sock); ?> 

Maintenant, je ne peux pas simplement sauvegarder '$ sock' en tant que variable $ _SESSION et je l'accède à chaque fois que ce script est appelé, j'ai trouvé. Des conseils sur ce que je peux faire pour transformer cela en une connexion persistante?

Comme les liens que vous avez indiqués soulignent, php n'est pas une langue persistante et il n'y a aucun moyen d'avoir une persistance entre les sessions (c'est-à-dire les charges de page). Vous pouvez créer un terrain intermédiaire en exécutant un deuxième script php en tant que démon, et que votre script principal (c'est-à-dire celui auquel l'utilisateur frappe) se connecte à cela (oui – sur un socket …) et en extrayez des données.

Si vous deviez faire cela et que vous souhaitez éviter le fric de Sockets Web, essayez la nouvelle API HTML5 EventStream , car elle vous offre le meilleur des deux mondes: une infrastructure similaire à celle-ci sans la contrainte de l'enquête longue ou la nécessité d'une Serveur Web Sockets dédié.

Si vous devez garder la connexion ouverte, vous devez garder le script PHP ouvert. Généralement, PHP est simplement invoqué puis fermé après l'exécution du script (CGI, CLI), ou c'est un mélange (mod_php dans apache, FCGI) dans lequel parfois l'interpréteur PHP reste en mémoire après la fin de votre script (donc tout ce qui est associé à la Le système d'exploitation à ce processus resterait toujours comme une prise socket).

Cependant, cela n'est jamais sauvegardé. Au lieu de cela, vous devez faire de PHP un démon qui peut garder vos scripts PHP en mémoire. Une solution existante pour cela est Appserver-In-PHP . Il gardera votre code en mémoire jusqu'à ce que vous redéfiniez le serveur. Comme le code, vous pouvez également conserver les variables entre les requêtes, par exemple une poignée de connexion.