Мы используем Ubuntu 16.04 на AWS (4.4.0-1066-aws x86_64) для отправки push-уведомлений клиентам Android и iOS из приложения PHP с помощью curl. Этот фрагмент кода используется для отправки push-уведомления в Firebase:
$ch[$i] = curl_init();
curl_setopt($ch[$i], CURLOPT_URL, LocalConfig::ANDROID_URL_REQUEST);
curl_setopt($ch[$i], CURLOPT_POST, true);
curl_setopt($ch[$i], CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch[$i], CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch[$i], CURLOPT_POSTFIELDS, json_encode($fields));
curl_setopt($ch[$i], CURLOPT_CONNECTTIMEOUT, LocalConfig::CURLOPT_CONNECTTIMEOUT);
curl_setopt($ch[$i], CURLOPT_TIMEOUT, LocalConfig::CURLOPT_TIMEOUT);
curl_multi_add_handle($multiCurl, $ch[$i]);
Это работает, но мои коллеги говорят мне, что в прошлом curl иногда начинал возвращать ошибку 0 для большинства соединений. Некоторые соединения все еще были успешными.
Решение, которое они придумали, - закрыть приложение push, перезапустить сетевую службу и снова запустить приложение push.
./cli/bash/stopAll.sh
sudo systemctl restart networking
./cli/bash/runAll.sh
Если было перезапущено только приложение, проблема не исчезла, а значит, проблема в сети.
Конечно, это означает некоторое время простоя для клиентов, включая время отклика, которое можно минимизировать, автоматизируя процедуру, но в идеале мы вообще не хотим видеть ошибку.
Больше информации:
Что это такое, на что еще нужно обратить внимание и как это исправить?