Я использую простую библиотеку PHP для добавления документов в индекс SOLR через HTTP.
В настоящее время задействовано 3 сервера:
В 80 документах / сек (из 1 миллиона документов) я замечаю необычно высокую скорость прерывания на сетевых интерфейсах на PHP и solr-боксах (2000 / sec, более того, графики почти идентичны), когда прерывание ставка на всплески ящиков PHP, а также всплески на поле Solr), но гораздо меньше – на поле базы данных (300 / sec). Я предполагаю, что это просто потому, что я открываю и повторно использую одно соединение с сервером базы данных, но каждый запрос Solr открывает новое HTTP-соединение через cURL, благодаря тому, как написана клиентская библиотека Solr.
Итак, мой вопрос:
Документация cURL PHP ( curl_setopt ) гласит:
CURLOPT_FORBID_REUSE
–TRUE
чтобы принудительно закрыть соединение, когда оно закончило обработку, и не объединяться для повторного использования.
Так:
Curl отправляет заголовок keep-alive по умолчанию, но:
curl_init()
без каких-либо параметров. CURLOPT_URL
для передачи URL- CURLOPT_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 .
Вы должны повторно использовать один и тот же контекст cURL.
При настройке контекста cURL включите keep-alive с таймаутом в заголовке:
curl_setopt($curlHandle, CURLOPT_HTTPHEADER, array( 'Connection: Keep-Alive', 'Keep-Alive: 300' ));
Если вас не интересует ответ из запроса, вы можете сделать это асинхронно, но вы рискуете перегрузить ваш индекс SOLR. Я сомневаюсь, что SOLR довольно чертовски быстр.
Асинхронные вызовы PHP?