PHP web服务,在脚本执行结束前发送响应


PHP web service, send response before end of script execution

我有一个用PHP编写的web服务,iPhone应用程序连接到。当应用程序调用该服务时,一系列通知消息被发送到苹果的APNs服务器,这样它就可以向应用程序的其他用户发送推送通知。

在某些情况下,这个过程可能很耗时,我的应用程序必须等待很长时间才能得到响应。响应完全独立于发送到APNs服务器的通知消息的结果。

因此,我希望web服务将响应发送回应用程序,而不管发给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。是我做错了什么还是这是正常的行为?如果这是正常的,那我还有别的办法解决这个问题吗?

谢谢!

如果你在Apache中托管PHP进程,那么你真的不应该使用这个:参见* process Control不应该在web服务器环境中启用,如果在web服务器环境中使用任何process Control函数可能会发生意想不到的结果。* .

您可能应该用您选择的首选语言设置一个单独的守护进程,并将APNS通信任务交给该守护进程。如果你真的真的必须使用ob_flush()

我认为您可以在执行"长"流程之前将响应发送回来。看一下PHP的flush()函数可能会有帮助