написание динамических заголовков - PullRequest
2 голосов
/ 15 апреля 2010

У меня есть php-динамически сгенерированное изображение, которое мне нужно записать в файл для последующего вызова. Моя проблема в том, что мне нужно, чтобы в этом изображении были соответствующие заголовки истечения срока действия. Их огромное количество, и их заголовки варьируются индивидуально для каждого файла, поэтому элементы управления .htaccess не являются опцией.

Я могу написать заголовки истечения срока действия, если выводю изображение прямо в браузер с помощью этого: заголовок («Content-Type: image / jpeg»); header ('Expires: "'. gmdate (" D, d M Y H: i: s ", $ expirationDate). '"'); imagepng ($ image, NULL);

Или я могу записать изображение в файл для последующего использования с этим: imagepng ($ image, $ filepath)

Но я никак не могу понять, как объединить эти два и записать изображение в файл, включая заголовки его срока действия. Как вы будете писать файл изображения с заголовком expires?

Ответы [ 3 ]

1 голос
/ 15 апреля 2010

Я думаю, что лучше всего ставить сервер на файл, как вы, что-то вроде:

header("Content-Type: image/jpeg"); 
header('Expires: "' . gmdate("D, d M Y H:i:s",
  $expirationDate) . '"'); 
imagepng($image, NULL);

Конечно, вы используете php для обслуживания статического файла, но заголовок expire ограничит количество повторных запросов.

Обновление : поскольку $image - это сгенерированный файл, при первом запросе сгенерируйте и сохраните изображение, затем выведите его. По дополнительным запросам просто выведите уже сгенерированное изображение. По сути, заголовки expire контролируют кэш браузера, в то время как вам необходимо реализовать какое-либо кэширование на сервере, чтобы избежать генерации одного и того же вывода несколько раз.

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

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

Конечно, есть запутанный и сложный путь :

  • Настройте mod_rewrite для отправки запросов на отсутствующие изображения в ваш php-скрипт.
  • Добавить идентификатор сеанса к запросу изображения (чтобы он был уникальным для браузера).
  • Пусть php-скрипт отправит заголовок expire и содержимое изображения.
  • Пусть php-скрипт связывает реальное статическое изображение с именем конкретного сеанса.

Или что-то в этом роде. Я бы просто обслужил их всех, используя php.

Обновление : Или используйте mod_asis из Отличный ответ VolkerK .

1 голос
/ 15 апреля 2010

Если вы действительно хотите хранить как заголовки, так и содержимое в файлах на сервере, вы можете использовать mod_asis :

В файле конфигурации сервера свяжите файлы с обработчиком отправки как есть, например.
AddHandler send-as-is asis
Содержимое любого файла с расширением .asis будет затем отправлено Apache клиенту практически без изменений. В частности, заголовки HTTP выводятся из самого файла в соответствии с правилами mod_cgi, поэтому файл asis должен содержать действительные заголовки, а также может использовать заголовок CGI Status: для определения кода ответа HTTP.

Затем ваш php-скрипт записывает и заголовки, и содержимое в файлы, которые обрабатываются как send-as-is веб-сервером apache.

0 голосов
/ 15 апреля 2010

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

Если вы используете httpd apache, посмотрите на http://httpd.apache.org/docs/2.2/mod/core.html#fileetag и http://httpd.apache.org/docs/2.2/caching.html. По умолчанию httpd также отправит последний измененный заголовок и поддерживает If-Modified-Since заголовков запроса.
Когда ваш php-скрипт изменяет файлы изображений, также изменяется ETag и / или выполняется условие If-Modified-Since, и httpd отправляет данные. В противном случае он только отправит клиенту ответ «ничего не изменилось».

...