Я сохраняю все мои изображения за webroot (до /var/www/
), что означает, что веб-сервер не может отправлять заголовки кэша обратно для моих изображений. Что мне нужно добавить к этому, чтобы заставить веб-кеш пользователя работать? В настоящее время это происходит каждый раз в том же браузере.
Мой путь <img>
на моих страницах выглядит примерно так:
<img src="pic.php?u=1134&i=13513&s=0">
Изменить: Может быть, это потому, что « pic.php?u=1134&i=13513&s=0
» не является допустимым именем файла или чем-то еще?
// pic.php <?php // open the file in a binary mode $user = $_GET['u']; $id = $_GET['i']; $s = $_GET['s']; if (!isset($user) && !isset($s) && $isset($id)) { // display a lock! exit(0); } require_once("bootstrap_minimal.php"); //setup db connection, etc // does this image_id belong to the user? $stmt = $db->query('SELECT image_id, user_id, file_name, private FROM images WHERE image_id = ?', $id); $obj = $stmt->fetchObject(); if (is_object($obj)) { // is the picture is the users? if ($obj->user_id != $_SESSION['user_id']) { // is this a private picture? if ($obj->private == 1) { // check permissions... // display a lock in needed! } } } else { // display a error pic?! exit(0); } if ($s == 0) { $picture = $common->getImagePathThumb($obj->file_name); } else { $picture = $common->getImagePath($obj->file_name); } // send the right headers header("Content-Type: image/png"); header("Content-Length: " . filesize($picture)); $fp = fopen($picture, 'rb'); // dump the picture and stop the script fpassthru($fp); exit; ?>
Вам нужно добавить что-то вроде:
$expiry = 3600*24*7; // A week header('Expires: ' . gmdate('D, d MYH:i:s' time() + $expiry) . ' GMT'); header('Cache-control: private, max-age=' . $expiry);
По умолчанию Apache кэширует только статические файлы. Вам нужно отправить заголовок управления кэшем через функцию header()
. В этой статье много информации по этой теме.
Кроме того, вы можете использовать файл PHP для перенаправления на фактическое местоположение изображения. (Это, наверное, самый простой способ, если вы ничего не знаете о заголовках.)
Вы можете попробовать:
header("Cache-Control: max-age=3600");
Это должно отправить тайм-аут кеша на один час в файле.
Что бы я делал в вашей ситуации, это поток байтов изображения с помощью .php-файла. Не связывайтесь напрямую с изображениями; вместо этого, ссылается на файл php, который: – выводит заголовки кеша – считывает файл с диска, из-за webroot – отправляет биты изображения вниз по проводу
Простой ответ: вы не говорите браузеру своих пользователей, чтобы кэшировать его