59 votes

HTTP persistant/keepalive 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 :

  1. La boîte PHP qui exécute le travail d'indexation
  2. Une boîte de base de données contenant les données à indexer
  3. La boîte de Solr.

À 80 documents/seconde (sur 1 million de documents), je remarque un taux d'interruption inhabituellement élevé sur les interfaces réseau des boîtes PHP et Solr (2000/seconde ; de plus, les graphiques sont presque identiques -- lorsque le taux d'interruption de la boîte PHP atteint un pic, il atteint également un pic sur la boîte Solr), mais beaucoup moins sur la boîte de base de données (300/seconde). J'imagine que c'est simplement parce que j'ouvre et réutilise une seule connexion 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.

Donc, ma question est :

  1. Peut-on faire en sorte que cURL ouvre une session keepalive ?
  2. Que faut-il faire pour réutiliser une connexion ? -- est-ce aussi simple que de réutiliser la ressource du handle cURL ?
  3. Dois-je définir des options cURL particulières ? (par exemple, forcer HTTP 1.1 ?)
  4. Y a-t-il des problèmes avec les connexions keepalive de cURL ? Ce script fonctionne pendant des heures ; pourrai-je utiliser une seule connexion ou devrai-je me reconnecter périodiquement ?

55voto

Piskvor Points 46986

Documentation PHP cURL ( curl_setopt ) dit :

CURLOPT_FORBID_REUSE - TRUE pour forcer la connexion à fermer explicitement lorsqu'elle a terminé son traitement, et ne pas être mise en commun pour être réutilisée.

Donc :

  1. Oui, en fait il devrait réutiliser les connexions par défaut, tant que
  2. vous réutilisez l'identifiant cURL.
  3. Par défaut, cURL gère lui-même les connexions persistantes ; si vous avez besoin d'en-têtes spéciaux, vérifiez CURLOPT_HTTPHEADER.
  4. le serveur peut envoyer un délai d'attente (avec l'installation par défaut d'Apache, c'est 15 secondes ou 100 requêtes, selon ce qui se produit en premier) - mais cURL ouvrira simplement une autre connexion lorsque cela se produira.

21voto

Richard Keizer Points 107

Curl envoie l'en-tête keep-alive par défaut, mais :

  1. créer un contexte en utilisant curl_init() sans aucun paramètre.
  2. stocker le contexte dans un scope où il survivra (pas une var locale)
  3. utiliser CURLOPT_URL option pour passer l'url au contexte
  4. exécuter la demande en utilisant curl_exec()
  5. ne fermez pas la connexion avec curl_close()

Un exemple très simple :

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);

14voto

Oleg Barshay Points 2126
  1. Sur le serveur auquel vous accédez, la fonction "keep-alive" doit être activée et le nombre maximal de demandes de "keep-alive" doit être raisonnable. Dans le cas d'Apache, reportez-vous à l'onglet documentation sur apache .

  2. Vous devez réutiliser le même contexte cURL.

  3. Lors de la configuration du contexte cURL, activez le keep-alive avec timeout dans l'en-tête :

    curl_setopt($curlHandle, CURLOPT_HTTPHEADER, array(
        'Connection: Keep-Alive',
        'Keep-Alive: 300'
    ));

1voto

UltimateBrent Points 6167

Si vous ne vous souciez pas de la réponse à la requête, vous pouvez les faire de manière asynchrone, mais vous courez le risque de surcharger votre index SOLR. J'en doute cependant, SOLR est sacrément rapide.

http://stackoverflow.com/questions/124462/asynchronous-php-calls

-5voto

cloudhead Points 10279

Je ne pense pas qu'il soit possible d'obliger curl à faire du keep-alive, mais je peux me tromper. Dans tous les cas, si vous utilisez le keep-alive, le client doit pouvoir se reconnecter périodiquement en cas de déconnexion, notamment parce que le serveur ne vous permettra probablement pas de garder une seule connexion pendant des heures, voire des minutes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X