Сайт WordPress зависает при отправке уведомлений FCM на большие темы через wp_remote_post()Php

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Сайт WordPress зависает при отправке уведомлений FCM на большие темы через wp_remote_post()

Сообщение Anonymous »

Я разрабатываю плагин WordPress, который отправляет push-уведомления через Firebase Cloud Messaging (API FCM v1). Плагин прекрасно работает при отправке в небольшие темы (1-2 устройства), но приводит к зависанию всего сайта на 4-5 минут при отправке в тему с сотнями подписчиков.
Среда
  • WordPress: 6.9
  • PHP: 8.x
  • Сервер: Общий хостинг (cPanel)
  • FCM API: HTTP v1
Небольшая тема (1 устройство, для тестирования):
  • Время ответа: ~600 мс
  • Сайт остается отзывчивым
  • Нет проблем
Большая тема «все» (сотни устройств, прод):
  • Сайт зависает на 4-5 минут
  • Загрузка процессора: 96–100 % (обычно ~20 %)
  • Память: 1,2 ГБ (обычно ~400 МБ)
  • Ошибок PHP в журналах нет
Текущая реализация
Обработчик AJAX

Код: Выделить всё

public function handleAjaxSendNotification() {
check_ajax_referer('send_notification_' . $_POST['post_id'], 'nonce');

if (!current_user_can('edit_posts')) {
wp_send_json_error('Insufficient permissions');
return;
}

$post_id = intval($_POST['post_id']);
$post = get_post($post_id);

$notification_data = array(
'post_id' => $post_id,
'title' => $post->post_title,
'body' => $this->generateExcerpt($post->post_content),
'topic' => 'all',  // ← Freezes with this topic
'type' => 'article'
);

$result = $this->sendNotificationToFCM($notification_data);

if ($result) {
wp_send_json_success('Notification sent!');
} else {
wp_send_json_error('Error sending notification');
}
}
Запрос FCM

Код: Выделить всё

private function sendNotificationToFCM($data) {
$settings = get_option('my_plugin_settings');
$access_token = $this->getAccessToken($settings['service_account']); // ~45ms

$message = array(
'message' => array(
'topic' => $data['topic'],
'notification' => array(
'title' => $data['title'],
'body' => $data['body']
),
'data' => array(
'post_id' => (string)$data['post_id'],
'type' => $data['type']
)
)
);

$response = wp_remote_post(
"https://fcm.googleapis.com/v1/projects/{$settings['project_id']}/messages:send",
array(
'headers' => array(
'Authorization' => 'Bearer ' . $access_token,
'Content-Type' => 'application/json'
),
'timeout' => 5,
'body' => wp_json_encode($message)
)
);

if (is_wp_error($response)) {
error_log("FCM Error: " .  $response->get_error_message());
return false;
}

$response_code = wp_remote_retrieve_response_code($response);
return $response_code === 200;
}
Что я заметил
  • Генерация токенов происходит быстро (~ 45 мс) – не узкое место
  • Замораживание происходит во время wp_remote_post()
  • Размер темы является ключевым моментом фактор:
    • 1 устройство: быстро
    • Сотни устройств: зависание
  • Ресурсы сервера резко увеличиваются во время зависания
  • Ошибок PHP нет - код работает, просто медленно
Вопросы
  • Почему размер темы FCM влияет на производительность WordPress?
    • Занимает ли FCM больше времени для обработки больших тем на стороне сервера?
    • Ждет ли PHP, пока FCM завершит обработку всех устройства?
  • Является ли wp_remote_post() правильным подходом для этого?
    • Должен ли я использовать 'blocking' => false, чтобы предотвратить ожидание?
    • Будет ли работать собственный Curl с настройками таймаута лучше?
  • Какой шаблон рекомендуется для HTTP-запросов типа «запустил и забыл» в WordPress?
    • Система очередей (фоновая обработка WP)?
    • Внешняя служба/вебхук?
    • Другой HTTP-клиент?
Может ли это быть ограничением хостинга?
  • Ограничения по времени ожидания общего хостинга?
  • Конфигурация PHP-FPM?
Я ожидаю, что запрос AJAX вернется быстро (~ 1 секунду) независимо от размера темы, поскольку я просто отправляю один HTTP-запрос в FCM. FCM должен асинхронно обрабатывать разветвление на устройства на их стороне.

Подробнее здесь: https://stackoverflow.com/questions/798 ... via-wp-rem
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»