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



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



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




  1. в поле PHP выполняется задание индексирования

  2. поле базы данных, содержащее индексируемые данные

  3. коробка solr.


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



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




  1. можно скручивать, чтобы открыть keepalive сессия?

  2. что требуется для повторного использования соединения? -- это так же просто, как повторное использование ресурса ручки завитка?

  3. нужно ли мне устанавливать какие-либо специальные параметры скручивания? (например, force HTTP 1.1?)

  4. есть ли какие-либо gotchas с cURL keepalive connections? Этот скрипт работает в течение нескольких часов; смогу ли я использовать одно соединение или мне нужно будет периодически подключаться?

1051   4  

4 ответов:

cURL PHP документация (curl_setopt) говорит:

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

Так:

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

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

  1. создать контекст с помощью curl_init() без каких-либо параметров.
  2. хранить контекст в области, где он будет сохраняться (не локальный var)
  3. использовать , чтобы передать 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 docs.

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

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

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

Если вы не заботитесь об ответе от запроса, вы можете сделать их асинхронно, но вы рискуете перегрузить свой индекс SOLR. Хотя я сомневаюсь, что СОЛР чертовски быстр.

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

Comments

    Ничего не найдено.