我有一个用 PHP 编写的网络服务,iPhone 应用程序连接到该网络服务。当应用程序调用该服务时,一系列通知消息会发送到 Apple 的 APNs 服务器,以便它可以向应用程序的其他用户发送推送通知。
在某些情况下,此过程可能很耗时,我的应用必须等待很长时间才能收到响应。响应完全独立于发送到 APNs 服务器的通知消息的结果。
因此,我希望网络服务将响应发送回应用程序,而不管是否已发送到 APNs 的消息。
我尝试使用 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 进程,那么您真的不应该使用它:参见 this对于说 *Process Control should not be enabled within a web server environment 的部分,如果在 web 服务器环境中使用任何 Process Control 功能,则可能会发生意外结果。 *.
您可能应该使用您选择的首选语言设置一个单独的守护进程,并将 APNS 通信任务交给它。如果你真的真的真的必须尝试使用 ob_flush()
.
关于PHP Web服务,在脚本执行结束前发送响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7522090/