Ponieważ funkcja file_exists() działa tylko dla plików lokalnych, w sposób naturalny zradza się pytanie jak sprawdzić istnienie plików zdalnych (poza lokalnym systemem plików). Z pomocą przychodzi nam biblioteka CURL ( http://pl.php.net/curl, http://curl.haxx.se/libcurl/).
Co prawda od wersji 5.0.0 PHP w funkcji file_exists może być bezpośrednio użyty URL, ale wtedy trzeba włączyć zmienną konfiguracyjną allow_url_fopen, co raczej nie jest zalecane ze względów bezpieczeństwa.
Przykładowa funkcja sprawdzająca istnienie pliku przy użyciu CURLa mogłaby wygląda tak :
<?php /** * Funkcja sprawdza czy pliku zdalny istnieje * @param string $filename Adres pliku do sprawdzenia * @return bool */ function remote_file_exists($filename) { $ch = curl_init($filename); curl_setopt($ch, CURLOPT_NOBODY, true); curl_exec($ch); $response_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); return ($response_code == 200); }?>
Powyższa funkcja wysyła żądanie HEAD (opcja CURLOPT_NOBODY) do pobrania informacji o pliku, a następnie sprawdza kod odpowiedzi. Jeśli jest to liczba 200 (OK) to znaczy, że wszystko jest ok i plik istnieje.Użyłem tutaj metody HEAD, ponieważ w przeciwieństwie do metody GET, nie zwraca całego dokumentu, tylko same nagłówki odpowiedzi, co pozwala na przyspieszenie całego procesu.Trzeba jednak przyznać powyższa funkcja nie jest doskonała. Opiera się na tym, co nam zwraca serwer, a serwer może nam na przykład zwrócić stronę informującą o błędzie z kodem odpowiedzi 200 (OK) a nie zamiast kodu 404 (File Not Found). Tak więc niestety podane przeze mnie rozwiązanie nie sprawdzi się we wszystkich możliwych przypadkach, jednak nie należy, moim zdaniem, łatwo z niego rezygnować.Powyższy problem można częściowo rozwiązać poprzez ustawienie parametru CURLINFO_CONTENT_TYPE, który określa żądany typ MIME dokumentu. Przykładowo, jeśli chcemy sprawdzić istnienie pliku graficznego GIF ustawiamy ten parametr na image/gif.
<?php /** * Funkcja sprawdza czy plik zdalny o określonym typie MIME istnieje * @param string $filename Adres pliku do sprawdzenia * @param string $requested_content_type ?ądany typ MIME pliku * @return bool */ function remote_file_exists($filename, $requested_content_type) { $ch = curl_init($filename); curl_setopt($ch, CURLOPT_NOBODY, true); curl_exec($ch); $response_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); $content_ctype = curl_getinfo($ch, CURLINFO_CONTENT_TYPE); curl_close($ch); return (($response_code == 200) && ($content_type == $requested_content_type)); } ?>
Wypada dodac, ze CURL to raczej luksus nawet na serwerach (mocno) platnych ;) To samo mozna zrealizowac za pomoca funkcji fsockopen, od php 4.3 nawet z ssl nie ma problemu. Funkcja zawierac bedzie kilka linijek wiecej - w koncu wystarczy wyslac naglowki...