2010-02-10 5 views
2

Je suis en train de développer une application Web de discussion basée sur le protocole MSN. Le serveur communique avec le serveur MSN via une ressource de fichier renvoyée par fsockopen(). Le client accède au serveur via XMLHttpRequest. Le serveur se connecte initialement et imprime la liste de contacts (formatée dans une table HTML) que le client reçoit via le responseText() de l'objet XMLHttpRequest.Persistance des ressources de fichiers en PHP

Voici le problème. La ressource de fichier responsable de la communication avec le serveur MSN doit être maintenue active pour que toutes les fonctions liées au chat fonctionnent (création de conversations, suivi des changements d'état hors ligne/en ligne, etc.). Cependant, pour que le XMLHttpRequest se termine, le script PHP doit terminer l'exécution. Ce qui signifie que le client ne recevra aucune réponse du XMLHttpRequest tant que la session de conversation est en cours.

Pire encore, une ressource de fichier ne peut pas être sérialisée, ce qui signifie que je ne peux pas simplement stocker la session de conversation dans un espace réservé $_SESSION []. Donc, ma question est, est-il possible pour moi de «transférer» une ressource de fichier d'un fichier à un autre?

Répondre

0

Une solution possible serait d'avoir un script PHP sur le serveur qui ne se termine pas; De cette façon, la ressource correspondant à l'appel fsockopen ne sera jamais supprimée et la connexion ne sera pas fermée. À ce sujet, vous voudrez peut-être chercher le terme «comet»; l'idée de base est d'avoir un script qui s'exécute pour toujours sur le serveur, qui envoie des mises à jour au client chaque fois que cela est nécessaire. Au lieu de demander au navigateur d'envoyer une requête Ajax toutes les X secondes, vous gardez une connexion ouverte entre le client et le serveur. Notez que malheureusement, on dit souvent que PHP n'est pas le meilleur outil pour cela. emploi ...

sur stackoverflow: [php] comet

0

la ressource ne peut pas survivre à la fin de la demande à moins que vous créez extension PHP qu'il fait (comme les connexions MySQL persistantes font avec mysql_pconnect() par exemple). Cependant, vous pouvez utiliser la technologie Comet et par exemple Bayeux protocol pris en charge par la boîte à outils Dojo, entre autres, pour parler au serveur. Cela nécessiterait soit un serveur autonome, soit une demande de longue durée, dans ce dernier cas, assurez-vous que les limites de temps de PHP et du serveur web ne tueraient pas cette requête trop longtemps.

2

Dans la plupart des langues, il n'est pas possible de passer les handles de fichiers entre les applications - AFAIK la plupart des systèmes d'exploitation ne le permettent pas non plus.

La solution consiste à faire fonctionner le processus serveur en tant que démon, ce qui signifie qu'il doit être exécuté en dehors du serveur Web.

Voir

http://symcbean.blogspot.com/2010/02/php-and-long-running-processes.html

et

http://www.phpclasses.org/browse/package/5758.html

C.

0

Merci à tous pour les suggestions. Avant de commencer ce projet, j'avais envisagé d'utiliser la technologie des comètes, mais je me suis prononcé contre (PHP/Apache ne semble pas bien mettre en œuvre).Je suis venu avec une solution piratée ensemble, pas le plus élégant mais réalisable.

Un script PHP est responsable de la communication du serveur MSN, il s'exécutera tant que l'utilisateur est actif. Il écrit les données dans un fichier (email_out), et lit les données d'un fichier (email_in). Chaque fois que le client envoie une requête AJAX, un script PHP séparé écrira toutes les données POST dans le fichier (email_in) et retournera toutes les données de (email_out). Les deux scripts ne liront/n'écriront pas de données avant d'avoir finalement accès au fichier (car il y aura des combats pour la ressource de fichier).

Je ne sais pas, des suggestions? Cette certitude n'est pas le moyen le plus efficace de faire les choses, mais c'est vraiment la seule solution PHP/Apache que je puisse penser.

Questions connexes