有一个操作,我发送了一些值,如果一切正常,我返回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
....
}先谢谢你...
发布于 2012-12-04 03:51:48
我找到了一个完美的解决方案,因为我不期望任何结果值。如果无法发送通知...我会将其记录到我数据库中。
这是我用来发送"async“请求的函数(是的,这不是一个异步请求,但它的工作方式是我想要的)
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-03 20:02:26
由于PHP本身并不支持线程或异步函数调用,因此您必须使用一种老套的解决方案。看看我这里的问题:PHP file_get_contents() follow Content-length header
解决方案是发送一个Connection: Close和Content-Length报头,然后让客户端知道这些报头(参见上面的链接)。例如,在curl的情况下,一旦达到Content-Length,连接就会关闭,但PHP脚本仍然在“后台”运行,因此您可以在那时开始耗时的操作。
致以亲切的问候,
斯特凡
备注:如果脚本执行时间过长,请确保PHP最大执行时间不会影响您的工作
发布于 2012-12-03 20:02:36
是的,这是可能的。
你应该看看PHP exec()和this链接。您应该在控制器中设置一个从命令行调用的函数。然后,您将传入要使用的GCM/APNS数据的数组。
这种解决方案并不理想,因为您无法告诉客户端所有消息都已成功发送。你只需要发回200,告诉他们请求已经收到,一切正常。
https://stackoverflow.com/questions/13682695
复制相似问题