Постоянный / keepalive HTTP с библиотекой PHP Curl?
Я использую простую библиотеку PHP для добавления документов в индекс SOLR через HTTP.
в настоящее время задействовано 3 сервера:
- в поле PHP выполняется задание индексирования
- поле базы данных, содержащее индексируемые данные
- коробка solr.
при 80 документах / сек (из 1 миллиона документов), я замечаю необычно высокую частоту прерываний на сетевых интерфейсах на PHP и solr коробки (2000/сек; более того, графики почти идентичны - когда скорость прерывания на поле PHP пикирует, она также пикирует на поле Solr), но гораздо меньше на поле базы данных (300/сек). Я предполагаю, что это просто потому, что я открываю и повторно использую одно соединение с сервером базы данных, но каждый запрос Solr в настоящее время открывает новое HTTP-соединение через cURL, благодаря тому, как написана клиентская библиотека Solr.
Итак, мой вопрос:
- можно скручивать, чтобы открыть keepalive сессия?
- что требуется для повторного использования соединения? -- это так же просто, как повторное использование ресурса ручки завитка?
- нужно ли мне устанавливать какие-либо специальные параметры скручивания? (например, force HTTP 1.1?)
- есть ли какие-либо gotchas с cURL keepalive connections? Этот скрипт работает в течение нескольких часов; смогу ли я использовать одно соединение или мне нужно будет периодически подключаться?
4 ответов:
cURL PHP документация (curl_setopt) говорит:
CURLOPT_FORBID_REUSE-TRUEв силу соединение с явным закрытием когда он закончит обработку, и не быть объединены для повторного использования.Так:
- да, на самом деле он должен повторно использовать соединения по умолчанию, пока вы повторно используете ручку скручивания.
- по умолчанию cURL обрабатывает постоянные соединения самостоятельно; если вам нужны специальные заголовки, проверьте CURLOPT_HTTPHEADER
- сервер может отправить тайм-аут keep-alive (с установкой Apache по умолчанию, это 15 секунд или 100 запросов, в зависимости от того, что наступит первым) - но cURL просто откроет другое соединение, когда это произойдет.
Curl отправляет заголовок keep-alive по умолчанию, но:
- создать контекст с помощью
curl_init()без каких-либо параметров.- хранить контекст в области, где он будет сохраняться (не локальный var)
- использовать , чтобы передать URL-адрес в контексте
- выполнить запрос с помощью
curl_exec()- не закрывайте соединение с
curl_close()очень простой пример:
function get($url) { global $context; curl_setopt($context, CURLOPT_URL, $url); return curl_exec($context); } $context = curl_init(); //multiple calls to get() here curl_close($context);
на сервере, к которому вы обращаетесь, keep-alive должен быть включен, и максимальные запросы keep-alive должны быть разумными. В случае Apache, обратитесь к apache docs.
вы должны повторно использовать тот же контекст cURL.
при настройке контекста cURL включите keep-alive с таймаутом в заголовке:
curl_setopt($curlHandle, CURLOPT_HTTPHEADER, array( 'Connection: Keep-Alive', 'Keep-Alive: 300' ));
Если вы не заботитесь об ответе от запроса, вы можете сделать их асинхронно, но вы рискуете перегрузить свой индекс SOLR. Хотя я сомневаюсь, что СОЛР чертовски быстр.
Comments