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:

  1. Le PHP boîte de l'exécution de l'indexation de l'emploi
  2. une boîte de base de données contenant les données indexées
  3. 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:

  1. Peut cURL être faite pour ouvrir un keepalive session?
  2. Que faut-il pour réutiliser une connexion? -- est-ce aussi simple que de réutiliser la ressource cURL handle?
  3. ai-je besoin de définir des options spéciales cURL? (par exemple, forcer HTTP 1.1?)
  4. 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?
55
demandé sur Frank Farmer 2009-06-10 02:59:48

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.

:

  1. 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.
  2. 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
  3. 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.
50
répondu Piskvor 2016-05-18 13:47:34

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 une portée où il survivra (pas une var locale)
  3. utiliser CURLOPT_URL option pour passer l'url au contexte
  4. exécute la requête en utilisant curl_exec()
  5. 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);
21
répondu Richard Keizer 2012-04-11 08:10:45
  1. 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 .

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

  3. 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'
    ));
    
14
répondu Oleg Barshay 2009-11-17 01:25:45

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.

appels PHP asynchrones?

1
répondu UltimateBrent 2017-05-23 12:18:11