Проверка существования файла-картинки перед выводом на экран в Kohana3
Все наверное сталкивались с проблемой, когда на сервере отсутствует картинки и вместо неё зияет дыра, особенно это видно в глючном семействе браузеров ИЕ. Как бы избежать этого, ну чтобы или вообще эта картинка не показывалась?
Во многих фреймверках имеются инструменты для работы с частыми HTML тегами, например для работы с тегом IMG во фреймворке Kohana имеется статический метод image, который располагается в классе HTML. Я рекомендую именно писать ссылки, картинки, элементы форм используя инструменты фреймверка, в чем выигрыш? Да в том, что можно управлять создаваемым тегом.
Вот реальный пример, когда мы в Kohana пишет тег image:
Html::image('/img/news/test.jpg', array('alt'=>'Testing'));
то при выводе на экран эта строка превратится в тег:
<img src="http://site.com/img/news/test.jpg" alt="Testing" />
Если картинка на серваке отсутствует, то в зависимости от браузера она либо на экран не покажется, либо просто зиять её дыра, но по-любому будет лишний запрос-заголовок к серверу для выдачи фотки.
http://nagaychenko.com/test.jpg GET /test.jpg HTTP/1.1 Host: nagaychenko.com User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 3.5.30729) Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: ru,uk;q=0.8,en-us;q=0.6,en;q=0.4,de;q=0.2 Accept-Encoding: gzip,deflate Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Cookie: MANTIS_VIEW_ALL_COOKIE=4; MANTIS_PROJECT_COOKIE=1; Pragma: no-cache Cache-Control: no-cache HTTP/1.x 200 OK Date: Thu, 21 Jan 2010 09:09:33 GMT Server: Apache/2.2.14 (Unix) mod_ssl/2.2.14 OpenSSL/0.9.8e-fips-rhel5 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635 PHP/5.2.11 Last-Modified: Thu, 21 Jan 2010 09:08:49 GMT Etag: "3b90001-1a31b-47da90d10ea40" Accept-Ranges: bytes Content-Length: 107291 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Content-Type: image/jpeg
Чтобы этого избежать я перекрыл метов image и теперь я просто делаю проверку на файл, если файла реально нет, то и ничего не вывожу, никаких лишних запросов на сервер не делаю.
/** * Creates a image link. * * @param string file name * @param array default attributes * @return string */ public static function image($file, array $attributes = NULL, $index = FALSE) { $file_from_another_server = FALSE; if (strpos($file, '://') === FALSE) { $file_exists = (is_file($_SERVER['DOCUMENT_ROOT'].$file) AND file_exists($_SERVER['DOCUMENT_ROOT'].$file)) ? TRUE : FALSE; // Add the base URL $file = URL::base($index).trim($file,'/'); } else { $file_from_another_server = TRUE; } // Add the image link $attributes['src'] = $file; // провряем есть ли файл на ФС if ($file_exists) { return '<img'.HTML::attributes($attributes).' />'; } elseif($file_from_another_server) { return '<img'.HTML::attributes($attributes).' />'; } }
В коде я проверяю на присутствие именно файла, т.к. php-функция file_exists проверяет существование директории, т.е. написали вы просто путь и получите положительный ответ, но этоже не файл! Поэтому я еще и проверяю файл ли я передаю ф-циец is_file.
Если передаешь ссылку с другого сайта, то тут я ничего проверить не могу, в таком случае я просто отдаюсь на сознательность другого сервера.
Проверил сам и использую на своем проекте.
В помощь тебе, юзер.
Статья просмотренна 83999 раз, зашло посетителей 26291
Но такая проверка замедляет генерацию ответа сервера. Так как проверка существования файла — это файловая операция, а они как известно медленные. Или я не правильно понимаю процесс?
Да, вы совершенно правы, но можно немного развить тему и включить данный метод только для профилактики, дабы найти где отсутствуют картинки, потом что-то сделать. На продакшене с большим наплывом посетителей так делать не стоит.
Да если так то мне это кажется целесообразным.