Эта тема на forum.dklab.ru


Дрёмин Е.М.: Возможно ли кэширование imagejpeg()
В общем написал такую фигню. Т.е. чтобы не засорять сервер огромным количеством мелких картинок-превьюшек, попытался кэшировать результат вывода imagejpeg()
Но по-моему не работает. Файлы в папку cache/images/ сохраняются, однако на скорость загрузки рисунков это не влияет. Можно ли что-нибудь с этим сделать?

header("Content-type:image/jpeg");

// - начало кода кэширования
$url=$GLOBALS['REQUEST_URI'];
$crc=md5($url);
$modif=time()-@filemtime ("$DOCUMENT_ROOT/cache/images/$crc");
if ($modif<43200)
{
include ("$DOCUMENT_ROOT/cache/images/$crc");
exit();
}
ob_start ();
// - начало кода кэширования

// - начало кода отображения превьюшки
$result = mysql_query("select image from news where id=$id");
while($row=mysql_fetch_array($result))
{
$row[image]=$file;
@$file_image=imagecreatefromjpeg("$DOCUMENT_ROOT/images/public/$file");
@$width_file_image=imagesx($file_image);
@$height_file_image=imagesy($file_image);
@$ratio = $width_file_image/90;
@$width_file2_image=round($width_file_image/$ratio);
@$height_file2_image=round($height_file_image/$ratio);
@$file2=imagecreatetruecolor($width_file2_image,$height_file2_image);
@imagecopyresized($file2, $file_image, 0, 0, 0, 0, $width_file2_image, $height_file2_image, $width_file_image, $height_file_image);
@imagejpeg($file2);
@imagedestroy($file2);
@imagedestroy($file);
// - конец кода отображения превьюшки

// - конец кода кэширования
$cache = ob_get_contents();
ob_end_clean ();
echo $cache;
$fp = @fopen ("$DOCUMENT_ROOT/cache/images/$crc", "w");
@fwrite ($fp, $cache);
@fclose ($fp);
// - конец кода кэширования

Константин Жинько [tIT]:
Ой... register_globals включены, строковые индексы массива незакавычены, сплошные собаки... Ужас!
А Вы проверьте, влияет или не влияет.
Добавьте по эхе в каждый блок условия, уберите заголовки и вывод собственно бинарных данных. При этом, если файла нет, то сначала отобразится вторая эха, потом первая. Если это не так, значит ошибка есть. Сама постановка "по-моему не работает" ни о чем не говорит, согласитесь?
Дрёмин Е.М.:
Ответ железный "не влияет". Вопрос, вытекающий однозначно "что не так"?
Всякие там кавычки и прочее - это детали. Исправить недолго, тем более, что превьюшки и так отображаются...
Еще один касяк. Не сохраняет в файл, указанный в imagejpeg()
Владимир Хоменко:
Держите 'подправленный' код:


<?
$url = $_SERVER['REQUEST_URI'];
$crc = md5($url);
$cache_file = $_SERVER['DOCUMENT_ROOT']."/cache/images/$crc";
$id = $_REQUEST['id'];
$file = $_REQUEST['file'];
$image_file = $_SERVER['DOCUMENT_ROOT']."/images/public/$file";

if (file_exists($cache_file)) {
$modif = time() - filemtime($cache_file);
if ($modif < 43200) {
header("Content-Type: image/jpeg");
readfile($cache_file);
exit();
}
}

$result = mysql_query("select image from news where id = $id");
$row = mysql_fetch_array($result);

if (!$file || !file_exists($image_file) || !$row) {
header("HTTP/1.1 404 Not Found");
print "Not found";
exit;
}

$file_image = imagecreatefromjpeg($image_file);
$width_file_image = imagesx($file_image);
$height_file_image = imagesy($file_image);
$ratio = $width_file_image / 90;
$width_file2_image = round($width_file_image / $ratio);
$height_file2_image = round($height_file_image / $ratio);
$file2 = imagecreatetruecolor($width_file2_image, $height_file2_image);
imagecopyresized($file2, $file_image, 0, 0, 0, 0, $width_file2_image, $height_file2_image, $width_file_image, $height_file_image);

ob_start();
imagejpeg($file2);
$cache = ob_get_contents();
ob_end_clean();

$fp = @fopen($cache_file, "w");
if ($fp) {
@fwrite($fp, $cache);
@fclose($fp);
}

header("Content-Type: image/jpeg");
echo $cache;
?>


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

По поводу скорости:


ab -n 100 -c 10 <URL-WITHOUT-CACHE>
Requests per second: 33.09 [#/sec] (mean)

ab -n 100 -c 10 <URL-WITH-CACHE>
Requests per second: 180.51 [#/sec] (mean)

bæv:
Всякие там кавычки и прочее - это детали.
— вот из-за этих деталей Вы и не можете ошибки увидеть.


Исправить недолго
— так почему до сих пор не исправили?

В общем:
1. «Собак» уберите.
2. Читайте замечания/сообщения об ошибках.
3. Исправьте код следуя пункту 2.

и обязательно прочтите вот это:
http://phpfaq.ru/debug


Не сохраняет в файл, указанный в imagejpeg()
«Собаку» уберите. И посмотрите в мануале параметры этой функции.

P.S. Владимир Хоменко: -1
Владимир Хоменко:
bæv Я знал, что кто-то это сделает (-;
Юрий Насретдинов:
Я знал, что кто-то это сделает (-;
Вы нарушили правила форума, а потому... :)
Дрёмин Е.М.:
Спасибо большое! Буду разбираться...

Эта тема на forum.dklab.ru