Я собираю пуш-сервер для iPhone и пытаюсь заставить пуш работать. У меня есть файл message.php, который помещает новое сообщение в базу данных, а затем добавляет сообщение в таблицу push_queue в базе данных.
Чтобы отправить push-сообщение, мне нужно вручную перейти в браузер и вызвать push-файл (../push/push.php), который отправит push-уведомление.
Можно ли как-нибудь автоматически вызвать файл push.php из файла message.php?
Я безуспешно пытался require_one
, include
, exec
и file_get_contents
.
Это работает, если я использую:
header('Location: ../push/push.php');
Однако для выполнения и завершения файла push.php требуется несколько секунд, поэтому при попытке отправить сообщение пользователь задерживается.
Полагаю, я мог бы использовать задание cron для вызова файла push.php, но я бы предпочел этого не делать.
Вот основная функция в push.php (основана на http://www.raywenderlich.com/3525/apple-push-notification-services-tutorial-part-2):
function start()
{
//writeToLog('Connecting to ' . $this->server);
if (!$this->connectToAPNS())
exit;
while (true)
{
// Do at most 20 messages at a time. Note: we send each message in
// a separate packet to APNS. It would be more efficient if we
// combined several messages into one packet, but this script isn't
// smart enough to do that. ;-)
$stmt = $this->pdo->prepare('SELECT * FROM push_queue WHERE time_sent IS NULL LIMIT 20');
$stmt->execute();
$messages = $stmt->fetchAll(PDO::FETCH_OBJ);
$deletedIds = array();
foreach ($messages as $message)
{
if ($this->sendNotification($message->message_id, $message->device_token, $message->payload))
{
//$stmt = $this->pdo->prepare('UPDATE push_queue SET time_sent = NOW() WHERE message_id = ?');
//$stmt->execute(array($message->message_id));
$deletedIds[] = $message->message_id;
//$stmt = $this->pdo->prepare('DELETE FROM push_queue WHERE message_id = ?');
//$stmt->execute(array($message->message_id));
}
else // failed to deliver
{
$this->reconnectToAPNS();
}
}
//Delete the chunk of messages.
$this->pdo->query('DELETE FROM push_queue WHERE message_id IN ('.implode(',', $deletedIds).')');
unset($messages);
}
}