7 Январь 2009

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

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

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

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

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

PHP:
  1. <?
  2. // файл, который мы проверяем
  3. $url = "http://url.to/favicon.ico";
  4.  
  5. // пробуем открыть файл для чтения
  6. if (@fopen($url, "r")) {
  7.     echo "Файл существует";
  8. } else {
  9.     echo "Файл не найден";
  10. }
  11. ?>

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

Есть вариант еще лучше - использовать функцию 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 значит, что файл существует, и мы спокойно можем получить к нему доступ.
Вот код, который проверит существование файла.

PHP:
  1. <?
  2. // файл, который мы проверяем
  3. $url = "http://url.to/favicon.ico";
  4. $Headers = @get_headers($url);
  5. // проверяем ли ответ от сервера с кодом 200 - ОК
  6. if(preg_match("|200|", $Headers[0])) {
  7.     echo "Файл существует";
  8. } else {
  9.     echo "Файл не найден";
  10. }
  11. ?>

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

У нас куча комментариев (5) на запись “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-файл). Все может быть, вдруг файла не будет, тогда выдается куча ошибок. При проверке уже соответственно будет обработка файла или нет.

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