Wordpress пожерает память PHP: Fatal error: Allowed memory size of 52428800 bytes exhausted

archive view archive save

Wordpress пожерает память PHP: Fatal error: Allowed memory size of 52428800 bytes exhausted Попросили нас на днях перетянуть сайт с 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 МБ моска? Страх же как интересно!:) Делаем распечатку внутренностей:

и фигеем с вывода в браузер 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


Комментарии в блоге
Новое на форуме