Слишком много запросов на скручивание для Apple Push-уведомлений

Я использую эту функцию для отправки push-уведомлений

function SendPush($token,$message,$badge,$eventid) {

$device_token   = $token;
$pem_file       = '../pushcert.pem';
$pem_secret     = 'pass';
$apns_topic     = 'com.topic';


$sample_alert = '{"aps":{"alert":"'. $message .'","sound":"default","badge":'. $badge .'}, "type":"attend", "eventID":"'.$eventid.'"}';
$url = "https://api.push.apple.com/3/device/$device_token";

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POSTFIELDS, $sample_alert);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true );
curl_setopt($ch, CURLOPT_HTTPHEADER, array("apns-topic: $apns_topic"));
curl_setopt($ch, CURLOPT_SSLCERT, $pem_file);
curl_setopt($ch, CURLOPT_SSLCERTPASSWD, $pem_secret);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
$response = curl_exec($ch);
$sonuc = json_decode($response,true);

if ($sonuc['reason'] == "BadDeviceToken" || $sonuc['reason'] == "Unregistered" ) {
return false;
} else {
return true;
}

}

Это работает хорошо. Я также могу обнаружить недействительные токены.

Моя проблема в том, что когда мне нужно отправить более 1000 push-уведомлений, это занимает слишком много времени.

Есть ли способ сохранить соединение curl и отправлять уведомления быстрее, не блокируя серверы Apple?

3

Решение

Для этого вы должны поместить код уведомления в фоновом режиме.

Вы можете сослаться на этот URL: https://coderexample.com/how-to-run-a-php-script-in-background/

Итак, ваш код будет выполнен через 1 секунду, и ваше уведомление будет отправлено из фона, поэтому вы не ждете ответа, пока уведомление не будет сделано.

ИЛИ ЖЕ

Вы можете использовать сторонние инструменты уведомления

ТСМ:

https://gist.github.com/rolinger/d6500d65128db95f004041c2b636753a

OneSignal:

https://documentation.onesignal.com/reference

Это обойдется только собой.

2

Другие решения

Библиотека PHP curl должна по умолчанию повторно использовать HTTP-соединения, вам нужно только повторно использовать ручку curl.
Итак, решение состоит в том, чтобы сделать $ ch = curl_init ($ url); один раз, вне этого метода, а затем добавьте $ ch в качестве аргумента для SendPush () в вашем цикле, где вы обрабатываете / отправляете уведомления.

Таким образом, ваше HTTP-соединение будет постоянным и сэкономит много времени на установление соединения. Без дополнительных затрат и дополнительной сложности вы получаете эффект очереди.

0

есть скручиваемость мульти

<?php
//$message should be an array with the details
function SendPush($messages) {
$mh = curl_multi_init();
$ch = array();
foreach($messages as $key=>$mess)
{
$device_token   = $mess['token'];
$pem_file       = '../pushcert.pem';
$pem_secret     = 'pass';
$apns_topic     = 'com.topic';
$sample_alert = '{"aps":{"alert":"'. $mess['message'] .'","sound":"default","badge":'. $mess['badge'] .'}, "type":"attend", "eventID":"'.$mess['eventid'].'"}';
$url = "https://api.push.apple.com/3/device/$device_token";
$ch[$key]=curl_init($url);
curl_setopt($ch[$key], CURLOPT_POSTFIELDS, $sample_alert);
curl_setopt($ch[$key], CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
curl_setopt($ch[$key],CURLOPT_RETURNTRANSFER, true );
curl_setopt($ch[$key], CURLOPT_HTTPHEADER, array("apns-topic: $apns_topic"));
curl_setopt($ch[$key], CURLOPT_SSLCERT, $pem_file);
curl_setopt($ch[$key], CURLOPT_SSLCERTPASSWD, $pem_secret);
curl_setopt($ch[$key], CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch[$key], CURLOPT_TIMEOUT, 15);
curl_multi_add_handle($mh,$ch[$key]);

}
$running = null;
do {
curl_multi_exec($mh, $running);
} while ($running);

$sonuc = json_decode($response,true);
foreach($ch as $curl)
{
$response = curl_multi_getcontent($curl);
if ($sonuc['reason'] == "BadDeviceToken" || $sonuc['reason'] == "Unregistered" ) {
//return false;
//handle the bad device
} else {
//return true;
//device ok
}
}
}
-1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector