Ошибка в коде php CMS Textpattern
Свой блог я веду на сервере под управлением FreeBSD 7.2-RELEASE, используя web-сервер apache-2.0.63_3, язык php5-5.2.12 и базу данных на mysql-server-5.0.89. В качестве CMS – «Content Management Software» – (программного обеспечения для управления содержимым) использую Textpattern-4.2.0. |
При загрузке с помощью CMS изображения большого разрешения (3000×2400 и более), apache стал писать в лог такие ошибки:
PHP Fatal error: Allowed memory size of xxxxxxxx bytes exhausted at ... (tried to allocate xxxxx bytes)
Причем в итоге картинка в CMS загружается, но нельзя отредактировать ее атрибуты или сделать ее уменьшенное изображение. Поискав в интернете, обнаружил, что это довольно распространенная ошибка. Она возникает из-за нехватки памяти для работы PHP. Дело в настройках файла php.ini, где явным образом указано, сколько оперативной памяти может использовать PHP для своей работы.
Необходимо увеличить значение memory_limit файла /usr/local/etc/php.ini. По-умолчанию значение равно 128 мегабайтам. С оперативкой у меня проблем нет, сервер обслуживает только web-сервер, я увеличил это значение в два раза, до memory_limit = 256M;
Если же вы пользуетесь услугами хостера, то имеет смысл в таком случае обратиться к нему за технической помощью, либо попробовать самим увеличить размер выделяемой памяти для PHP в файле .htaccess своего сайта, внеся туда такую строчку (например): php_value memory_limit 256M.
Но как оказалось, мне это все не помогло. Ошибки продолжали сыпаться в лог и CMS правильно не обрабатывала изображения большого разрешения. Вроде все работает, но как-то через не то место! :) В логе так же был указан файл на языке PHP, при выполнении которого эта ошибка возникала. Я полез в его код и обнаружил следующее:
# less /path to web-server/textpattern/lib/class.thumb.php | grep memory // make sure we have enough memory if the image is large ini_set('memory_limit', EXTRA_MEMORY);
Подставив вместо EXTRA_MEMORY непосредственно значение 128М, т.е.
ini_set('memory_limit', '128M');
ошибки пропали и textpattern заработал правильно.