Среда
- WordPress: 6.9
- PHP: 8.x
- Сервер: Общий хостинг (cPanel)
- FCM API: HTTP v1
- Время ответа: ~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');
}
}
Код: Выделить всё
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?
Подробнее здесь: https://stackoverflow.com/questions/798 ... via-wp-rem