2010-10-03 23 views
9

¿Cuándo es necesario cerrar la conexión curl y liberar los recursos consumidos por ella?diferencia entre ejecutar curl_close() una vez o con frecuencia?

¿Por qué hago esta pregunta, simplemente porque me dijeron que el recolector de basura PHP hace todo esto y, a veces, no hay necesidad de cerrar la conexión de base de datos o llamar al método __destruct para liberar recursos.

¿Desde ese momento en realidad empecé a pensar dónde debo llamar entonces? Por el momento estoy interesado en esa pregunta ya que estoy escribiendo una pequeña biblioteca para curl y me gustaría entender cuándo necesito la función de usuario curl_close().

Gracias a todos por su discusión y explicación.

Respuesta

5

por lo que yo lo entiendo. El GC solo limpia los recursos que ya no se usan/referencian. ya que cada vez que la variable curl se salga del alcance, se limpiará. Pero eso solo podría suceder después de que el script haya finalizado, o cada vez que se destruya la sesión (según el alcance).

Pero para estar seguro, solo tenga en cuenta el sentido común ... ciérrelo cuando ya no sea necesario.

+5

Pero, ¿no es necesario código innecesario? – Eugene

+7

@Eugene - ¿No cierras la puerta de tu casa después de salir? ;) – Christian

+4

@Christian Sciberras Depende. – Eugene

7

Resultados para 100 veces curl_exec (url ir a buscar con un interruptor de caché):

ejecutoras en cada bucle:

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 segundos

Ejecución de una sola vez:

$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 segundos


Decisión: si está ejecutando un montón de llamadas, a continuación, utilizar el método más rápido como una optimización. (source)

-1

Depende. En mi caso ya que estaba inicializando ejemplo rizo en mi costumbre CurlClient constructor

$this->ch = curl_init(); 

Y a continuación, utilizando el mismo $curlClient objeto de múltiples llamadas a la API, cerrando la instancia

curl_close($this->ch); 

afectaría a otras llamadas a la API. Los métodos que usan el mismo objeto no funcionarán, así que no los cierro.

Cuestiones relacionadas