Кэшировать и отображать изображения php

Я использую php-скрипт для отображения изображений, хранящихся в моей базе данных в виде больших двоичных объектов.

Я использовал их для отображения с помощью следующего скрипта.

<?php

if (!empty($_GET['user_id'])){//script to display an image from the database you basicly just get the id from the picture in matter and fucking acess it
include_once "DBH.php";
//Get image data from database

$id = mysqli_real_escape_string($conn, $_GET['user_id']);
$result = $conn->query("SELECT image FROM profilePictures WHERE user_id = $id");
if ($result->num_rows > 0){
    $imgData = $result->fetch_assoc();
    header("Content-type: image"); 
    echo $imgData['image']; 
}else{
    echo 'Image not found...';
}
}
?>

В контексте, где

<img src = 'displayProfilePicture.php?user_id=n'>

Div, содержащий div, часто обновляется, и обновление изображения пользователей кажется большим количеством ненужной обработки. Я хочу кэшировать изображения профиля на веб-странице, чтобы мне не приходилось каждый раз запрашивать их из базы данных. Я начал много читать о том, как можно кэшировать изображения, но не мог найти никакого контента о том, как отображать кешированные изображения.

Для меня это проблема, поскольку изображения немного мерцают каждый раз, когда img обновляется с помощью скрипта php. В оптимальном мире я вижу, что img загружается один раз, а затем после этого его не нужно загружать.

Контекст, в котором я использую сценарий отображения img, находится в чате, который обновляется с интервалом таймера в ajax-запросе. $ ("# chatlogs"). load ("logs.php");

 logs.php

 if (isset($_SESSION['chatRoomId'])){
 while ($extract = mysqli_fetch_array($result1))
 {
   $from = $extract['from'];

   //make an object to echo.
   if ($from == $id){
   echo "<div class='chatContainer self'>
    <div class = 'imgContainer'>
     <img src='displayProfilePicture.php?user_id=$selfId'>
    </div>
   <div class='content'>
    <div class = 'message'>
        ". $extract['msg'] ."
    </div>
</div>
</div>";
}else{
echo "<div class='chatContainer friend'>
<div class = 'imgContainer'>
  <img src='displayProfilePicture.php?user_id=$guestId'>
</div>
<div class='content'>
    <div class = 'message'>
        ". $extract['msg'] ."
    </div>
</div>
</div>";
}
}
}

Перед отправкой изображения необходимо установить заголовки кеширования.

Kerkouch 10.03.2018 20:21

Кроме того, я заметил, что когда изображение не было найдено, почему вы не отправили заголовок 404 Not Found, чтобы браузер понял, что ресурс не был найден.

Kerkouch 10.03.2018 20:22

Также mysqli_real_escape_string не собирается защищать вас от SQL-инъекции !!

Kerkouch 10.03.2018 20:25
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
638
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Думаю, это то, что вы ищете:

<?php

if (empty($_GET['user_id']) || !preg_match( '/^[0-9]+$/' , $_GET['user_id'])){
    header( '400 Bad Request' );
    exit(1);
}

include_once "DBH.php";


$user_id = intval( $_GET['user_id'] );

$result = $conn->query("SELECT image FROM profilePictures WHERE user_id = $user_id");
if ($result->num_rows == 0){
    // Not Found
    header('404 Not Found');
    exit(1);
}

$imgData = $result->fetch_assoc();
header("Content-type: image"); 
$cache_for = 3600; // One hour in seconds 
$cache_until = gmdate("D, d M Y H:i:s", time() + $cache_for) . " GMT";
header("Expires: $cache_until");
header("Pragma: cache");
header("Cache-Control: max-age=$cache_for");
echo $imgData['image'];
exit(0);

Комментарии

Сначала я проверил, указан ли user_id в запросе, если да, то проверьте, действительный ли это номер, если он не отвечает, а затем выдает ошибку 400.

А также я удалил SQLi из вашего кода src='displayProfilePicture.php?user_id=-1 or 1=1.

И я установил заголовки кеширования, поэтому браузер будет кэшировать изображение в течение часа.

Когда мы устанавливаем кеш ... если вы не возражаете, я спрошу. Как же он тогда хранится? Потому что я вижу, что этот код работает в моем проекте, но мне кажется, что запрос все еще обрабатывается при каждом вызове скрипта. Просто img хранится в заголовке, чтобы он мог получить img быстрее? Кеширование для меня очень абстрактно. Так что было бы очень хорошо получить некоторое разъяснение по этому поводу. Я попытался найти его, но ни у кого нет такого конкретного примера. С наилучшими пожеланиями

Albin wärme 11.03.2018 11:31

Я только что нашел этот вопрос stackoverflow.com/questions/7324242/…

Kerkouch 12.03.2018 00:37

Другие вопросы по теме