проблема при попытке отправить более 10K запрос curl с использованием php - PullRequest
0 голосов
/ 05 июля 2019

Я пытаюсь отправить 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 Пустой ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...