2011-09-22 1 views
1

J'ai un service web écrit en PHP auquel une application iPhone se connecte. Lorsque l'application appelle le service, une série de messages de notification sont envoyés au serveur APN d'Apple afin qu'il puisse envoyer des notifications Push à d'autres utilisateurs de l'application.Service web PHP, envoyer une réponse avant la fin de l'exécution du script

Ce processus peut prendre du temps dans certains cas et mon application doit attendre longtemps avant d'obtenir une réponse. La réponse est totalement indépendante du résultat des messages de notification envoyés au serveur APNs. Par conséquent, je voudrais que le service Web renvoie la réponse à l'application indépendamment du fait que les messages aux APN ont été envoyés.

J'ai essayé d'utiliser pcntl_fork pour résoudre le problème:

<?php 
... 
$pid = pcntl_fork(); 
if($pid == -1) 
{ 
    // Could not fork (send response anyway) 
    echo "response"; 
} 
else if($pid) 
{ 
    // Parent process - send response to app 
    echo "response"; 
} 
else 
{ 
    // Child process - send messages to APNs then die 
    sendMessageAPNs($token_array); 
    die(); 
} 
?> // end of script 

Malheureusement, le processus parent semble attendre que le processus de l'enfant à la fin avant d'envoyer la réponse même si je ne l'utilise pcntl_wait dans le processus parent. Est-ce que je fais quelque chose de mal ou est ce comportement normal? Si c'est normal, y a-t-il une autre façon de résoudre ce problème?

Merci!

Répondre

0

Si vous hébergez le processus PHP dans Apache alors vous devriez vraiment pas utiliser: voir this pour la section qui dit * Process Control ne devrait pas être activé dans un environnement de serveur Web et des résultats inattendus peuvent se produire si des fonctions de contrôle de processus sont utilisées dans un environnement de serveur Web. *.

Vous devez probablement configurer un démon distinct dans la langue de votre choix et transmettre les tâches de communication APNS à cet endroit. Si vraiment vous devez vraiment vraiment essayer d'utiliser ob_flush().

+0

J'ai essayé ob_flush() suivi d'un flush() car il semble que le premier ne soit pas suffisant pour garantir l'envoi de la réponse. Malheureusement, cela a également envoyé des informations sur le backend PHP dans la réponse. La méthode démon est probablement la meilleure solution, mais je n'ai pas eu le temps de l'implémenter. J'ai donc envoyé une seconde requête à un autre service web de mon application pour gérer les notifications séparément. – rickholt

0

Je pense que vous pouvez renvoyer la réponse avant d'effectuer le processus "long". Jetez un oeil à la fonction flush() de PHP, il va peut-être aider

Questions connexes