Я использую самописный скрипт для отправки push-уведомлений в APNS с PHP.Чтобы иметь возможность обрабатывать ошибки, я использую расширенный формат для push-уведомлений и хотел бы получить результаты из потока:
// $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,тем не менее, в моем случае сценарий всегда ждет неопределенно долго, потому что пытается прочитать данные, которых там нет (Apple отправляет ответ только в случае ошибки).Я искал способы сказать, есть ли какие-либо новые данные для чтения из потока TCP, однако я не смог найти ни одного, и методы обратного вызова потока, доступные для вызовов HTTP, также недоступны для «сырых» соединений TCP.
Как я могу преобразовать мой сценарий, чтобы он вызывал fread только тогда, когда на самом деле есть данные для чтения?Как проект apns-php решает эту проблему (из того, что я могу сказать, они также просто вызывали fread)?