2010-02-20 3 views
0

Je suis bifurquer avec ce code:PHP bifurquer php-FPM avec pcntl_fork()

echo "1. posix_getpid()=".posix_getpid().", posix_getppid()=".posix_getppid()."\n"; 

$pid = pcntl_fork(); 
var_dump($pid); 
if ($pid == -1) die("could not fork"); 

if ($pid) { 
//parent 
echo "2. pid=".$pid.", posix_getpid()=".posix_getpid().", posix_getppid()=".posix_getppid()."\n"; 
} else { 
//child 
$sid = posix_setsid(); 

if ($sid < 0) 
exit; 

echo "3. pid=".$pid.", posix_getpid()=".posix_getpid().", posix_getppid()=".posix_getppid()."\n"; 

$fp = fopen("/tmp/testfile", "w"); 
fwrite($fp, '$data'); 
fclose($fp); 

} 

Pour une raison quelconque parfois le bloc else est envoyé au navigateur, et parfois si ($ pid) bloc est affiché. Ce que j'essaie de réaliser est d'envoyer une réponse, puis de poursuivre le traitement après la fermeture de la connexion avec le client. Puis fermez-vous enfin après que le traitement post-requête est terminé. Si je dors chez l'enfant ou le parent, la demande est suspendue.

Les deux parties sont en cours d'exécution cependant, c'est juste bizarre de déterminer lequel est envoyé au navigateur.

Merci d'avance.

Répondre

0

Envisagez d'utiliser ignore_user_abort() à la place.

+0

Parce qu'il semble que la connexion au client est maintenue jusqu'à ce que l'utilisateur abandonne. – Chris

2

En fait, vous devez utiliser fastcgi_finish_request() pour envoyer la réponse au navigateur, puis continuer à travailler en arrière-plan. Gardez à l'esprit que cela fonctionne UNIQUEMENT lorsque vous utilisez PHP-FPM.

Remarque: la fonction fastcgi_finish_request() n'est pas documentée dans le manuel PHP (voir bug 61449) mais l'utilisation est assez simple.

Comme pour ignore_user_abort(), certains commentaires sur php.net suggèrent d'utiliser l'en-tête Content-Length: 0 avec, mais cela posera des problèmes lors de l'utilisation de SSL avec Internet Explorer. Puis-je également fermer explicitement la connexion?