therion.kiev, спасибо конечно что пытаетесь помочь.
Но без подробного описания это больше медвежья услуга... :)
Люди просто копипастят себе что-то из интернета, совершенно не понимая что происходит.
Как минимум стоило бы указать что путь
/home/therion/alva.kiev.ua/www/ у каждого свой и стоит поправить, а не тупо передирать.
Плюс в чем сложность попросить хостера установить эти самые jpegoptim и optipng?
Это совершенно не проблема в большинстве случаев и ни к чему заливать свои бинарники, которые еще и далеко не у всех запустятся.
Вдобавок, возможно у вас отключены warning'и в php, но у кого-то может нет и логи будут изобиловать сообщениями типа "PHP Warning: Cannot modify header information".
А все потому что, смотрим что происходит:
Проверка есть ли доступ к фотке
И внутри этого условия:
Получаем mine тип файла.
Код: Выделить всё
$mimeType = image_type_to_mime_type(exif_imagetype($resized_filename));
И дальше 2 раза сравниваем, а не png или jpeg ли у нас файлик часом.
Код: Выделить всё
if ($mimeType == ' image/png') {
if ($mimeType == 'image/jpeg') {
Сразу вопрос - почему у вас перед image/png 3 пробела?
Если совпадает с png или jpeg, то внутри соответствующего условия оно во-первых шлет заголовок header('Content-type: ' . $mimeType), а дальше прогоняет через optipng или jpegoptim.
Ладно, но зачем потом еще раз шлется заголовок header('Content-type: image') ?
И,
жесть, еще раз print file_get_contents($resized_filename)
Это и вызывает предупреждение в логах из-за двойного заголовка. И главное - само содержание фотки передается в двух экземплярах друг за другом.
Браузеры конечно достаточно разумные чтоб показать правильно, но это же бред...
короче правильней так:
Код: Выделить всё
if(is_readable($resized_filename)) {
$mimeType = image_type_to_mime_type(exif_imagetype($resized_filename));
header('Content-type: ' . $mimeType);
if ($mimeType == 'image/png') {
$output = shell_exec("optipng -o7 -strip all ".escapeshellarg($resized_filename));
}
elseif ($mimeType == 'image/jpeg') {
$output = shell_exec("jpegoptim --max=75 --strip-all --preserve --totals ".escapeshellarg($resized_filename));
}
print file_get_contents($resized_filename);
}
Обращаю внимание что остальную часть resize.php не трогаем.
Правим только то, что начинается с if(is_readable($resized_filename)) {
И обращаю внимание на:
shell_exec("optipng...
shell_exec("jpegoptim...
Если в логах будет ошибка что мол нет такого, то просим хостера поставить.
Ну или в крайнем случае все же пробуем закинуть свои бинарники и указываем тут полный правильный путь к ним.
[b]therion.kiev[/b], спасибо конечно что пытаетесь помочь.
Но без подробного описания это больше медвежья услуга... :)
Люди просто копипастят себе что-то из интернета, совершенно не понимая что происходит.
Как минимум стоило бы указать что путь [b]/home/therion/alva.kiev.ua/www/[/b] у каждого свой и стоит поправить, а не тупо передирать.
Плюс в чем сложность попросить хостера установить эти самые jpegoptim и optipng?
Это совершенно не проблема в большинстве случаев и ни к чему заливать свои бинарники, которые еще и далеко не у всех запустятся.
Вдобавок, возможно у вас отключены warning'и в php, но у кого-то может нет и логи будут изобиловать сообщениями типа "PHP Warning: Cannot modify header information".
А все потому что, смотрим что происходит:
Проверка есть ли доступ к фотке
[code]if(is_readable($resized_filename)) {[/code]
И внутри этого условия:
Получаем mine тип файла.
[code]$mimeType = image_type_to_mime_type(exif_imagetype($resized_filename));[/code]
И дальше 2 раза сравниваем, а не png или jpeg ли у нас файлик часом.
[code]if ($mimeType == ' image/png') {
if ($mimeType == 'image/jpeg') {[/code]
Сразу вопрос - почему у вас перед image/png 3 пробела?
Если совпадает с png или jpeg, то внутри соответствующего условия оно во-первых шлет заголовок header('Content-type: ' . $mimeType), а дальше прогоняет через optipng или jpegoptim.
Ладно, но зачем потом еще раз шлется заголовок header('Content-type: image') ?
И, [b]жесть[/b], еще раз print file_get_contents($resized_filename)
Это и вызывает предупреждение в логах из-за двойного заголовка. И главное - само содержание фотки передается в двух экземплярах друг за другом.
Браузеры конечно достаточно разумные чтоб показать правильно, но это же бред...
короче правильней так:
[code]if(is_readable($resized_filename)) {
$mimeType = image_type_to_mime_type(exif_imagetype($resized_filename));
header('Content-type: ' . $mimeType);
if ($mimeType == 'image/png') {
$output = shell_exec("optipng -o7 -strip all ".escapeshellarg($resized_filename));
}
elseif ($mimeType == 'image/jpeg') {
$output = shell_exec("jpegoptim --max=75 --strip-all --preserve --totals ".escapeshellarg($resized_filename));
}
print file_get_contents($resized_filename);
}
[/code]
Обращаю внимание что остальную часть resize.php не трогаем.
Правим только то, что начинается с if(is_readable($resized_filename)) {
И обращаю внимание на:
shell_exec("optipng...
shell_exec("jpegoptim...
Если в логах будет ошибка что мол нет такого, то просим хостера поставить.
Ну или в крайнем случае все же пробуем закинуть свои бинарники и указываем тут полный правильный путь к ним.