Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » Размер переменной в PHP
или сложности с картинками для imagecreatefromjpeg

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

ASLsh

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите пожалуйста,
как можно, при работе скрипта PHP, узнать размер какой либо переменной. Не массива а именно переменной, т.е. сколько она занимает в байтах на данный момент.
 
 
Вообще этот вопрос возник вот из такого вот положения дел:
 
Есть форма, она передает параметры скрипту PHP, который загружает на сервер картинки (JPEG). Для этого используется следующий код:
 
----------------------------

Код:
while($HTTP_POST_FILES['file_photo']['name'][$i] !== ""){
    $name_photos[$i] = "w_".$pic_date."_".$i.".".substr($HTTP_POST_FILES['file_photo']['name'][$i],-3);
    move_uploaded_file($HTTP_POST_FILES['file_photo']['tmp_name'][$i], $uploaddir.$name_photos[$i]);
$i++;
}

---------------------------
 
при этом все проходит нормально, т.е. картинки успешно загружаются, но далее, по ходу скрипта, на основе одной из картинок должно создаваться превью фото, для чего использую следующий код:
 
---------------------------------------------------
 
Код:
   $FFL = $uploaddir.$name_photos[0];        // имя-путь исходно файла
    $FPFL = $uploaddir."pr_".$name_photos[0];     // имя-путь файла для "превьюшки"
    // Вызов функции полученя информации о изображении    
    if ($size === false) die ('Файл для создания превью отсутствует!');        
    // Читаем в память JPEG-файл с помощью функции imagecreatefromjpeg:
    $source = imagecreatefromjpeg($FFL) or die('Cannot load original JPEG');
    $NEWX = 80;// ширина "превьюшки"
    $NEWY = 60;// высота "превьюшки"
    // Создаем новое изображение
    $target = imagecreatetruecolor($NEWX, $NEWY);
    // Копируем существующее изображение в новое с изменением размера:
    $size0 = 640;
    $size1 = 480;
    imagecopyresampled(
        $target,  // Идентификатор нового изображения
        $source,  // Идентификатор исходного изображения
        0,0,      // Координаты (x,y) верхнего левого угла в новом изображении
        0,0,      // Координаты (x,y) верхнего левого угла копируемого блока существующего изображения
        $NEWX,     // Новая ширина копируемого блока
        $NEWY,     // Новая высота копируемого блока
        $size0, // Ширина исходного копируемого блока
        $size1  // Высота исходного копируемого блока
    );
    imagejpeg($target, $FPFL, 100);
    imagedestroy($target);
    imagedestroy($source);

-------------------------------------------------------
 
и вот тут, когда читаем в память JPEG-файл,  возникает сложность (в которой мне и надо разобраться) для картинок с размером более ~ 390 kb при вызове функции:
                $source = imagecreatefromjpeg($FFL) or die('Cannot load original JPEG'); //(см. в коде выше. 6 строка)
 
скрипт "вылетает" с ошибкой:
 
Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 2560 bytes) in /скрипт.php on line 70
 
При этои размер лимита памяти - 16М
А прям перед этой строкой (используя memory_get_usage) вывожу размер занимаемой скриптом памяти:
 
                памяти занято: 71880
 
Я не могу понять, почему не хватает памяти... Как определить, сколько надо этой функции при наличии картинок того или иного размера. Как вообще можно решить это?
 
Не хочтелось бы просить хостера повышать лимит, если есть иные решения по оптимизации данной процедуры.
 
Заранее благодаоен за любые подсказки и ссылки по существу вопроса.
Спасибо.
 

Всего записей: 97 | Зарегистр. 26-09-2003 | Отправлено: 07:44 06-04-2007 | Исправлено: Cheery, 20:35 06-04-2007
Jokerjar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
занимает в байтах на данный момент

Базовые типы данных имеют фиксированный размер и не измениются динамически. Определить размер - ф-ия sizeof().

Всего записей: 591 | Зарегистр. 22-03-2006 | Отправлено: 08:23 06-04-2007
ASLsh

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Определить размер - ф-ия sizeof().  

 
к примеру
$source = imagecreatefromjpeg($FFL) or die('Cannot load original JPEG');
echo sizeof($source);
 
выдает: 1
 
я наверно не совсем точно выразился. Мне надо было знать, сколько занимает ресурсов значение переменной в памяти.  
 
