Попросили нас на днях перетянуть сайт с joomla на wordpress в силу того, что joomla вместе с файлами плагинов и т.д. состояла из 14-16 тыс. файлов, а это превышало лимит инодов на шаровом хостинге в 10 тыс.
Перетянули:) Филов стало меньше, 5-6 тыс. (wp + wiki + phpbb), появилась возможность добавлять изображения и т.д. до 10 тыс. - НО... Встала раком другая проблема. При попытке входа в /wp-admin/ постоянно выскакивает: Fatal error: Allowed memory size of 52428800 bytes exhausted (tried to allocate 30720 bytes) in /home/public_html/wp-admin/custom-header.php on line 93
joomla этой проблемой не страдала и спокойно работала на шаровых хостах но превышала лимит по файлам, wordpress содержит меньше файлов но жрёт больше памяти;((
На локальном хосте в /wp-admin/:
- PHP Version : 5.4.5 / 32Bit OS
- Memory limit : 50 MByte
- Memory usage : 8.12 MByte
На реальном шаровом хосте:
- Fatal error: Allowed memory size of 52428800 bytes exhausted (tried to allocate 30720 bytes) in /home/public_html/wp-admin/custom-header.php on line 93
Стою на асхвальте у лыжи абутый чы лыжы не эдуд чы я таво:)....
И НЕ надо тут нам рассказывать про "define('WP_MEMORY_LIMIT', '64M');", "Enable W3 Total Cache" - проблему с входом в /wp-admin/ это НЕ решает!
На реальном шаровом хосте:
- PHP Version 5.2.17
- Server API: Apache 2.0 Handler - т.е. как модуль
Код в начале /wp-admin/index.php:
<?php echo memory_get_usage(); exit;
Показал: 18383040. Т.е. в начале работы скрипта РНР занимал 18 МБ, выходит wp-admin выжырает более 32 МБ но..., опять же - на локальном хосте wp-admin показывал расход памяти в 8-10 МБ! Парадокс?
Что же там уже в самом начале работы скрипта отжерает 18 МБ моска? Страх же как интересно!:) Делаем распечатку внутренностей:
<?php print_r(get_defined_vars()); echo memory_get_usage(); exit;
и фигеем с вывода в браузер 17-18 МВ переменной lines:
..... [lines] => Array ( [0] => 1.0.234.64 [1] => 1.0.237.163 [2] => 1.1.1.254 [3] => 1.1.175.69 [4] => 1.1.226.33 [5] => 1.1.229.0 [6] => 1.1.229.124 [7] => 1.1.229.182 ....
В переменную lines запхнут список каких-то хостов, вероятно спамерских хостов. Видно, что на бесплатном хосте в PHP хер знает чего понамучено, которое пожерает большую часть памяти и не даёт нормально работать двигу wordpress.
Нам это явно не нравится и в wp-config.php мы её удаляем unset($lines); и в начале работы скрипта получаем 381432, что уже начинает радовать.
И после входа в /wp-admin/index.php получаем:
- PHP Version : 5.2.17 / 64Bit OS
- Memory limit : 50 MByte
- Memory usage : 38.31 MByte
Проблема частично решена но, еще не совсем. Один шиш расход в 38.31 MByte - это много для wordpress! Дальше больше... Разглядев подробнее вывод print_r(get_defined_vars()); мы обнаружим, что все данные переменных дублируются в массив $GLOBALS!;( Вот отсюда то и двойной расход памяти в PHP!
Неужели register_globals = on? Смотрим phpinfo();, нет register_globals = off!;( Наачиная c PHP 5.3.0 register_globals удалена и не используется, а поэтому и нет двойной потери памяти.
Короче говоря проблема оказалась в том, что данные всех переменных дублируются в массив $GLOBALS, как избежать дублирования всех данных в массив $GLOBALS для меня пока загадка... Выглядит это безобразие следующим образом:
Array ( [GLOBALS] => Array ( [GLOBALS] => Array *RECURSION* [_ENV] => Array ( ............................. ) [HTTP_ENV_VARS] => Array ( ............................. ) [_POST] => Array ( ) [HTTP_POST_VARS] => Array ( ) [_GET] => Array ( ) [HTTP_GET_VARS] => Array ( ) [_COOKIE] => Array ( ............................. ) [HTTP_COOKIE_VARS] => Array ( ............................. ) [_SERVER] => Array ( ............................. ) [HTTP_SERVER_VARS] => Array ( ............................. ) [_FILES] => Array ( ) [HTTP_POST_FILES] => Array ( ) [_REQUEST] => Array ( ............................. ) ) [_ENV] => Array ( ............................. ) [HTTP_ENV_VARS] => Array ( ............................. ) [_POST] => Array ( ) [HTTP_POST_VARS] => Array ( ) [_GET] => Array ( ) [HTTP_GET_VARS] => Array ( ) [_COOKIE] => Array ( ............................. ) [HTTP_COOKIE_VARS] => Array ( ............................. ) [_SERVER] => Array ( ............................. ) [HTTP_SERVER_VARS] => Array ( ............................. ) [_FILES] => Array ( ) [HTTP_POST_FILES] => Array ( ) [_REQUEST] => Array ( ............................. ) )
В $GLOBALS дублируется всё - _SERVER, _GET, _POST, _ENV etc... У кого какие мысли на тему как не попасть в массив $GLOBALS на PHP 5.2.17 пишем в каменты. Лично я вижу пока только одно единственно верное решение данной проблемы - это обновление до PHP 5.3.0 или выше...
Дополнительный источник для размышлений: WordPress › Форумы поддержки » Fatal error: Allowed memory size of 52428800 bytes exhausted