2012-03-13 7 views
3

Мой скрипт php анализирует профиль пользователя на другом сайте, берет некоторую информацию и генерирует изображение .png с ним для определенного пользователя (script.php? Username =). Каждый раз, когда страница с этими изображениями загружается, сценарий запускается снова и снова. Как я могу кэшировать изображения и запускать сценарий снова, если информация, которую он выводит, была изменена? Это сэкономит массу ресурсов.Кэширование динамического изображения, сгенерированного на php

+0

Извините, что сказал это сейчас, но я полный ноб, и я не понимаю многих вещей, которые вы мне рассказываете. Спасибо за информацию, хотя, надеюсь, Google сделает сейчас. У меня также есть nginx, а не apache, поэтому .htaccess не будет работать, или я ошибаюсь? – Madi

+0

Судя по большинству ответов, я думаю, вы хотите расширить часть воссоздания изображения, если информация пользователя изменилась. Ваш вопрос неправильно понят только для обозначения простой механики кэширования изображений. – Basti

+0

Итак, я решил воссоздать образ, только когда прошло 24 часа после последнего творения. Спасибо всем пользователям за помощь! – Madi

ответ

0

Вам нужно будет разобрать профиль пользователя снова на каждый запрос, чтобы узнать, если что-то изменилось.

Затем вы можете выбросить всю информацию в какой-либо хеш, например md5($name.$location), и хранить эту информацию в любом месте. Если теперь вы получите запрос на изображение, проанализируйте профиль пользователя, снова создайте хеш и посмотрите этот хеш. Если вы сохранили его, вы ранее создали изображение и можете просто его вывести. Если хэш отличается, информация пользователя также изменилась, и вам придется воссоздать изображение.

Вы также можете применить эвристику, например, тот факт, что пользователь может изменять свой профиль только один раз в час или даже один раз в день. С помощью этого предположения вы можете сравнить дату создания изображения пользователя и только проанализировать информацию пользователя, если изображение старше часа (или дня).

+0

Это хорошая идея хранить изображения в течение 24 часов (например) и обновлять их по истечении времени. Думаю, я пойду так, для меня не так важно иметь изменения в реальном времени. Благодаря! – Madi

2

установить заголовки PHP, чтобы сообщить браузеру, что кэшируется ресурс:

header("Last-Modified: " . date("D, d M Y H:i:s", getlastmod())); 
2

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

// put this above any php image generation code: 
session_start(); 
header("Cache-Control: private, max-age=10800, pre-check=10800"); 
header("Pragma: private"); 
header("Expires: " . date(DATE_RFC822,strtotime(" 2 day"))); 

https://dtbaker.net/blog/web-development/2009/06/how-to-cache-images-generated-by-php/

+0

Здравствуйте, не могли бы вы обновить свою ссылку? Тот, который вы опубликовали, теперь мертв. –

+0

@LorenzMeyer Обновлено. – Milap

3

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

Что-то вроде: -

if(file_exists(image12345.png && !checkIfDataChanged()){ 
    serve cached file; 
} else { 
    generate new file; 
    save new file to image12345.png; 
    serve cached file; 
} 

Этот псевдо-код конечно, но он должен быть достаточно легким для вас, чтобы перевести его в PHP.

+0

Процитировать OP 'Как я могу кэшировать изображения и снова запускать скрипт, если информация, которую он выводит, была изменена?'. Информация пользователя будет меняться со временем, чтобы изображения были повторно созданы. – Basti

+0

@Basti О да, отредактирован. В вашем решении будет использоваться хэш как имя файла? – vascowhite

+0

Возможно, да. Но вы не могли бы больше сопоставить имя пользователя с его изображением без предварительного анализа его профиля. – Basti

5

Кэш изображения на диск и пусть Apache позаботится об остальном.

Во-первых, повторить свой образ URI, таким образом они похожи на:

<img src="/images/profiles/johnsmith.png" /> 

Затем в /images/profiles/, поместите .htaccess файл:

<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)\.png$ /script.php?username=$1 [QSA,L] 
</IfModule> 

Затем ваш сценарий написать результирующее png на диск перед подачей его пользователю. В следующий раз, когда изображение будет запрошено, он получит его непосредственно с веб-сервера.

Когда информация о профиле пользователя изменяется, просто удалите существующий .png-файл с сервера, и ваш скрипт будет запущен при следующем обращении к изображению.

Если вы не хотите, чтобы веб-сервер мог писать в корневом каталоге сети, пишите вне него и выполняйте задание cron.

+0

блестящий! Это решение отлично работает! –

Смежные вопросы