память на сервере для ресайза..

mixwell

Новичок
память на сервере для ресайза..

Образовалась следущая проблема: при ресазе фотографии, изображения свыше 400кб не ресайзятся. В браузере отображается так как буд-то искомое изображение отсутствует. Мое мнение: при ресайзе фото загружается в память на сервере. Возможно просто на сервере стоит ограничение для загружаемых в память файлов, что не позволяет произвести ресайз. Возможно ли такое? Фото ниже 400кб ресайзятся отлично...
Заранее благодарю.
 

mixwell

Новичок
Ищу в логах строку с названием фото, но найти не могу. В папочке logs у меня файлы делятся на следущие категории: access.log, ftp.log, mail.log. Достаточно логично что, данная инфа должна быть в файле access.log, но там ее нет. Вообще по-хорошему должен быть лог об ошибках.. но его нет..
 

sage

Новичок
ситуация похожа, поэтому смысла создавать новую тему не вижу. Есть две фотки: 1мб (2448х3264) и 1,7мб(2272х1704). Закачка и ресайз 1,7мб проходит отлично. На 1мб вываливается ошибка:

Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 2448 bytes) in ... on line 87
Понятно, что ему не хватает памяти, почему тогда 1,7 закачивается отлично? Есть предположение, что из-за разных ширинаxвысота. У той, что 1,7 пропорции меньше. Возможно ли такое? Соб-но, способы решения? Кроме покупки планки) Спасибо.
 

mixwell

Новичок
Все сделал, как указано в факе. Сослался на файл ресайза не через img. Вот что логи сказали:

- [03/May/2008:05:15:16 -0400] "GET /inc/imageResize.php?im=3675_fHdG2V.JPG&id=486&width=100&height=100 HTTP/1.1" 200 645 wedinin.com "http://wedinin.com/index.php?part=2&subPart=womans&action=4" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)" "-"


Обратил внимание на следущий момент. Загружено на сервер изображение размером 680 кб(1536X2048). Оно ресайзится до 100X100 отлично. Но при ресайзе 800 X 800 сервер выдает ошибку 500. Лог данных действий приведен ниже. Хоу обратить внимание, что ресайз данной картинки вплость до 600X600 происходит нормально. Выше - error 500.

88.215.146.30 - - [03/May/2008:05:17:38 -0400] "GET /inc/imageResize.php?im=3759_asCXgk.JPG&id=478&width=550&height=550 HTTP/1.1" 200 645 wedinin.com "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)" "-"
88.215.146.30 - - [03/May/2008:05:17:46 -0400] "GET /inc/imageResize.php?im=3759_asCXgk.JPG&id=478&width=520&height=520 HTTP/1.1" 200 22190 wedinin.com "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)" "-"
88.215.146.30 - - [03/May/2008:05:17:50 -0400] "GET /inc/imageResize.php?im=3759_asCXgk.JPG&id=478&width=550&height=550 HTTP/1.1" 200 645 wedinin.com "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)" "-"
 

sage

Новичок
mixwell
к ответу на личное сообщение. Дело в том, что у меня ресайз происходит сразу после загрузки. Для себя тут вижу два выхода:

1) докупить планку оперативки
2) если моё предположение верно о разных ширинаxвысота, то просто пользоват запретить закачивать фотографии больше некоторой пропорции ширинаxвысота
 

vovanium

Новичок
Понятно, что ему не хватает памяти, почему тогда 1,7 закачивается отлично?
Потому что размеры (количество пикселов) картинки меньше, а то что она меньше пожата jpeg'ом для ресайза не важно, т.к. перед рессайзом картинки преобразовываются в "несжатый" вид.
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
mixwell
Если возникают ошибки обычно смотрят НЕ access.log а error.log это раз.
Скажи, пожалуйста, ты ссылку мою читал? Внимательно?

sage
На 1мб вываливается ошибка
у jpg в 1Mb
может быть > 100 Мб.
Удивлен? ;)
 

mixwell

Новичок
значит размер(вес) изображения не имеет ни какого значения. Тогда как обьяснить явление, когда изображение ресайзится до 500*500 нормально, а выше уже ошибка 500?
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
mixwell
Тогда как обьяснить явление
Пожалуйста, хоть раз в жизни, постарайся найти проблему самостоятельно
Выяснить пролемму в столь тяжелом случае тебе поможет вывод ошибок в браузер.
Причина будет написана просто и понятно.
К сожалению на английском языке.
Как включить вывод ошибок написано по ссылке.
Потрудись, пожалуйста, прочитать.

-~{}~ 03.05.08 16:06:

[telepat_mode]
Скорее всего нехватает памяти.
[/telepat_mode]
 

mixwell

