Постоянный / keepalive HTTP с библиотекой PHP Curl?

Я использую простую библиотеку PHP для добавления документов в индекс SOLR через HTTP.

В настоящее время задействовано 3 сервера:

  1. Ящик PHP работает с индексированием
  2. Ящик базы данных, содержащий индексированные данные
  3. Коробка solr.

В 80 документах / сек (из 1 миллиона документов) я замечаю необычно высокую скорость прерывания на сетевых интерфейсах на PHP и solr-боксах (2000 / sec, более того, графики почти идентичны), когда прерывание ставка на всплески ящиков PHP, а также всплески на поле Solr), но гораздо меньше – на поле базы данных (300 / sec). Я предполагаю, что это просто потому, что я открываю и повторно использую одно соединение с сервером базы данных, но каждый запрос Solr открывает новое HTTP-соединение через cURL, благодаря тому, как написана клиентская библиотека Solr.

Итак, мой вопрос:

  1. Можно ли сделать cURL для открытия сеанса keepalive?
  2. Что нужно для повторного использования соединения? – Это так же просто, как повторное использование ресурса дескриптора cURL?
  3. Нужно ли устанавливать какие-либо специальные опции cURL? (например, сила HTTP 1.1?)
  4. Есть ли какие-либо проблемы с подключением cURL? Этот скрипт работает в течение нескольких часов; смогу ли я использовать одно соединение или мне нужно будет периодически подключаться?

Документация cURL PHP ( curl_setopt ) гласит:

CURLOPT_FORBID_REUSETRUE чтобы принудительно закрыть соединение, когда оно закончило обработку, и не объединяться для повторного использования.

Так:

  1. Да, на самом деле он должен повторно использовать соединения по умолчанию, если вы повторно используете дескриптор cURL.
  2. По умолчанию cURL обрабатывает постоянные соединения самостоятельно; если вам нужны специальные заголовки, проверьте CURLOPT_HTTPHEADER
  3. сервер может отправить тайм-аут keep-alive (с установкой Apache по умолчанию, это 15 секунд или 100 запросов, в зависимости от того, что наступит раньше) – но cURL просто откроет другое соединение, когда это произойдет.

Curl отправляет заголовок keep-alive по умолчанию, но:

  1. создайте контекст с помощью curl_init() без каких-либо параметров.
  2. сохраните контекст в области, где он выдержит (а не локальный var)
  3. используйте параметр CURLOPT_URL для передачи URL- CURLOPT_URL в контекст
  4. выполнить запрос с помощью curl_exec()
  5. не закрывайте соединение с 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); 
  1. На сервере, к которому вы обращаетесь, keep-alive должен быть включен, и максимальные запросы keep-alive должны быть разумными. В случае Apache обратитесь к документам apache .

  2. Вы должны повторно использовать один и тот же контекст cURL.

  3. При настройке контекста cURL включите keep-alive с таймаутом в заголовке:

     curl_setopt($curlHandle, CURLOPT_HTTPHEADER, array( 'Connection: Keep-Alive', 'Keep-Alive: 300' )); 

Если вас не интересует ответ из запроса, вы можете сделать это асинхронно, но вы рискуете перегрузить ваш индекс SOLR. Я сомневаюсь, что SOLR довольно чертовски быстр.

Асинхронные вызовы PHP?