2010-10-03 3 views
9

Quand est-il nécessaire de fermer la connexion curl et de libérer les ressources consommées par celle-ci? Pourquoi dois-je poser cette question, tout simplement parce qu'on m'a dit que PHP garbage collector fait tout cela et parfois il n'est pas nécessaire de fermer la connexion DB ou appeler la méthode __destruct pour libérer des ressources. Depuis ce moment, j'ai vraiment commencé à penser à l'endroit où j'ai besoin de l'appeler alors? En ce moment je suis intéressé par cette question depuis que j'écris une petite bibliothèque pour curl et je voudrais comprendre quand dois-je utiliser la fonction curl_close().différence entre l'exécution de curl_close() une fois ou fréquemment?

Merci à tous pour la discussion et l'explication. Autant que je le comprends.

Répondre

5

Le GC ne nettoie que les ressources qui ne sont plus utilisées/référencées. car chaque fois que la variable curl tombe hors de la portée, elle sera nettoyée. Mais cela ne peut se produire qu'après la fin du script ou à chaque fois que la session est détruite (en fonction de la portée). Mais pour être du bon côté, il suffit de suivre le bon sens ... fermez-le quand il n'est plus nécessaire.

+5

Mais, n'est-ce pas un code inutile alors? – Eugene

+7

@Eugene - Ne fermez-vous pas votre porte d'entrée après être sorti? ;) – Christian

+4

@ Christian Sciberras Depends. – Eugene

7

Résultats pour 100 fois curl_exec (aller chercher url avec un briseur de cache):

exécution dans chaque boucle:

for ($i = 0; $i < 100; ++$i) { 
    $c = curl_init(); 
    curl_setopt($c, CURLOPT_URL, "http://www.google.com/?rand=" . rand()); 
    curl_exec($c); 
    curl_close($c); 
} 

8,5 secondes

exécution une seule fois:

$c = curl_init(); 
for ($i = 0; $i < 100; ++$i) { 
    curl_setopt($c, CURLOPT_URL, "http://www.google.com/?rand=" . rand()); 
    curl_exec($c); 
} 
curl_close($c); 

5,3 secondes


Décision: si vous utilisez des tonnes d'appels, puis utilisez la méthode plus rapide comme l'optimisation. (source)

-1

dépend. Dans mon cas, puisque je l'initialisation par exemple boucle dans mon habitude CurlClient constructeur

$this->ch = curl_init(); 

Et puis en utilisant un même objet $curlClient pour plusieurs appels api, fermer l'instance

curl_close($this->ch); 

affecterait d'autres appels API. Les méthodes utilisant le même objet ne fonctionneront pas, donc je ne le ferme pas.

Questions connexes