Я пытаюсь отправить push-уведомление FCM пользователям нашего приложения. Мне нужно отправить настроенное сообщение размером 13 КБ, каждый пользователь имеет уведомление, содержащее его имя и некоторые данные, поэтому мне нужно отправить запрос FCM для каждого пользователя, и мой вопрос
как отправить это количество запросов без снижения производительности и нагрузки на сервер?
, потому что я перепробовал много ответов и отключил свой сервер с помощью «Внутренняя ошибка сервера», а также попытался выполнить циклпо запросам и каждому циклу я делаю PHP sleep (1) или более секунд, и это дает мне ошибку тайм-аута, я пытался увеличить время ожидания с помощью set_time_limit и max времени выполнения init, но это также дает мне внутреннюю ошибку сервера, как только я запускаю файл PHP.
Я вызываю этот файл PHP из cPanel с помощью ajax и должен выполнить работу внутри сценария PHP. Я делю пользователей на 1000 пользователей по частям за раз.
$curlResults = array();
$curlRequests = array_chunk($curlRequests, 250);
foreach ($curlRequests as $requests) {
try {
$results = $this->executeFCMRequests($requests);
$curlResults = array_merge($curlResults, $results);
sleep(2);
} catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
}
function executeFCMRequests($requests)
{
try {
$master = curl_multi_init();
$requests_count = count($requests);
$curl_arr = array();
for ($i = 0; $i < $requests_count; $i++) {
$request = $requests[$i];
$curl_arr[$i] = $request;
curl_multi_add_handle($master, $curl_arr[$i]);
}
$running = null;
do {
curl_multi_exec($master, $running);
} while ($running > 0);
for ($i = 0; $i < $requests_count; $i++) {
$results[] = curl_multi_getcontent($curl_arr[$i]);
curl_multi_remove_handle($master, $curl_arr[$i]);
}
curl_multi_close($master);
} catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
return $results;
}
как создать каждыйзапрашивать массив запросов
function createFCMCurlRequest($regIds, $title, $message, $image, $shouldOpen, $shopId, $url, $notificationId)
{
// API access key from Google API's Console
define('API_ACCESS_KEY', 'AAAATQ-------------------------------------------');
$registrationIds = $regIds;
$msg = array
(
'body' => $message,
'title' => $title,
// 'Link' => $link
);
$data = Array(
'shouldOpen' => $shouldOpen,
'notificationId' => $notificationId,
'shopId' => $shopId,
);
if ($url != null) {
$data['url'] = $url;
}
$fields = array
(
'registration_ids' => $registrationIds, //$registrationIds,
'notification' => $msg,
'data' => $data,
'content_available' => true,
'priority' => 'high',
);
$headers = array
(
'Authorization: key=' . API_ACCESS_KEY,
'Content-Type: application/json'
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://fcm.googleapis.com/fcm/send');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0);
curl_setopt($ch, CURLOPT_TIMEOUT, 400);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
return $ch;
}
, когда я отправляю запросы до 2K запросов, код работает нормально bно больше, чем этот сервер вернулся с внутренней ошибкой сервера или тайм-аут или даже ERR Пустой ответ.