Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Помогите разобраться с кэшированием изображений
 
 автор: BuZZZard   (15.06.2007 в 18:18)   письмо автору
 
 

Изображения выводятся из БД. Кэшировать нужно в броузере пользователя.

Перечитал уже кучу инфы из сети. Из прочитанного получилось:


<?php

    
// Проверяем, передан ли параметр id_image
    // и является ли он целым числом, чтобы
    // предотвратить SQL-инъекцию
    
if(!preg_match("|^[\d]+$|",$_GET['id']))
    {
        exit(
"Недопустимый формат URL-запроса");
    }

    
// Извлекаем файл изображения из базы данных
    
require_once("module/sqlconn.php");
    
$query "SELECT * FROM image
                WHERE id_image = " 
$_GET['id'];

    
$img mysql_query($query);
    if(!
$img) exit(mysql_error());
    
$image mysql_fetch_array($img);


  
// Отсылаем заголовки на загрузку файла
    
Header("Cache-Control: private, must-revalidate");
    
Header("Vary: Content-ID");
    
Header("Content-ID: ".md5($image['content']));
    
Header("Content-type: " trim($image['type']));

  
// Отправляем файл пользователю
    
echo $image['content'];
?>


Но картинки в кэше броузера не появляются. Может в заголовках что не так?
Помогите, умные люди!

   
 
 автор: Trianon   (15.06.2007 в 18:22)   письмо автору
 
   для: BuZZZard   (15.06.2007 в 18:18)
 

Проверьте заголовок IF-modified-since
Выдайте статус 304 HTTP/1.0 Not modified - если и вправду картинко то же самое...

   
 
 автор: BuZZZard   (15.06.2007 в 18:31)   письмо автору
 
   для: Trianon   (15.06.2007 в 18:22)
 

Как это сделать?

Картинка та же самая. выводится несколько раз на одной странице.

Еще поясню.
Нужно принудительное кэширование картинок. Если картинка изменяется - нужно загрузить новую. Автоматически.

   
 
 автор: Trianon   (15.06.2007 в 19:10)   письмо автору
 
   для: BuZZZard   (15.06.2007 в 18:31)
 

В смысле - как?
Как заголовок запроса получить?
либо в массиве $_SERVER поглядеть, либо функцией get_all_headers(0 вытащить.

   
 
 автор: BuZZZard   (15.06.2007 в 19:35)   письмо автору
 
   для: Trianon   (15.06.2007 в 19:10)
 

Вот все заголовки:


    [0] => HTTP/1.1 200 OK

    [1] => Date: Fri, 15 Jun 2007 15:36:09 GMT

    [2] => Server: Apache/2.2.4 (Win32) PHP/5.2.1

    [3] => X-Powered-By: PHP/5.2.1

    [4] => Cache-Control: private, must-revalidate

    [5] => Vary: Content-ID

    [6] => Content-ID: 68dc8f2e2c1d1717628f4db8e40320b7

    [7] => Content-Length: 1149

    [8] => Connection: close

    [9] => Content-Type: image/gif

   
 
 автор: Trianon   (15.06.2007 в 19:38)   письмо автору
 
   для: BuZZZard   (15.06.2007 в 19:35)
 

это заголовок отклика. А я говорю о

echo '<pre>';
print_r( getallheaders());

   
 
 автор: BuZZZard   (15.06.2007 в 19:49)   письмо автору
 
   для: Trianon   (15.06.2007 в 19:38)
 


(
    [Accept] => */*
    [Accept-Language] => ru
    [Accept-Encoding] => gzip, deflate
    [User-Agent] => Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
    [If-Modified-Since] => Fri, 15 Jun 2007 15:36:10 GMT
    [Host] => localhost
    [Proxy-Connection] => Keep-Alive
    [Pragma] => no-cache
    [Cookie] => PHPSESSID=46lhpaqsr66gakbah0fjs0du65
)


Видимо вот моя беда:

[Pragma] => no-cache 


А как с ней бороться?

   
 
 автор: BuZZZard   (15.06.2007 в 20:07)   письмо автору
 
   для: Trianon   (15.06.2007 в 19:38)
 

Изменил картинку и сохранил ее в базе.
Теперь получаю вот это:


Array
(
    [0] => HTTP/1.1 200 OK

    [1] => Date: Fri, 15 Jun 2007 16:07:32 GMT

    [2] => Server: Apache/2.2.4 (Win32) PHP/5.2.1

    [3] => X-Powered-By: PHP/5.2.1

    [4] => Cache-Control: private, must-revalidate

    [5] => Vary: Content-ID

    [6] => Content-ID: 4bdbb68a88243599686c9e162832ed6b

    [7] => Content-Length: 1151

    [8] => Connection: close

    [9] => Content-Type: image/gif

)

Array
(
    [Accept] => image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*
    [If-Modified-Since] => Fri, 15 Jun 2007 16:01:12 GMT
    [Referer] => http://localhost/test/
    [Accept-Language] => ru
    [Accept-Encoding] => gzip, deflate
    [User-Agent] => Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
    [Host] => localhost
    [Proxy-Connection] => Keep-Alive
    [Cookie] => PHPSESSID=7pchuv7jpfa7d2pa3pu0rig7m5
)




Причем

[If-Modified-Since] => Fri, 15 Jun 2007 16:07:34 GMT


при новом запросе новая дата :(
Управлять этим хедером?
Получать из базы дату изменения файла и ее подставлять?
Голова кругом.

Плохо когда не знал, да еще и забыл :(

   
 
 автор: Trianon   (15.06.2007 в 20:10)   письмо автору
 
   для: BuZZZard   (15.06.2007 в 20:07)
 

Ну вот видите?
[If-Modified-Since] => Fri, 15 Jun 2007 16:01:12 GMT

Значит если Since Fri, 15 Jun 2007 16:01:12 GMT Вами эта картинка Not modified - то и скажите об этом браузеру. { header("304 HTTP/1.1 Not modified"); die(); }

   
 
 автор: BuZZZard   (15.06.2007 в 20:22)   письмо автору
 
   для: Trianon   (15.06.2007 в 20:10)
 

Начинаю втыкаться.
Я правильно понял, что нужно сравнить [If-Modified-Since] с датой изменения картинки? И в случае если дата картинки раньше [If-Modified-Since] то header("304 HTTP/1.1 Not modified"); ?

И это единственный хедер , который стоит в этом случае отправлять?

   
 
 автор: Trianon   (15.06.2007 в 20:27)   письмо автору
 
   для: BuZZZard   (15.06.2007 в 20:22)
 

то header() и тут же выход из скрипта. Генерировать нечего.
статус not modified даже пустого тела не создает.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования