2012-03-09 12 views
6

Tworzę klasę PHP, która obsługuje trochę ruchu za pomocą CURL i wszystko działa całkiem dobrze (z wyjątkiem ciasteczek, ale hej to kolejna rzecz). Jedną rzeczą, która nie działa, że ​​wielka jest funkcja curl_close() i choć nie mam pojęcia dlaczego ...curl_close(): nie jest prawidłowym zasobem obsługi cURL ... ale DLACZEGO?

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

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

ja wcześniej nazywana curl_exec() i wszystko działało idealnie. Wyjście to daje mi to: zasobu (6) typu (curl)
Ostrzeżenie: curl_close(): 6 nie jest ważny zasób uchwyt cURL w filename.php na linii

Czy ktoś ma pojęcie, dlaczego tak się dzieje? (var_dump mówi, że to oczywiście sesja curl).

Ponadto:

powodu problemów autorskimi nie mogę pisać cały TamperData klasy ATM (to będzie później GPL).

I uproszczony go na:

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

Konstruktor TamperCurl jest tak:

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

takie samo Wydajność: źródło (8) typu (ta) PHP Ostrzeżenie: curl_close(): 8 nie jest prawidłowym zasobem obsługi cURL w TamperCurl.php na linii 58

+2

Spróbuj usunąć '&' z wywołania metody. – ThiefMaster

+0

@Briedis - nie jest wskaźnikiem. A co jest ze znakami zapytania? Jeden wystarczy ... –

+1

Ok wskaźnik może być nieco mylący, ale wychodzi z klasy. Gdybym nie używał odniesienia, byłby po prostu skopiowany w instrukcji return funkcji get. Pozostawienie rzeczywistej zmiennej instancji obiektu nietkniętej. (Przynajmniej tak to właśnie się dzieje). Nie ma znaczenia, czy robię to z lub bez odniesienia. Nawet ta funkcja wewnątrz klasy nie działa na tych samych powodów, jak określono powyżej: (! $ This-> curlSession = null) \t public function() __destruct \t { \t \t jeśli curl_close ($ this-> curlSession) ; \t} – shokora

Odpowiedz

7

Ostatecznie problem okazał się następujący:

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

Jeśli już zamknął curlSession, zmienna zawierająca zasób nie jest ustawiony na NULL, ale jest ustawiony na „” nieznanego typu. Więc to rozwiązuje problem:

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

nie jestem pewien dlaczego, ale to naprawić mój problem również z ciasteczek, więc może się okazać, że jeśli spróbujesz zamknąć już Zamknięta sesja Curl coś innego idzie źle.

Powiązane problemy