Новичок
Покинул форум
Сообщений всего: 1
Дата рег-ции: Окт. 2018
Помог: 0 раз(а)
|
Доброго времени суток.
Воспользовался контекстным поиском пару раз (который минут 5 перенаправляет меня на страницу с результатами...), но не смог найти для себя полезной информации касательно моего вопроса.
Мой вопрос можно упростить:
Есть N php скриптов на сервере. Каждый должен обращаться в одну и ту же 3rd party API (с разными запросами).
Может ли один скрипт создать соединение в эту API, которое затем будет использоваться при обработки последующих реквестов (запросы могут быть в разные файлы) ?
А если это не один конекшен а десятки ?
А кто будет менеджить эти соединения ?
Более подробная задача (Отобразить)Суть в том, что есть десятки серверов, на каждом из которых десятки сайтов, на которые бывают десятки миллионов запросов в сутки. Большая часть это простые скрипты и статика, сложных вычислений нет. Задача - заставить каждый скрипт делать допольнительный запрос в апишку, получать ответ и его обрабатывать перед тем как отдать юзеру результат.
Веб сервера на каждой машине могут быть разлиные Apache/Nginx+php-fpm, как и версии, режимы работы Apache тоже могут быть разные: как CGI так и mod_php (pre_fork/worker/event).
Если мы сделаем это в лоб (в каждом файле будем юзать php_curl), то не получится ли так, что мы забьём процессами curl'а всю машину и все доступные сокеты? Ведь Unxi система сокет закрывает не сразу, а спустя какое то время (которое можно менять в конфигах ядра/системы, но это не безопасно). К тому же для curl'а нужны будут сокеты что бы делать запросы, а серверу физически не хватит доступных сокетов с такой нагрузкой...
Моя цель - проанализировать все возможные подходы к решению такой проблемы. Есть ли возможность веб серверу хранить пул TCP конекшенов, держать пул сокетов открытыми и, отдавая реквесты обработчикам (дочерним процессам), также передавать им что то что позволит реюзать доступный сокет, а не открывать сокет самому, делать handshake, устанавливать ssl, и так далее.
Я далёк от PHP, но изучив форумы и документации, я не смог найти чёткого ответа. Есть 3 режима работы Apache начиная с версии 2.4: pre_fork, worker, event. Два последних держат parent процесс, который управляет дочерними listen'арами, которым он передаёт запросы на обработку. По завершению они не очищают всю память, а позволяют держать открытые соединения и прочие ресурсы, которые могут быть использованы при обработке последующих запросов. Но как они менеджат эти рисурсы или как ими можно управлять - я не нашел ни слова.
Режим event создан специльно для Keep-Alive соединений, но у меня другая задача: 1 клиент делает около 1-2 запросов в час(!), мне нужен Keep-Alive не для клиентских соединений, а для самих дочерних процессов, которые занимаются обработкой php запросов.
В документации CURL написано что он умеет "придерживать" сокет открытым некоторое время, что бы его можно было переиспользовать. Так же можно передавать curl handler'ы в методы, что бы указывать каким хендлером нужно делать запрос. PHP умеет curl, curl_multy, и curl_easy (насколько я понял).
Но простой тест на саму CURL либу с двумя bash скриптами которые запускаются по очереди и скачивают файлы с одного домена, показывает (через netstat, к примеру) что сокеты используются разные, значит никакого "глобального системного пула TCP конекшнеов и сокетов для CURL'а нет). Я не смогу хранить этот handler нигде (shared memory, cache, и т.д.) поскольку это не простой объект, а ресурс получается, который должен быть в памяти и который может быть передан для его использования.
Так что же тогда с PHP ? Можно ли такое сделать ? Можно ли создавать десятки curl хендлеров (или сокетов) и переиспользовать их в тысячах скриптах ?
Вот такой вопрос про persistent connections, connection cache, connection pool, sharing connections, HTTP pool, socket pool и так далее, но на уровне Web Server'а...
Увы (Отобразить)Увы, но нет возможности переписать это всё на другом языке, где я могу свободно управлять пулом конекшеном. Нужно простое решение, которое можно использовать независимо от Nginx/Apache и независимо от режимов их работы.
Сейчас инвестигейчу данный вопрос для решения с Nginx + php_fpm. Пока ничего не понятно (Отредактировано автором: 24 Октября, 2018 - 14:01:39)
|