Вопрос или проблема
Я работаю с этим устаревшим сайтом на 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, так как это может устранить некоторые внутренние конфликтные моменты. Улучшение на уровне кода и оптимизация запросов БД часто приводит к большему контролю над использованием памяти.
Если у вас возникнут дополнительные вопросы или потребуется помощь, не стесняйтесь обращаться!