Ошибка превышения лимита памяти PHP на “наследственном” сайте WordPress, но я значительно ниже лимита памяти

Вопрос или проблема

Я работаю с этим устаревшим сайтом на WordPress и просто пытаюсь обновить форматирование на странице, созданной с помощью конструктора, с которым я не знаком.

Я называю этот сайт “устаревшим”, потому что на нем работает какая-то древняя, устаревшая версия 4 плагина “WP Bakery / Visual Composer”, которую следовало бы обновить до версии 7. Но кто-то не хочет платить 75 долларов за безопасный сайт. На сколько я знаю, ошибки отладки возникают из-за дряхлого старого PHP-кода, который был объявлен устаревшим и близок к “вымиранию”.

Поэтому я временно пишу PHP-страницу под другим URL для тестирования на Hostinger; я скопировал файлы сайта и базу данных и развернул сайт там.

Проблема:

Я столкнулся с ограничением памяти на этом сайте, но мои проверки использования памяти показывают, что используется только 9-13 МБ, а активный лимит памяти на сайте составляет 512 МБ.

Вопрос:

Что простое в PHP (или в компьютерной среде) я, надеюсь, не понимаю здесь?

Я ведь читаю правильно? Это байты против мегабайт в выводе на связанной ниже картинке? Я сравниваю одно и то же?

Например, я вижу 12604480 байт в выводе, это 12.6 МБ, верно? По сравнению с 512 МБ, я не вижу, как это может быть проблемой.

И если это бесконечный цикл, я этого не вижу.

Спасибо за любую помощь.

Полный скрипт по ссылке на pastebin

Детали:

У меня это в начале, после вызова get_header():
echo 'Ограничение памяти: ' . ini_get('memory_limit');

У меня есть такой код, размещенный по всему сценарию:

echo("Это использование памяти в цикле ввода");
echo("Используемая память: " . memory_get_usage() . " байт");
wp_reset_postdata();
echo("Это использование памяти после сброса данных поста в цикле");
echo("Используемая память: " . memory_get_usage() . " байт");

Вы можете видеть из этих скриншотов, что я не использую более 12 с лишним МБ, пока мой код продолжает выводить использование памяти на протяжении всего процесса.

Картинка, показывающая текущее ограничение памяти и моё использование

Картинка, показывающая большее использование памяти, пока он не прекращает вывод

Вот проблемный участок кода, когда я вырезаю этот участок и просто вывожу “привет”, все работает нормально:

$args = [
    'post_type' => 'attorney',
    'posts_per_page' => -1, // Получить все записи консультантов, около 30 текстовых записей
];

$advisor_query = new WP_Query($args);

while ($advisor_query->have_posts()):

    // $advisor_query->the_post();
    // получить обозначение, чтобы можно было привести к нижнему регистру
    $designation = get_post_meta(get_the_id(), 'attorney_designation', true);
    $designation_lower = strtolower(get_post_meta(get_the_id(), 'attorney_designation', true));

    // Получить необходимые поля из поста адвоката/консультанта
    $advisor_record = [
        "advisor_name" => get_the_title(),
        "designation" => $designation,
        "designation_lower" => $designation_lower,
        "advisor_description" => get_the_content(),
        "advisor_image_link" => get_post_meta(get_the_id(), 'attorney_detailed_page_image', true),
    ];

    // Классифицировать сотрудников на основе обозначения
    if (str_contains($designation_lower, 'shareholder')) {
        $employees['shareholders'][] = $advisor_record;
    } elseif (str_contains($designation_lower, 'cpa') || str_contains($designation_lower, 'accountant') || str_contains($designation_lower, 'tax advisor')) {
        $employees['cpas'][] = $advisor_record;
    } else {
        $employees['admin'][] = $advisor_record;
    }

    wp_reset_postdata(); // только тестирую это, без этого сломается
                         // пытался выгрузить пост из памяти, как только обработаю его
                         // и перейду к следующему

endwhile;

Вы можете видеть, что, когда я читаю записи, оно просто останавливается. Записей около 30, так что я думаю, что оно доходит до последней.

Я постараюсь создать лучший минимальный пример здесь с утра.

Я просто думал, что это может быть очевидная проблема с окружением PHP, о которой я не знаю. У меня довольно хороший опыт в программировании, но не в индустрии, так что, вероятно, я делаю очень глупую ошибку.

