Изображение SRC из PHP-скрипта в IIS — не отображается последовательно

На прошлой неделе я преобразовал значения img src моей страницы, указывая на файлы изображений, на использование PHP-скрипта для обслуживания изображений. Основная причина заключалась в том, чтобы разместить как файлы, так и BLOB-объекты базы данных в качестве фактического источника.

Теперь, когда пользователь переходит на страницу, иногда изображения отображаются, а иногда нет. Если нет, и страница обновляется\перезагружается, то изображение появляется. Если изображения не отображаются, иногда это изображение, к которому пользователь уже обращался ранее сегодня.

Я в тупике.

Вот тег img:

<img src="../somedir/image_script.php?i=1234">

Файл image_script.php выясняет, откуда взять изображение, а затем заканчивается:

header("Content-type: image/jpeg");
if($from_db){
    print $image_blob;
} else {
    $im = imagecreatefromjpeg($image_file);
    imagejpeg($im,null,100);
    imagedestroy($im)
}

Я использую PHP 5.2.8 на IIS 6, используя FastCGI. В файле image_script.php нет заголовков кеша, а также в каталоге, в котором он находится. В настоящее время 99,9% изображений основаны на файлах, поэтому я не знаю, есть ли разница в результате между изображениями на основе базы данных и файлами. . Когда я перехожу непосредственно к image_script.php в своем браузере, он возвращает запрошенное изображение (i=????) в 100% случаев.

a> Любая подсказка относительно того, почему попали и промахнулись с отображаемыми изображениями? а также,

b> как правильно кэшировать изображения, обслуживаемые PHP-скриптом? (они очень статичны)

  • Скотт

person menkes    schedule 28.06.2010    source источник


Ответы (1)


Хм. Не могу сказать наверняка, но, возможно, у вашего imagecreatefromjpeg иногда не хватает памяти? В этом случае вы бы передавали сообщение об ошибке в виде данных JPEG и никогда его не видели, верно?

Между прочим, не будет ли более эффективным просто захватить файл изображения в виде строки и извлечь его, не проходя через imagecreatefromjpeg/imagejpeg/imagedestroy? Похоже, вы читаете файл JPEG, создаете из него изображение во внутренней памяти PHP, затем повторно конвертируете его в JPEG (с высоким качеством 100%), а затем отправляете эти данные, когда вы можете просто прочитать данные файла JPEG и распечатайте его, как вы это делаете из базы данных.

Что произойдет, если вы сделаете, скажем...

...
} else {
    header ('Content-length: ' .filesize($image_file));
    readfile ($image_file);
}
person Matt Gibson    schedule 28.06.2010
comment
Мэтт, отличное предложение по файлу для чтения. Я был так сосредоточен на добавлении части большого двоичного объекта базы данных, что поторопился с файловой частью. Отлично работает в тесте - мне нужно получить это на рабочем сервере, чтобы увидеть, решит ли это основную проблему. - person menkes; 28.06.2010
comment
Прохладный. Надеюсь, это поможет; если я прав в том, что время от времени не хватает памяти, так и должно быть, поскольку файл чтения будет гораздо менее интенсивно использовать память, а также будет легче на процессоре. - person Matt Gibson; 29.06.2010