HTTP persistente / keepalive con la libreria PHP Curl?

Sto usando una semplice libreria PHP per aggiungere documenti a un indice SOLR, tramite HTTP.

Ci sono 3 server coinvolti, attualmente:

  1. La casella PHP che esegue il process di indexing
  2. Una casella di database contenente i dati da indicizzare
  3. La scatola dei sol.

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 è:

  1. Si può fare cURL per aprire una session keepalive?
  2. Cosa serve per riutilizzare una connessione? – è semplice come riutilizzare la risorsa handle cURL?
  3. Devo impostare qualche opzione speciale di CURL? (ad esempio, forzare HTTP 1.1?)
  4. Ci sono trucchi con le connessioni keepalive cURL? Questo script viene eseguito per ore alla volta; sarò in grado di utilizzare una singola connessione o dovrò riconnettermi periodicamente?

La documentazione di cURL PHP ( curl_setopt ) dice:

CURLOPT_FORBID_REUSETRUE per forzare la chiusura della connessione in modo esplicito al termine dell'elaborazione e non essere raggruppata per il riutilizzo.

Così:

  1. Sì, in realtà dovrebbe riutilizzare le connessioni per impostazione predefinita, purché riutilizzi l'handle cURL.
  2. per impostazione predefinita, cURL gestisce le connessioni permanenti di per sé; se hai bisogno di intestazioni speciali, controlla CURLOPT_HTTPHEADER
  3. il server può submit un timeout keep-alive (con l'installazione di Apache predefinita, è 15 secondi o 100 richieste, a seconda dell'evento che si verifica per primo) – ma cURL aprirà un'altra connessione quando ciò accade.

Curl invia l'intestazione keep-alive per impostazione predefinita, ma:

  1. crea un context usando curl_init() senza parametri.
  2. memorizzare il context in un ambito in cui sopravviverà (non una var locale)
  3. usa l'opzione CURLOPT_URL per passare l'URL al context
  4. eseguire la richiesta usando curl_exec()
  5. non chiudere la connessione con 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); 
  1. 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 .

  2. Devi riutilizzare lo stesso context cURL.

  3. 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?