Для сведения, у меня всего около 30 записей, это записи сотрудников, около 10 текстовых полей, одно из которых – ссылка. Я предполагаю, что я только работаю со ссылкой, а не храню изображения в памяти. Если бы это было так, это могло бы быть проблемой.

Спасибо за любые отзывы по моему коду PHP, я, конечно, программист на Python и других языках, но не фронтенд-разработчик.


Я провел это исследование и многое другое:

Привет, смотрел на: Ошибка недостатка памяти в PHP, хотя лимит памяти не достигнут — я тестирую этот сайт разработки на общем хостинге (не локально, длинная история). Я не думаю, что могу контролировать лимит памяти Apache2, но сомневаюсь, что это было бы проблемой. Я пытаюсь загрузить всего около 30 записей.

Также: https://stackoverflow.com/a/55566634/3255525 — пытался увеличить память wp в wp-config.php до 512m, безуспешно.

И: Фатальная ошибка: недостаток памяти, но у меня достаточно памяти (PHP) — что в значительной степени требует доступа к настройкам Apache для исправления, но я на общем хостинге Hostinger для тестирования/разработки этого сайта.

И: https://stackoverflow.com/a/46652352/3255525 — вопрос несколько запутанный, а ответ, кажется, пытается устранить проблему, а не исправить ее. Я, возможно, еще раз это рассмотрю, я подумаю об этом.

Ответ или решение

Конечно! Проблема, с которой вы столкнулись, может быть связана с несколькими факторами, даже если вы наблюдаете, что использование памяти в вашем коде намного ниже установленного лимита. Давайте рассмотрим основные аспекты, которые могут помочь вам решить эту проблему.

1. Проверка памяти кода и окружения

Несмотря на то, что ваше текущее использование памяти достаточно низкое, может быть несколько причин, по которым вы все равно получаете ошибку превышения лимита памяти:

  • Уровень загрузки памяти для всей PHP-скрипта: Иногда ошибки углубленных плагинов или использования слишком большого объема памяти внутренними библиотеками Symfony (или другими библиотеками) могут вызвать такое поведение.
  • Шаринг ресурсов на хостинге: У вас может быть ограничение на использование ресурсов в вашем хостинге (особенно на сайте с ограниченными ресурсами, как Hostinger), что может привести к аварийному завершению скриптов.

2. Подход к выполнению скриптов

Поскольку вы работаете с WP_Query для получения постов, важно оптимизировать запросы для снижения уровня использования памяти.

  • Убедитесь, что wp_reset_postdata() действительно работает: Эта функция освобождает память, занимаемую объектами постов. Убедитесь, что она вызывается корректно после завершения цикла.
  • Использование wp_cache_flush(): Если у вас есть кэширование, можно попытаться очистить его, что может помочь в перераспределении или освобождении памяти, особенно в старой версии WP.

3. Проверка поведения в цикле

Рассмотрите возможность оптимизации вашего цикла:

  • Проверка get_the_content(): Эта функция может использовать много памяти, особенно если ваш контент тяжелый. Если можно, попробуйте использовать get_post() вместо этого, а затем напрямую доступить нужные поля.
  • Исходные байты в строках: Строки могут занимать больше места, чем вы предполагаете. Убедитесь, что вы не перегружаете память, загружая неэффективные данные из базы данных.

4. Логгирование ошибок и отладка

Для более глубокого понимания проблемы используются лог-файлы. Проверьте PHP-ошибки в следующем:

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

Эти настройки позволят вам увидеть подробные сообщения об ошибках, что может помочь в диагностировании проблемы.

5. Увеличение лимита памяти

Если вышеперечисленное не поможет, вы можете попробовать временно увеличить лимит памяти:

define('WP_MEMORY_LIMIT', '1024M'); // Установка лимита памяти на 1024MB

Помните, что это временное решение, и лучше найти основную причину проблемы.

Заключение

В конечном счете, если после выполнения вышеуказанных шагов вы все равно сталкиваетесь с проблемой, вы можете рассмотреть замену устаревших плагинов или использование более актуальной версии Visual Composer, так как это может устранить некоторые внутренние конфликтные моменты. Улучшение на уровне кода и оптимизация запросов БД часто приводит к большему контролю над использованием памяти.

Если у вас возникнут дополнительные вопросы или потребуется помощь, не стесняйтесь обращаться!

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

Капча загружается...