Привет, гуру! )
Кто подскажет, как PHP обрабатывает ресурсы? Например, объект уничтожается ровно в тот момент, когда "пройдена" по ходу выполнения кода последняя ссылка на него. Если правильно понимаю, если программист закончил с ним работать по тексту, то выполняется __destruct и экземпляр разрушается.
Теперь о главном. Создаем ресурс GD, с помощью функции $img=imagecreatetruecolor(100,100), к примеру. Теперь $img содержит ссылку на ресурс. Мы с ним работаем, радуемся - всё отлично. Далее, мы берем и пишем еще раз $img = imagecreatetruecolor(200,200). С этого момента в $img лежит ссылка на совершенно другой ресурс. Что произошло с первым?
По идее, мы должны выполнять imagedestroy для уничтожения каждого ресурса GD для освобождения памяти. Но обнаружил у себя в библиотеке баг, когда за прогонку скрипта теоретически должно появиться огромное количество "брошеных" ресурсов. Ну у меня другое, imagecreatefromjpeg, но полагаю никакой разницы нет. Ресурс он и есть ресурс.
То есть они получается уничтожаются примерно таким же образом, как и объекты. Иначе объяснить отсутствие проблем с моментально переполняемой под скрипт памятью я не могу.
Вопрос! А нафига imagedestroy()? ))) Его все же надо использовать или забить со спокойной душой?
В PHP есть чистильщик.
Он очищает память по окончании работы скрипта, а не когда
Цитата (Ron @ 27.10.2015 - 06:43) |
программист закончил с ним работать по тексту |
По этому память нужно чистить ручками, коли он её много жрет. Для того и imagedestroy()
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.
Цитата (twin @ 27.10.2015 - 10:50) |
Он очищает память по окончании работы скрипта, а не когда |
Ок, почему 80 000 брошенных ресурсов (столько фоток я обработал скриптом) не привели к полному исчерпанию регламентированной памяти уже на 5-й картинке?
Этот вопрос у меня возник в связи с появлением-таки ошибки по исчерпанию памяти. Причем первый раз за все время пользования библиотекой. И что самое классное, при второй прогонке того же самого скрипта, никакой ошибки не появилось.
Тут я и обнаружил место появления брошенных ресурсов.
О как! А я на эту инфу чего-то не наткнулся. Спасибо!
sergeiss
27.10.2015 - 22:55
Цитата (Ron @ 27.10.2015 - 10:43) |
Но обнаружил у себя в библиотеке баг, когда за прогонку скрипта теоретически должно появиться огромное количество "брошеных" ресурсов. |
Ты можешь объяснить, зачем ты их создаешь и не используешь? У меня есть подозрение, что тебе нужно начать с оптимизации скрипта
И в любом случае, если ты создаешь некий объект, который на некотором этапе становится ненужным, а он занимает некоторое место, то лучше его удалить. Я имею ввиду в первую очередь не простые переменные, а что-то более объемное.
Когда делал демона на ПХП, то очень плотно пообщался с этой проблемой. Пришлось удалять в конце каждого цикла практически все переменные. Иначе очень быстро скрипт падал из-за переполнения памяти.
_____________
*
Хэлп по PHP*
Описалово по JavaScript *
Хэлп и СУБД для PostgreSQL*
Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. *
"накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
Цитата (sergeiss @ 27.10.2015 - 22:55) |
Ты можешь объяснить, зачем ты их создаешь и не используешь? У меня есть подозрение, что тебе нужно начать с оптимизации скрипта |
Я использую. Но потом получается так, что ресурс остается без указателя. По всей вероятности уничтожается автоматически.
Кстати, а вот и пруф. Прямо в доке про ресурсы об этом и напсано оказывается.
http://php.net/manual/ru/language.types.resource.php