7 Январь 2009

PHP — проверка файла на наличие / существование

posted in PHP, Разработка |

Порой мы отображаем на сайтах контент с других ресурсов: картинки или фавиконы. Некоторе браузеры просто оставят пустое место (Firefox), другие же отобразят уродский прямоугольник, явно указывая, что чего-то не хватает (IE). Как же можно средствами PHP проверить существование файла.

Есть функция file_exists(), но она хороша только для файлов в пределах нашей файловой системы, а с удаленным сервером не пройдет.

Есть вариант открывать файл на чтение и в случие ошибки констатировать факт, что файла не существует:

<?
// файл, который мы проверяем
$url = "http://url.to/favicon.ico";

// пробуем открыть файл для чтения
if (@fopen($url, "r")) {
    echo "Файл существует";
} else {
    echo "Файл не найден";
}
?>

Однако такой прием занимает достаточно много времени.

Есть вариант еще лучше — использовать функцию get_headers():

она делает запрос к файлу и получает все заголовки с ответом примерно в таком массиве

Array
(
[0] => HTTP/1.1 200 OK
[1] => Date: Sat, 29 May 2004 12:28:13 GMT
[2] => Server: Apache/1.3.27 (Unix) (Red-Hat/Linux)
[3] => Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT
[4] => ETag: "3f80f-1b6-3e1cb03b"
[5] => Accept-Ranges: bytes
[6] => Content-Length: 438
[7] => Connection: close
[8] => Content-Type: text/html
)

Как мы видим, в нулевом элементе есть код ответа, 200 значит, что файл существует, и мы спокойно можем получить к нему доступ.
Вот код, который проверит существование файла.

<?
// файл, который мы проверяем
$url = "http://url.to/favicon.ico";
$Headers = @get_headers($url);
// проверяем ли ответ от сервера с кодом 200 - ОК
if(preg_match("|200|", $Headers&#91;0&#93;)) {
    echo "Файл существует";
} else {
    echo "Файл не найден";
}
?>

Теперь сравним по времени два метода с существующей favicon и с несуществующей:
при несуществующем файле второй метод (get_headers) выигрывает на две сотые секунды.
при существующем файле оба метода показали примерно одинаковое время.

У нас 7 комментариев на запись “PHP — проверка файла на наличие / существование”

Почему бы Вам не высказать своем мнение! Позвольте нам узнать, что Вы думаете...

  1. 1 On 05.02.2009, Иван said:

    Доброе время суток.
    Спасибо за пример.

    Только пришлось его слегка изменить, так как PHP ругался на массив $AgetHeaders
    его я заменил на $Headers

    1.

  2. 2 On 05.02.2009, scorpio said:

    да, сорри там была опечатка. уже поменял

  3. 3 On 17.04.2009, Мастер said:

    Спасибо за фун-ию file_exists(). А на счет проверки удаленного файла думаю вообще безсмысленно проверять через fopen. Тем более что функция get_headers имеется во всех сборках php.

  4. 4 On 09.06.2009, krundetz said:

    Велика вероятность что хостер разрешит fopen только для локальных файлов. Лучше юзать curl для этих целей!

  5. 5 On 25.12.2009, Виталий said:

    Большое спасибо, get_headers() мне очень хорошо помог! Я использовал для проверки стороннего файла (Погода — xml-файл). Все может быть, вдруг файла не будет, тогда выдается куча ошибок. При проверке уже соответственно будет обработка файла или нет.

  6. 6 On 08.02.2011, Viktor said:

    Это все конечно хорошо, но есть одно «но»
    get_headers() не учитывает редиректы.

  7. 7 On 11.03.2011, Владимир said:

    Спасибо, буду разбираться…

Оставить комментарий