【问题标题】:PHP don't wait for response / reply return immediatelyPHP 不等待响应/立即回复返回
【发布时间】:2012-07-26 11:03:44
【问题描述】:

我有一个用 PHP 编写的 Web 服务,一个 iPhone 应用程序连接到该服务。当应用调用该服务时,会向 Apple 的 APNs 服务器发送一系列通知消息,以便它可以向应用的其他用户发送推送通知。

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

因此,无论是否已向 APN 发送消息,我都希望 Web 服务将响应发送回应用程序。

我当前的代码:

<?
    <...>
    echo $chatID; // This has to be printed immediately
    include('apns.php'); // Just invoke this, dont wait for response! 
?>

我该怎么做?

【问题讨论】:

  • 在此语句之后立即添加flush(); echo $chatID; // This has to be printed immediately,然后再包括include('apns.php');
  • 我用过这个:stackoverflow.com/questions/962915/…这解决了!谢谢大家。

标签: php


【解决方案1】:

你应该关闭连接,然后像这样继续处理:

set_time_limit(0); 
ignore_user_abort(true);  

//start the output buffer
ob_start();

//process what needs to be returned to browser
echo $chatID;

//tell the browser not to expect any more content and close the connection
header("Content-Length: " . ob_get_length());
header("Connection: close");
ob_end_flush(); 
ob_flush(); 
flush(); 
//continue processing

【讨论】:

  • 是的,但是ob_start() 将开始输出缓冲,并且不会向浏览器发送任何输出,除了标题。 -1 给你,兄弟。
  • 当你可以简单地做header(); header(); echo; ob_flush(); flush();时,为什么还要做ob_start杂技呢?
  • 因为浏览器会立即关闭连接(ob_get_length() = 0)而不会获得所需的输出。计算输出长度,设置标题,回显输出和刷新,提供更多杂技,恕我直言。
【解决方案2】:

致电flush();;这将确保之前打印的任何数据立即发送给客户端。如果您使用输出缓冲,您需要先调用ob_flush();

【讨论】:

  • +1,但你应该添加 ob_flush() 和 session_write_close(),即使我认为 session 不会在 web 服务环境中使用
  • 这不起作用 - 它仍在等待包含完成。
  • 在包含文件中的任何代码完成之前,请求不会完成。但事情就是这样。
  • @ThiefMaster,你尝试过 session_write_close 吗?
猜你喜欢
  • 2015-04-22
  • 2013-05-01
  • 1970-01-01
  • 2013-11-02
  • 1970-01-01
  • 2023-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多