我使用自己编写的脚本发送推送通知与PHP的APNS。为了能够处理错误,我使用了推送通知的扩展格式,并希望从流中获取结果:
// $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 )?
发布于 2011-02-22 13:33:34
弄清楚了,最后的提示来自Erwin。诀窍是用stream_set_blocking解除阻塞,现在我只需要等待一段时间,然后再用fread获取结果,以确保苹果有足够的时间响应。
发布于 2011-02-22 07: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
(带超时)
https://stackoverflow.com/questions/5069962
复制