首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用PHP从APNS获取错误

使用PHP从APNS获取错误
EN

Stack Overflow用户
提问于 2011-02-22 02:50:33
回答 2查看 2.7K关注 0票数 2

我使用自己编写的脚本发送推送通知与PHP的APNS。为了能够处理错误,我使用了推送通知的扩展格式,并希望从流中获取结果:

代码语言:javascript
复制
   // $apns = a stream_socket_client connection
   $apnsMessage  = pack('CNNnH*', 1, $i, $pnDetails['expiration_time'], 32, $pnDetails['token']);
   $apnsMessage .= pack('n', strlen($pnDetails['payload']));
   $apnsMessage .= $pnDetails['payload'];
   fwrite($apns, $apnsMessage);

   // Check for errors
   $errorResponse = @fread($apns, 6)
   if ($errorResponse != FALSE) {
    $unpackedError = unpack('Ccommand/CstatusCode/Nidentifier', $errorResponse);
   }

我在apns-php项目中看到了非常类似的做法,然而,在我的例子中,脚本总是在fread行无限期地等待,因为它试图读取不存在的数据(Apple只在出现错误时才发送响应)。我一直在寻找方法来判断是否有新的数据要从TCP流中读取,但是,我找不到任何方法,并且可用于HTTP调用的流回调方法也不适用于“原始”TCP连接。

我如何转换我的脚本,以确保它只在实际有数据要读取时才调用fread?apns-php项目是如何解决这个问题的(据我所知,他们只是在调用fread )?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-22 21:33:34

弄清楚了,最后的提示来自Erwin。诀窍是用stream_set_blocking解除阻塞,现在我只需要等待一段时间,然后再用fread获取结果,以确保苹果有足够的时间响应。

票数 1
EN

Stack Overflow用户

发布于 2011-02-22 15:16:00

您是否连接到正确的主机ssl://feedback.push.apple.com:2196

它们使用以下调用来连接和读取数据:

stream_context_create -> stream_socket_client -> stream_set_blocking (0) -> stream_set_write_buffer (0) -> while (!feof($socket)) {} -> fread (8192) -> stream_select (带超时)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5069962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档