2012-03-09 18 views
6

Estoy haciendo una clase de PHP que maneja algo de tráfico con el uso de CURL y todo funciona bastante bien (a excepción de las cookies pero bueno, eso es otra cosa). Una cosa que no funciona de esa grande es la función curl_close() y aunque no tengo ni idea de por qué ...curl_close(): no es un recurso válido para manejar cURL ... pero ¿POR QUÉ?

$curlSession = &$tamperCurl->getCURLSession(); 

var_dump($curlSession); 
curl_close($curlSession); 
die(); 

que anteriormente llamado curl_exec() y todo funcionaba perfectamente. La salida de este es que me da es: de recursos (6) de tipo (rizo)
Advertencia: curl_close(): 6 no es un recurso CURL válido en filename.php en la línea 58

¿Alguien tiene alguna idea de por qué sucede esto? (el var_dump dice que obviamente es una sesión curl).

ADEMÁS:

Debido a problemas de derechos de autor que no puedo publicar toda la atm clase TamperData (GPL será más adelante).

He simplificado a esto:

$tamperCurl = new TamperCurl('test.xml'); 
echo var_dump($tamperCurl->getCURLSession()); 
curl_close($tamperCurl->getCURLSession()); 
die(); 

El constructor de TamperCurl es así:

public function __construct($xmlFilePath, $options=null)  
{ 
    if($options != null) $this->setOptions($options); 

    $this->headerCounter = 0; 
    $this->setXMLHeader($xmlFilePath); 
    $this->init(); 
} 

public function init($reuseConnection=false,$resetSettings=null) 
{ 
    $this->curlSession = curl_init(); 
} 

Una vez más la misma salida: recurso (8) de tipo (Curl) PHP Advertencia: curl_close(): 8 no es un recurso de controlador cURL válido en TamperCurl.php en la línea 58

+2

Intenta eliminar el '&' de la llamada al método. – ThiefMaster

+0

@Briedis - no es un puntero. ¿Y qué pasa con los signos de interrogación? Uno es suficiente ... –

+1

Ok, el puntero puede ser un poco confuso, pero está saliendo de una clase. Si no quisiera utilizar una referencia, simplemente se copiaría en la declaración de devolución de la función get. Dejar intacta la variable de instancia real del objeto. (Al menos eso es lo que creo que está sucediendo). No importa si lo hago con o sin una referencia. Incluso esta función dentro de la clase no funciona para las mismas razones expresadas anteriormente (! $ This-> curlSession = null) \t función pública __destruct() { \t \t \t si curl_close ($ this-> curlSession) ; \t} – shokora

Respuesta

7

Eventualmente el problema resultó ser este:

public function __destruct() 
{ 
    if($this->curlSession != null) curl_close($this->curlSession); 
} 

Si ya ha cerrado la curlSession, la variable que contiene el recurso no se establece en NULL, pero que está establecido en 'tipo desconocido'. Así que esto soluciona el problema:

public function __destruct() 
{ 
    if(gettype($this->curlSession) == 'resource') curl_close($this->curlSession); 
} 

No estoy seguro de por qué, pero esta vez fijó mi problema con las cookies, por lo que podría ser que si se intenta cerrar una sesión de rizo ya cerrado algo otra cosa va mal.

Cuestiones relacionadas