Ошибка PHP при работе с Textpattern
После недавнего обновления моей любимой CMS Textpattern (версия 4.5.1), на сервере под управлением FreeBSD 8.3-RELEASE в логи работы web-сервера apache22 (версия apache22-2.2.22_8) стали сыпаться ошибки обработки кода PHP (версия php5-5.4.6) вида: PHP Fatal error: Maximum execution time of <число> seconds exceeded in <путь к файлу> : eval()’d code on line <номер строки> . |
Непосредственно в логе apache ошибка имела вид:
[Mon Oct 01 18:27:47 2012] [error] [client **.**.**.**] PHP Fatal error: Maximum execution time of 30 seconds exceeded in /usr/local/www/maxblogs/textpattern/lib/txplib_misc.php(812) : eval()'d code on line 300
А так она отображалась в браузере, если время выполнения операции на стороне web-сервера превышала 30 секунд (это происходило, например, при выводе всех статей моего блога с меткой “жизнь”):
Fatal error: Maximum execution time of 30 seconds exceeded in /usr/local/www/maxblogs/textpattern/lib/txplib_misc.php(812) : eval()'d code on line 300
Ошибка заключается в явном ограничении ресурса времени исполнения php-скриптов, заданном в файле php.ini с помощью директивы max_execution_time секции Resource Limits. Если вы имеете права записи в этот файл, замените значение 30 на большее. В моем случае этот параметр теперь выглядит так:
# nano -w /usr/local/etc/php.ini ... ;;;;;;;;;;;;;;;;;;; ; Resource Limits ; ;;;;;;;;;;;;;;;;;;; ; Maximum execution time of each script, in seconds ; http://php.net/max-execution-time ; Note: This directive is hardcoded to 0 for the CLI SAPI max_execution_time = 60 ...
После внесенных изменений не забудьте перезапустить apache:
# /usr/local/etc/rc.d/apache22 restart
Если же у вас нет прав для изменения php.ini, попробуйте внести изменения в файл .htaccess вашего web-сервера. Добавьте в него строчку:
# nano -w /usr/local/www/site/.htaccess ... php_value max_execution_time 60 ...
Правда на некоторых хостингах эта директива может быть запрещена для изменения. Придется вам договариваться с администраторами через службу поддержки.
Конечно, бесконечно увеличивать порог времени исполнения php-скриптов не имеет смысла. В идеале надо пересмотреть, на каком железе крутится ваш web-сервер, или же изучать сами коды для выяснения, почему время их исполнения так велико.
В дополнение к указанной директиве max_execution_time файла php.ini рекомендуют увеличить размер используемой оперативной памяти для самого PHP. Это можно сделать директивой memory_limit той же секции Resource Limits. В моем случае она выглядит так:
# nano -w /usr/local/etc/php.ini ... ;;;;;;;;;;;;;;;;;;; ; Resource Limits ; ;;;;;;;;;;;;;;;;;;; ; Maximum amount of memory a script may consume (128MB) ; http://php.net/memory-limit memory_limit = 524M ...
Более подробно почитать про эти директивы вы можете по ссылкам:
Напоследок скажу, что в моем случае проблем с нехваткой аппаратных ресурсов не наблюдается, и я мог смело увеличивать значения данных директив. После проделанных изменений ошибки пропали.