我有一个用PHP编写的Web服务,iPhone应用程序连接到该服务。当应用程序调用该服务时,会向Apple的APNs服务器发送一系列通知消息,以便它可以将推送通知发送给该应用程序的其他用户。
在某些情况下,此过程可能非常耗时,我的应用必须等待很长时间才能收到回复。响应完全独立于发送到APNs服务器的通知消息的结果。
因此,无论是否已发送到APN的消息,我都希望Web服务将响应发送回应用程序。
我尝试使用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。我做错了什么还是这种正常行为?如果这是正常的,那么还有另一种方法可以解决这个问题吗?
谢谢!
答案 0 :(得分:0)
我认为你可以在做“漫长”过程之前发回回复。看看PHP的flush()功能,它可能会有所帮助
答案 1 :(得分:0)
如果您在Apache中托管PHP进程,那么您真的不应该使用它:请参阅this部分,其中说明* 不应在Web服务器环境中启用Process Control并且意外如果在Web服务器环境中使用任何过程控制功能,则可能会发生结果。 *
您可能应该使用您选择的首选语言设置一个单独的守护程序,并将APNS通信任务交给它。如果你真的真的必须尝试使用ob_flush()
。