5

我正在使用 codeIgniter RESTful API (https://github.com/philsturgeon/codeigniter-restserver) 将信息(json 格式)返回到我的 android/iphone 应用程序。

有一个操作我发送一些值,如果一切正常,我返回 200 代码作为响应。

现在,我想以相同的方法添加一个新操作:使用 APNS(Apple Push Notificacion Service)和 GCM(Google Cloud Messaging)发送此修改的通知。

当我必须发送不超过 3-5 个通知时,它运行良好,问题是 APNS,因为我必须一一发送此消息并且需要很长时间,所以我的应用程序收到超时异常(所有通知都是已发送但用户收到错误连接...)

我可以发送 200 代码响应,然后继续发送此通知吗?(像这样的东西......)

function my_update_method_post(){
   //....GET my POST values
   update($data);
   $this->response(array('result'=>1),200));


   //Send Notifications
   ....
}

提前致谢...

4

4 回答 4

2

我找到了一个非常适合我的解决方案,因为我不期望任何结果值。如果无法发送通知...我将其记录在我的数据库中。

这是我用来发送“异步”请求的函数(是的,这不是异步请求,但它可以按照我的要求工作)

function curl_post_async($url, $params)
{
    $post_string = http_build_query($params);
    $parts=parse_url($url);

    $fp = fsockopen($parts['host'],
        isset($parts['port'])?$parts['port']:80,
        $errno, $errstr, 30);

    if(!$fp)
    {
        //Perform whatever logging you want to have happen b/c this call failed!    
    }
    $out = "POST ".$parts['path']." HTTP/1.1\r\n";
    $out.= "Host: ".$parts['host']."\r\n";
    $out.= "Content-Type: application/x-www-form-urlencoded\r\n";
    $out.= "Content-Length: ".strlen($post_string)."\r\n";
    $out.= "Connection: Close\r\n\r\n";
    if (isset($post_string)) $out.= $post_string;

    fwrite($fp, $out);
    fclose($fp);
}
于 2012-12-03T19:51:48.133 回答
1

由于 PHP 本身不支持线程或异步函数调用,您将不得不使用一种 hacky 解决方案。看看我的问题:PHP file_get_contents() follow Content-length header

解决方案是发送一个Connection: CloseContent-Length头,然后让客户端知道这些头(见上面的链接)。例如,在 curl 的情况下,一旦达到 Content-Length,连接就会关闭,但您的 PHP 脚本仍然“在后台”运行,因此您可以开始耗时的操作。

亲切的问候,

斯特凡

PS 如果脚本需要很长时间才能执行,请确保 PHP 最大执行时间不会妨碍您

于 2012-12-03T12:02:25.783 回答
1

是的,这是可能的。

你应该看看PHP exec()这个链接。您应该在控制器中设置一个函数,以便从命令行调用。然后,您将传入要使用的 GCM/APNS 数据数组。

此解决方案并不理想,因为您将无法告诉客户端所有消息都已成功发送。您将发回 200 表示请求已收到,仅此而已。

于 2012-12-03T12:02:36.297 回答
0

看看这篇文章。我喜欢这个解决方案不仅仅是让客户端告诉服务器立即挂断;如果您在服务器端构建此解决方案,会有多种好处。

  1. 您知道一旦客户端断开连接,服务器将继续处理
  2. 客户端仍然可以收到来自服务器的响应

编辑

我没有意识到 OP 无法访问此处的服务。在这种情况下,我提到的文章没有什么价值。这里的问题是服务器需要很长时间才能响应并挂起客户端。为此,我建议curl_multi_init。这允许您同时发出多个请求。

于 2013-10-03T04:46:15.100 回答