Sto usando una semplice libreria PHP per aggiungere documenti a un indice SOLR, tramite HTTP.
Ci sono 3 server coinvolti, attualmente:
A 80 documenti / secondo (su un milione di documenti), noto una frequenza di interruzione insolitamente alta sulle interfacce di networking su PHP e solr box (2000 / sec, in più, i grafici sono quasi identici – quando l'interruzione tasso sui picchi di box PHP, anche picchi sulla casella Solr), ma molto less sul box del database (300 / sec). Immagino che questo sia semplicemente perché apro e riuso una singola connessione al server del database, ma each singola richiesta Solr sta attualmente aprendo una nuova connessione HTTP tramite cURL, grazie al modo in cui è scritta la libreria del client Solr.
Quindi, la mia domanda è:
La documentazione di cURL PHP ( curl_setopt ) dice:
CURLOPT_FORBID_REUSE
–TRUE
per forzare la chiusura della connessione in modo esplicito al termine dell'elaborazione e non essere raggruppata per il riutilizzo.
Così:
Curl invia l'intestazione keep-alive per impostazione predefinita, ma:
curl_init()
senza parametri. CURLOPT_URL
per passare l'URL al context curl_exec()
curl_close()
esempio molto semplice:
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);
Sul server a cui si accede keep-alive deve essere abilitato e le richieste keep-alive massime dovrebbero essere ragionevoli. Nel caso di Apache, fare riferimento ai documenti di apache .
Devi riutilizzare lo stesso context cURL.
Quando si configura il context cURL, abilitare keep-alive con timeout nell'intestazione:
curl_setopt($curlHandle, CURLOPT_HTTPHEADER, arrays( 'Connection: Keep-Alive', 'Keep-Alive: 300' ));
Se non ti interessa la risposta della richiesta, puoi eseguirli in modo asincrono, ma corri il rischio di sovraccaricare il tuo indice SOLR. Ne dubito, SOLR è dannatamente veloce.
Chiamate PHP asincrone?