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

logo

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

Рекомендуемый контент

Комментарии   

Иван Шаман
0 #2 Иван Шаман 24.12.2012 14:39
Главное, что печально то, что большая часть хостинг провайдеров то не в курсе дела то! Как нам по этому поводу отвечали на yutex.ru, мол:
Цитата:
но что странно только Вы об этой пробелме пишите...
наш ответ:
Цитата:
ну а мы её так сказать из нутри знаем потому и пишем про реальную проблему, а не про мифический ДДОС при 2-15 посетителях в сутки!:)
опять таки уболтали обновить до РНР 5.4 но, появились проблемы с подключением к БД:
Цитата:
Ошибка соединения: mysqlnd cannot connect to MySQL 4.1+ using the old
insecure authentication. Please use an administration tool to reset your
password with the command SET PASSWORD = PASSWORD('your_existing_password').
This will store a new, and more secure, hash value in mysql.user. If this
user is used in other scripts executed by PHP 5.2 or earlier you might need
to remove the old-passwords flag from your my.cnf file
SQL Запрос частично решает проблему (нужно войти, в phpMyAdmin, под именем того пользователя, пароль которого меняем):
Цитата:
SET SESSION old_passwords=FALSE;
SET PASSWORD = PASSWORD('youpass');
Но в цпанели управления пользователями БД, нельзя будет сменить пароль для
пользователя, получим
:
Цитата:
Базы данных MySQL
Old password does not match.
Грабли, независимо от версии MySQL, в том что cPanel создает пароли в старой системе хеширования независимо от используемой версии MySQL!!!

PHP 5.4 реально пониженно употребляет ресурсы! Почти в два раза!!!
Цитировать
Олег Головский
0 #1 Олег Головский 22.12.2012 16:35
8) Да как оказалось и Joomla этой "траблой" страдала, да только ж не на нашем серванте, на котором стоит РНР 5.3, а не РНР 5.2! А хостеры они создания ленивые и обновлятся особо то и не торопятся, что иногда и правильно но не в случае с РНР 5.2 до РНР 5.3 или ещё лучше 5.4!

Кто сомневается, тому предлагается лично испытать одинаковую конфигурацию Joomla или Wordpress сначала на РНР 5.2, замерять показатели расхода памяти, а потом на РНР 5.4 и сравнить х.й с пальцем или наоборот :lol:
Цитировать

Добавить комментарий

АХТУНГ! Все комменты модерасятся модерастом. Мессаги исключительно рекламного или оскорбительного содержания не публикуются, а поэтому злостным спамерам, пранкерам и прочей сетевой нечисти рекомендуем напрасно не тратить своего времени и удовлетворять свои больные фантазии на специализированных Интернет ресурсах! Разумная же критика, замечания, дополнения и хвалебные оды приветствуются, также допускается легкий флуд или троллинг :)


Защитный код
Обновить

Новое на форуме