Новичок
а такого нет:( к сожалению(я про error.log). Ссылку, внимательно читал. Что касается изображений, так и сделал вызывал скрипт напрямую, не через img.
PHP:
ini_set('display_errors',1);
error_reporting(E_ALL);
результата не дают. Они у меня были.
lдобавление строки
PHP:
php_flag display_errors 1
вызывает ошибку Internal Server Error. В логах причину ошибки посмотреть не могу, так как лога error просто нет.

-~{}~ 03.05.08 17:36:

Все что выходит, это: Error 500 - Internal server error
An internal server error has occured!
Please try again later.
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
[telepat_mode]
php_flag display_errors 1
вызывает ошибку Internal Server Error
Может быть запрещено хостером.
Скорее всего так и есть.
Ну или FastCGI...
[/telepat_mode]

ini_set('display_errors',1);
error_reporting(E_ALL);
Попробуй
echo $asasdaewqsdadasd; //несуществующая переменная
Выведет Нотис - значит ошибки выводятся нормлально.

Тоесть строка в htaccess тебе не нужна.
 

mixwell

Новичок
Да, скорее всего нехватка памяти.
Вижу следущие пути решения:
Сжимать фото посредством ресайза и сохранять вместо старого. Но тут опять процесс ресайза и скорее всего разницы между "сжатием->сохранением" и "сжатием->выводом" нет. Все равно разжимать фото надо в памяти на сервере.

Как поступают в подобном случае? Сталкивался ли кто-то с подобными проблемами?
Отказываться от ресайза - не вариант.

-~{}~ 03.05.08 18:03:

Mr_Max да, работает нормально. выводит нотис с Undefined variable. Но вот про картинки сразу 500 Internal Server Error вываливает.
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Но вот про картинки сразу 500 Internal Server Error вываливает
Пиши в сапорт чтоб включили тебе error.log

Если есть доступ к http.conf -
ErrorLog /path-to-site-logs-dir/error.log

Или смотри error.log-и Апача.
Типа /usr/local/apache/logs/error.log
ну или где там у тебя апач "лежит".
 

vovanium

Новичок
mixwell
ресайзится до 500*500 нормально, а выше уже ошибка 500?
Ты не совсем понимаешь похоже что такое картинка для компьютера, это по сути таблица в которой количество ячеек соотвествует количеству пикселов в картинке, и в каждой ячейке хранится номер цвета (в зависимости от количества цветов может занимать от нескольких бит до 4 байт, а иногда и больше). Соотвественно, чем больше у тебя у пикселов тем больше нужно памяти для картинки.
А при ресайзе тебе по сути нужно в памяти хранить две картинки оригинальную, и вторую уменьшенную, которую ты хочешь сделать.
 

mixwell

Новичок
Я понял. В таком случае как лучше поступить? Заказывать colloation? Если да, то какой обьем оперативки должен быть?
Есть ли альтернативные варианты решения данной проблемы?


p.s. Mr_Max письмо с прошением хостеру отправил. Спасибо.

-~{}~ 03.05.08 20:53:

Эти ребятки выслали скрипт
PHP:
error_reporting(0);
   $old_error_handler = set_error_handler("userErrorHandler");

   function userErrorHandler ($errno, $errmsg, $filename, $linenum,  $vars)
   {
     $time=date("d M Y H:i:s");
     // Get the error type from the error number
     $errortype = array (1    => "Error",
                         2    => "Warning",
                         4    => "Parsing Error",
                         8    => "Notice",
                         16   => "Core Error",
                         32   => "Core Warning",
                         64   => "Compile Error",
                         128  => "Compile Warning",
                         256  => "User Error",
                         512  => "User Warning",
                         1024 => "User Notice");
      $errlevel=$errortype[$errno];

      //Write error to log file (CSV format)
      $errfile=fopen("errors.csv","a");
      fputs($errfile,"\"$time\",\"$filename:
      $linenum\",\"($errlevel) $errmsg\"\r\n");
      fclose($errfile);

      if($errno!=2 && $errno!=8) {
         //Terminate script if fatal error
         die("A fatal error has occurred. Script execution has been aborted");
      }
   }
И сказали, что больше ни чем помоч не могут, так как не обеспечиваю доступ к еррор логам аппача.

-~{}~ 03.05.08 21:14:

Нашел, функцию memory_get_usage (); Как я понял она показывет количесво памяти, выделяемой для работы php-скриптов. У меня она показывает всего 150 кб( Скажите сколько необходимо памяти для оптимальной работы подобных скритов ресайза изображений.

И как обычно поступают: Ресайзят фото и сохраняют уменьшенное изображение или хранят пероисточник и ресайз не сохраняют, а сразу выводят пользователю?
 

dimagolov

Новичок
не совсем понимаю, зачем надо городить кастомный error handler вместо того, чтобы прописать
PHP:
error_reporting(E_ALL);
ini_set('display_errors','off');
ini_set('log_errors','on');
ini_set('error_log','.. path & name of file to write a log ...');
потому что что так, что сяк, фатальные ошибки будут в логе апача (к которому нету доступа), но в то же время их появление будет видно по 500 ошибке.
 

alekciy

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

Не говоря уже о том, что превьюхи сохраненые в ФС можно отдавать как статику фронтендом в духе nginx.
 

mixwell

Новичок
alekciy Спасибо. Но все равно, это не избавляет от проблемы с нехваткой памяти для ресайза. Для того чтобы сохранить уменьшеную копию все равно необходимо произвести ресайз..
Что бы вы посоветовали? И что является основой данной проблемы? слишком малое кол-во памяти, выделенное для php?
Почему другие работают без проблем? Стоит ли в связи с этим переходить на vps или colloation?
 
Сверху