Веб-сервис PHP, отправьте ответ до завершения выполнения скрипта - PullRequest
1 голос
/ 23 сентября 2011

У меня есть веб-сервис, написанный на PHP, к которому подключается приложение iPhone.Когда приложение вызывает службу, на сервер APN от Apple отправляется серия уведомлений, после чего она может отправлять push-уведомления другим пользователям приложения.

В некоторых случаях этот процесс может занимать много времени, и мое приложениеприходится долго ждать, прежде чем получить ответ.Ответ полностью не зависит от результата отправки уведомительных сообщений на сервер APN.

Поэтому я хотел бы, чтобы веб-служба отправляла ответ обратно приложению независимо от того, были ли отправлены сообщения в APN.

Я попытался использовать pcntl_fork для решения проблемы:

<?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

К сожалению, похоже, что родительский процесс ожидает завершения дочернего процесса, прежде чем отправлять ответ, хотя я не использую pcntl_wait в родительском процессе.Я делаю что-то не так или это нормальное поведение?Если это нормально, то есть ли другой способ решить эту проблему?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 23 сентября 2011

Если вы размещаете процесс PHP в Apache, то вам действительно не следует использовать это: см. это для раздела, который говорит: * Управление процессом не должно быть включено в среде веб-сервера и неожиданные результаты могут произойти, если какие-либо функции управления процессом используются в среде веб-сервера. *.

Вам, вероятно, следует установить отдельного демона на предпочитаемом вами языке и передать ему задачи связи APNS. Если вы действительно действительно должны попробовать использовать ob_flush().

0 голосов
/ 23 сентября 2011

Я думаю, что вы можете отправить ответ обратно перед выполнением "длинного" процесса.Взгляните на функцию PHP * flush () , это может помочь

...