Failed to open stream i file_get_contents(url)
Pokušali ste da, u vašoj PHP skripti, pročitate neki fajl sa interneta, i nailazite na problem da je fajl nedostupan. bez obzira na uzrok, da li je to neispravna putanja, ili fajl jednostavno ne postoji.
Sa ovim problemom sam se skoro susreo na jednom serveru, a što je bilo još čudnije, ispis greške nije mogao da se preskoči ni stavljanjem @ ispred file_get_contents, ni ubacivanjem error_reporting(0) pre poziva funkcije za čitanje fajla. Mada bi, po svoj logici, barem error_reporting(0) trebao da spreči ispis svih grešaka i upozorenja, a PHP vam izbacuje grešku sličnu ovoj:
Warning: file_get_contents(http://www.example.com/neka/putanja/fajl.php) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 404 File Not Found
Pretraživanjem interneta sam naišao na gomilu strana na kojima programeri pitaju za rešenje ovog problema, ali barem u prvih 30 linkova nisam našao rešenje, pa sam odustao od daljeg traženja. Problem, u ovim tekstovima koje sam čitao, bio taj da otvaranje URL-ova nije dozvoljeno, ili link koji se želi otvoriti nije bio ispravan. U mom slučaju problem je bio u tome što se link sa koga se čita fajl, formira dinamički, a podaci za kreiranje tog linka se uzimaju iz baze za koju nisam odgovoran.
Za proveru postojanja nekog fajla postoji funkcija file_exists, ali ona radi samo sa lokalnim fajlovima. Da bi ste proverili da neki fajl postoji na internetu morate kosristiti cURL. cURL je ekstenzija koja se ukljucuje kroz php.ini, na vecini hostova je ukljčena, , na sajtu PHP-a se nalazi detaljno uputstvo za rad sa ovom ekstenzijom.
Na kraju evo primera:
function url_exists($url) {
if (!$c = curl_init($url)) return false;
curl_close($c);
return true;
}
$file = 'http://www.example.com/neka/putanja/fajl.php';
$data = '';
if (url_exists($file)) {
$data = file_get_contents($file);
}
Malo objašnjenje kako ovo sve radi, curl_init($url) u slučaju da fajl ne postoji vraća false, a u slučaju postojanja lokacije, vraća hendler, koji se odmah potom i zatvara. I to je to.
