2010-04-15 3 views
2

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

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

Или я могу записать образ файла, который будет использоваться в дальнейшем с этим: imagepng ($ изображения, $ Filepath)

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

+0

Истекает HTTP-заголовок протокола. Вы не можете писать заголовки HTTP в файлы – Mark

+0

Спасибо за это. Я также попытался написать файл php, который будет загружаться как изображение: fwrite ($ myFile, ''); ob_start(); imagepng ($ image); imagedestroy ($ image); fwrite ($ myFile, ob_get_flush()); Это пишет кучу развращенной ерунды, явно не распознающей данные изображения как данные изображения. Это не проблема с использованием выходного буфера для захвата изображения, как будто я просто повторяю результат ob_get_flush() в конце, изображение отображается там в порядке. – Jen

+0

Предоставление php-кода файлу изображения определенно не будет работать. Скажите нам, что вы пытаетесь выполнить, и, возможно, есть другое программное решение, которое мы можем помочь с помощью – Mark

ответ

1

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

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

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

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

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

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

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

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

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

Обновление: Или используйте mod_asis от VolkerK's great answer.

+0

Моя самая большая проблема заключается в том, что $ image является результатом очень долгого процесса генерации изображений, поэтому я не хочу повторно запускать скрипт, который создает $ image каждый раз, когда новый пользователь приходит в файл изображения.Я думал, что простым решением было бы, чтобы первый файл php записывал второй php-файл, который отправляет соответствующие заголовки, а затем выводит данные необработанного изображения без необходимости генерировать его заново, но, похоже, что эти данные не нравятся записанный во вторичный файл. См. Мои комментарии выше, как я попытался и не смог с этим справиться. – Jen

+0

Думаю, я нашел ответ. Я пишу свое png-изображение в файл, а затем пишу php-файл, чтобы отправить правильные заголовки истечения и прочитать файл png-изображения. Недостатком является то, что я обрабатываю два файла, где я надеялся использовать их только один. Насколько я могу от этого выиграть? Не то, чтобы у меня было очень много других вариантов. – Jen

+0

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

1

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

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

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

+0

+1 Отличный ответ, проигнорируйте мою. :-) –

+0

После того, как вы настроили обработчик send-as-is, как бы вы начали писать такой файл? Я не совсем уверен, как писать заголовки файлов. Мне только приходилось использовать php, чтобы генерировать их самостоятельно. Есть ли хорошая ссылка на синтаксис заголовка или что мне нужно знать, чтобы успешно заставить мои собственные заголовки с помощью этого метода? – Jen

+0

hm hm hm, я не уверен, что это правильное направление. Это интересная альтернатива, но я не уверен, что изображения должны храниться в файлах на сервере в любом случае. Устранение проблемы (-ов) в «оригинальном» скрипте может быть лучшим советом. – VolkerK

0

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

Если вы используете httpad 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 отправляет данные. В противном случае он отправил бы только ответ «ничего не изменилось» клиенту.

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