Persistent / keepalive HTTP avec la bibliothèque PHP Curl?
j'utilise une simple bibliothèque PHP pour ajouter des documents à un index SOLR, via HTTP.
il y a 3 serveurs impliqués, actuellement:
- Le PHP boîte de l'exécution de l'indexation de l'emploi
- une boîte de base de données contenant les données indexées
- la boîte solr.
à 80 documents / sec( sur 1 million de documents), je remarque un taux d'interruption inhabituellement élevé sur le réseau interfaces sur les boîtes PHP et solr (2000/sec; de plus, les graphiques sont presque identiques -- lorsque le taux d'interruption sur la boîte PHP monte, il monte aussi sur la boîte Solr), mais beaucoup moins sur la boîte de base de données (300/sec). J'imagine que c'est simplement parce que j'ouvre et réutilise une connexion unique au serveur de base de données, mais chaque requête Solr ouvre actuellement une nouvelle connexion HTTP via cURL, grâce à la façon dont la bibliothèque client Solr est écrite.
alors, ma question est:
- Peut cURL être faite pour ouvrir un keepalive session?
- Que faut-il pour réutiliser une connexion? -- est-ce aussi simple que de réutiliser la ressource cURL handle?
- ai-je besoin de définir des options spéciales cURL? (par exemple, forcer HTTP 1.1?)
- y a-t-il des gotchas avec des connexions cURL keepalive? Ce script fonctionne pendant des heures à la fois; est-ce que je peux utiliser une seule connexion, ou est-ce que je dois périodiquement reconnecter?
4 réponses
documentation cURL PHP ( curl_setopt ) dit:
CURLOPT_FORBID_REUSE
-TRUE
pour forcer la connexion à fermer explicitement quand il a terminé le traitement, et pas être mis en commun pour la réutilisation.
:
- Oui, en fait, il devrait ré-utiliser par défaut, les connexions, aussi longtemps que vous le re-utiliser la boucle de la poignée.
- par défaut, cURL gère les connexions persistantes par lui-même; si vous avez besoin de quelques en-têtes Spéciaux, Vérifiez CURLOPT_HTTPHEADER
- le serveur peut envoyer un délai de conservation (avec L'installation par défaut D'Apache, il est de 15 secondes ou de 100 requêtes, selon la première éventualité) - mais cURL ouvrira simplement une autre connexion lorsque cela se produira.
Curl envoie l'en-tête keep-alive par défaut, mais:
- créer un contexte en utilisant
curl_init()
sans aucun paramètre. - stocker le contexte dans une portée où il survivra (pas une var locale)
- utiliser
CURLOPT_URL
option pour passer l'url au contexte - exécute la requête en utilisant
curl_exec()
- ne pas fermer la connexion avec
curl_close()
exemple très basique:
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);
-
sur le serveur auquel vous accédez, la fonction keep-alive doit être activée et les requêtes keep-alive maximales doivent être raisonnables. Dans le cas D'Apache, référez-vous au apache docs .
-
vous devez réutiliser le même contexte cURL.
-
lors de la configuration du contexte cURL, activez keep-alive avec timeout dans l'en-tête:
curl_setopt($curlHandle, CURLOPT_HTTPHEADER, array( 'Connection: Keep-Alive', 'Keep-Alive: 300' ));
si vous ne vous souciez pas de la réponse de la demande, vous pouvez le faire de manière asynchrone, mais vous courez le risque de surcharger votre index SOLR. J'en doute, SOLR est plutôt rapide.