К примеру при считывании файла размером 292 kb до считывания скрипт занимает:
 
72784 байта а сразу после вызова функции imagecreatefromjpeg уже 10897632 байт, и это при том, что файл всего 292 kb!
 
что ж там такое считывается ? почему так сильно возрастает "расход" памяти скриптом?

Всего записей: 97 | Зарегистр. 26-09-2003 | Отправлено: 08:50 06-04-2007
Church



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
http://it.php.net/manual/en/function.memory-get-usage.php - не оно?

Всего записей: 1199 | Зарегистр. 05-09-2003 | Отправлено: 15:28 06-04-2007
dacuan

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASLsh
Дело в том, что 390 kb -- это размер сжатого файла и его размер в оперативной памяти будет значительно больше. Использование sizeof() здесь не поможет, эта функция подсчитывает количество элементов массива или количество свойств объекта, но не возвращает объем занимаемой ими памяти.
 
Приблизительно оценить размер распакованной картинки можно, сконвертировав ее в 24-битный BMP. Размер полученного файла будет примерно равняться объему памяти, занимаемой картинкой.

Всего записей: 545 | Зарегистр. 23-10-2003 | Отправлено: 19:10 06-04-2007
Delphi6



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dacuan
Может вы скажете зачем вам это нужно и мы сможем найти обходное решение, как мне кажется у РНР нет такой возможности, даже за памяти переменных следит сам движок РНР, сколько я не пытался самолично подтирать за своими действиями переменные и ими используемую память присваивав им nil результаты были мизерными и не оправдывали сложность кода.

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 19:27 06-04-2007
Kokoc

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Delphi6
Тогда уж надо было через unset удалять.

Всего записей: 793 | Зарегистр. 06-06-2002 | Отправлено: 14:08 07-04-2007
ASLsh

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
dacuan


Цитата:
Может вы скажете зачем вам это нужно и мы сможем найти обходное решение

Вообще задача состоит в том, чтобы закачивать картинки на сервер, при этом есть два НО.
1. Картинки посылаются программой (некая бд в офлайн режиме... затем сброс данных на сервер) в кодировке base64 (от этого никуда не деться), и потому, когда мне надо сохранить картинку иначе как пользуясь функциями библиотеки GD2, я не имею иного варианта (может есть какой?)
2. Помимо этого, для некоторых картинок мне необходимо делать превью-фото, т.е. опять же через ф-ции GD2
 

Цитата:
Delphi6  
Тогда уж надо было через unset удалять.

 
дело в том, что мне и удалять то еще нечего, - затыкается на первой же большой картинке. Т.е. как всё происходит:
Программа шлет объявление (у каждого есть картинка), - скрипт принимает первое (одно!), работает с ним, всё за собой убирает, запускается поновой для приема следующего объявления, и.т.д. Те, объявления, что не "влезают" в рамки, попросту не заносятся в БД... остальные успешно проходят, т.е. картинки в папку на сервер записываются а данные и линки к картинкам в БД.
 
Вся проблема в том и состоит, - как сохранить такие картинки
 
Покапавшись еще по инету, выяснил что (как верно указал dacuan) в случае работы с картинками в PHP (и похоже не только в нём) для создания изображения память используется как для BMP формата, т.е. не важно что на входе, - gif, jpg, png,... всё равно память выделяется как под BMP... Как решить - я не знаю... пока не знаю... может кто как-то решал уже?
 
Church , Ваша ссылка и то и не совсем то , но вообщем то с ее помощью я кое-что выяснил работая с небольшими по "весу" картинками - они резко становятся как BMP по "массе"... а так, с большими, у меня скрипт вылетает не давая вывести размер занимаемой памяти, потому как ему её попросту резко(!) становится нехватать...
 
 

Всего записей: 97 | Зарегистр. 26-09-2003 | Отправлено: 08:41 09-04-2007
Kokoc

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Еще чайниковские два варианта:
1) Попробовать ImageMagick (хотя лучше не надо).
2) Отойти от on-line варианта, а по cron запускать тот же скрипт php  и обрабатывать картинки/файлы, сохраненные на HDD, в офф-лайне. Основной он-лайн скрипт будет занят только сохранением файлов картинок на HDD. Конечно, есть недостаток - не будет быстрого отклика о результате обработки.  
3) Еще можно "подвигать" параметры в php.ini - как то execution_time, memory_limit и пр.

