2012-05-01 10 views
4

J'écris une application Android qui utilise C2DM. Lorsqu'un utilisateur envoie un message au serveur, le serveur répond à l'expéditeur et transmet ce message à un ensemble d'autres utilisateurs du réseau.Comment implémenter ce scénario en utilisant PHP?

Le problème est que la réponse à l'expéditeur est retardée jusqu'à ce que le message soit transmis à tous les autres. Cela prend beaucoup de temps. Je veux d'abord que la réponse soit renvoyée à l'expéditeur, puis exécute le processus de transfert. Comment puis-je atteindre cet objectif...? Si je peux utiliser le traitement parallèle, comment puis-je le faire en PHP ...? Toute aide serait très appréciée :)

Je l'ai utilisé quelque chose comme ça,

print(json_encode("Inserted Successfully"));//." ".count($tags))); 

while($row = mysql_fetch_row($result)) 
{ 
    $id = $row[0]; 
    sendMessageToUserID($id,"New Question !!",$ques_id,"yyyy"); 
} 

Mais, ici « Inséré avec succès » n'est pas envoyé à l'expéditeur, jusqu'à ce que la boucle while est exécutée.

+0

Vous pouvez essayer de forcer le tampon de rinçage rapide. Notez cependant: 'Certaines versions de Microsoft Internet Explorer commencent seulement à afficher la page après avoir reçu 256 octets de sortie, vous devrez peut-être envoyer des espaces supplémentaires avant le vidage pour que ces navigateurs affichent la page. Une meilleure approche dans le plus grand schéma consiste à laisser une tâche d'arrière-plan (par exemple cron ou une sorte de file d'attente de travaux/messages) gérer la partie lente de manière asynchrone. –

+0

J'ai essayé d'utiliser flush() après l'instruction print dans le code ci-dessus, mais cela ne faisait aucune différence. J'ai entendu dire que les jobs cron ne fonctionneraient que sous Linux, éclairez-moi si je me trompe. Est-ce qu'il y a un autre moyen ? – Kishan

+1

Chaque système d'exploitation a une sorte de planification de processus, par exemple: http://stackoverflow.com/questions/132971/what-is-the-windows-version-of-cron –

Répondre

6

Je ne sais pas si cela va fonctionner, mais vous pouvez essayer d'ajouter Content-Length: et Connection: close en-têtes, et bien sûr la sortie explicitement de rinçage.

EDIT: essayer cette

ob_start(); 
//output 
header("Content-Length: ".ob_get_length()); 
header("Connection: close"); 
ob_end_flush(); 
//do other stuff 
+0

Comment vidanger explicitement la sortie? Et comment cela va m'aider ici ..? – Kishan

+0

Vous pouvez utiliser [flush] (http://www.php.net/manual/fr/function.flush.php) ou comme Dan suggéré [ob_implicit_flush] (http://www.php.net/manual/fr/ function.ob-implicit-flush.php). Ce que je pense est que si le client attend une certaine quantité de données et l'obtient, il ne devrait pas avoir besoin d'attendre que le serveur ferme la connexion. – Musa

+0

Ouais j'ai utilisé flush() après la déclaration d'impression dans le code, mais cela n'a fait aucune différence. Le retard n'a pas diminué du tout. – Kishan

Questions connexes