Постоянный / keepalive HTTP с библиотекой PHP Curl? - PullRequest
58 голосов
/ 10 июня 2009

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

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

  1. Блок PHP, выполняющий задание индексации
  2. Поле базы данных, содержащее индексируемые данные
  3. Поле Solr.

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

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

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

Ответы [ 4 ]

52 голосов
/ 11 июня 2009

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

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

Итак:

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

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

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

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

  3. При настройке контекста cURL включите поддержку активности с таймаутом в заголовке:

    curl_setopt($curlHandle, CURLOPT_HTTPHEADER, array(
        'Connection: Keep-Alive',
        'Keep-Alive: 300'
    ));
    
1 голос
/ 10 июня 2009

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

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

...