Всего записей: 793 | Зарегистр. 06-06-2002 | Отправлено: 15:34 09-04-2007
dacuan

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASLsh

Цитата:
1. Картинки посылаются программой (некая бд в офлайн режиме... затем сброс данных на сервер) в кодировке base64 (от этого никуда не деться), и потому, когда мне надо сохранить картинку иначе как пользуясь функциями библиотеки GD2, я не имею иного варианта (может есть какой?)

Зачем здесь использовать функции GD2? Почему нельзя сохранять картинки в том же формате, в котором они пришли?
 

Цитата:
2. Помимо этого, для некоторых картинок мне необходимо делать превью-фото, т.е. опять же через ф-ции GD2

 
Как сказал Kokoc

Цитата:
1) Попробовать ImageMagick.

У меня велеколепно создаются картинки для изображений размерами до 2000х2000. Больших размеров еще не было нужды делать

Всего записей: 545 | Зарегистр. 23-10-2003 | Отправлено: 11:27 10-04-2007
ASLsh

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Попробовать ImageMagick

- т.е. это должно быть установлено на хосте?
 

Цитата:
Отойти от on-line варианта

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

Цитата:
 Еще можно "подвигать" параметры в php.ini - как то execution_time, memory_limit и пр.

- можно конечно повысить лимит памяти под скрипт (что и сделали по моей обоснованной просьбе и подняли до 16М, - оказалось иногда мало), но хостер тоже слишком высоко поднимать не станет... покрайней мере за "спасибо" (да и смысл переплачивать, когда из 20 картинок 1 - 2 непроходят, но! все нужны)
 

Цитата:
Зачем здесь использовать функции GD2? Почему нельзя сохранять картинки в том же формате, в котором они пришли?

- в таком случае встречный вопрос, - "как мне сохранить картинку после конвертации ее из
Цитата:
base64
средствами PHP?" (а приходит именно так и никак иначе, и изменить нельзя, только base64)
 

Цитата:
Как сказал Kokoc

- это про ImageMagick?
 

Цитата:
У меня велеколепно создаются картинки для изображений размерами до 2000х2000

- 2000Х2000... = 4000000... У меня есть варианты по 640Х11200=7168000, но дело не в этом. Вы пишете, что у Вас создаются... а точнее, это где? на локальном сервере? и Вы собирая PHP дерективу, задействующую ограничение по лимиту памяти, указывали? Как правило, в пакетах PHP под win такая деректива не указана при сборке, и лимит памяти неограничен, винда сама выделяет столько, сколько скрипт запросит (ну или это делает апач, но всеже с разрешения винды)... Мой случай связан со сторонним хостом, где я не хозяин и просить "повышения лимита" могу только в пределах некого иного лимита

Всего записей: 97 | Зарегистр. 26-09-2003 | Отправлено: 11:51 10-04-2007
dacuan

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASLsh

Цитата:
- т.е. это должно быть установлено на хосте?

да, но он обычно стоит. чтобы проверить выполните в консоли команду

Код:
which convert


Цитата:
- в таком случае встречный вопрос, - "как мне сохранить картинку после конвертации ее из

Подозреваю, что в base64 передается не BMP, а уже сжатая картинка. Поэтому будет достаточно сделать полученным данным base64_decode и результат сохранить в файл "test1.jpg". (В случае использования GIF, PNG или другого формата придется поменять расширение).

Цитата:
Вы пишете, что у Вас создаются... а точнее, это где? на локальном сервере?

На обоих

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

Прелесть ImageMagick в том, что это _внешняя_ утилита и на нее не распростаняются ограничения памяти, прописанные в php.ini. Для использования этого пакета достаточно, чтобы было разрешено использование функции exec или system. Вы можете скачать ImageMagick с оффсайта и поэкспериментироватьна локали с включенным ограничением памяти.
 
 

Всего записей: 545 | Зарегистр. 23-10-2003 | Отправлено: 13:05 10-04-2007 | Исправлено: dacuan, 13:09 10-04-2007
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Интернет » Web-программирование » Размер переменной в PHP


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.Board
© Ru.B0ard 2000-2026

LiteCoin: LgY72v35StJhV2xbt8CpxbQ9gFY6jwZ67r

Рейтинг.ru

Рейтинг.ru