Как разрушить сайт на Wordress с помощью Git или Fatal error: Allowed memory size of XXX bytes exhausted
В данной статье вы узнаете, как одним движением по забывчивости можно разрушить сайт на Wordress с помощью Git.
Постановка проблемы.
В одном из проектов 2 разработчика – я и ведущий. CMS WordPress. Код ведется в git, причем в git’е лежат все папки с кодом wordpress, а я разрабатываю в локальной копии.
В один прекрасный день ведущий разработчик обновил плагины. Какие-то удалил и добавил новые, помимо обновления версий плагинов. Я сделал git pull и, ничего не подозревая, открыл локальный сайт в браузере. Сайт выдал фатальную ошибку Fatal error: Allowed memory size of XXX bytes exhausted и перестал запускаться.
Особо причина ошибки была не ясна по логам php и логу WordPress – debug.log, а на почту пришло письмо:
—
Howdy!
Since WordPress 5.2 there is a built-in feature that detects when a plugin or theme causes a fatal error on your site, and notifies you with this automated email.
In this case, WordPress caught an error with one of your plugins, Admin Menu Editor.
First, visit your website (https://site.pros/) and check for any visible issues. Next, visit the page where the error was caught (https://site.pros/wp-admin/) and check for any visible issues.
Please contact your host for assistance with investigating this issue further.
If your site appears broken and you can’t access your dashboard normally, WordPress now has a special «recovery mode». This lets you safely login to your dashboard and investigate further.
To keep your site safe, this link will expire in 1 day. Don’t worry about that, though: a new link will be emailed to you if the error occurs again after it expires.
When seeking help with this issue, you may be asked for some of the following information:
WordPress version 5.8.1
Current theme: Engine (version 1.8.8)
Current plugin: Admin Menu Editor (version 1.10)
PHP version 7.1.33
Error Details
=============
An error of type E_COMPILE_ERROR was caused in line 16 of the file C:\OServer\domains\site.pros\wp-content\plugins\admin-menu-editor\includes\basic-dependencies.php. Error message: require_once(): Failed opening required ‘C:\OServer\domains\site.pros\wp-content\plugins\admin-menu-editor\includes/shortcodes.php’ (include_path=’.’)
—
Из чего было понятно, что проблема в плагине, у которого потерялся один из файлов.
Ведущий разработчик сознался, что обновил плагины, но забыл закоммитить и запушить и изменения в git.
После того, как я «подсосал» изменения из гита, я снова вбил адрес сайта и получил ошибку «Fatal error: Allowed memory size of 4341234123 bytes exhausted»
Причем, я поиграл с флагом php_flag memory_limit в файле .htaccess. И заметил странность. Сколько бы я не поставил гигабайт в memory_limit, столько же примерно требовалось php в ошибке Fatal error Allowed memory size exhausted.
Я попробовал провести отладку кода через XDebug файла в корне сайта – index.php. Но, толком она ничего не дала, кроме как, что перестало хватать памяти при загрузке данных в память из таблицы wp_options. После чего выдавалась Fatal error.
Поняв, что дебаг ничего не даст, я решил копать дальше.
Поскольку у меня был бекап файлов в git и бекап базы на диске, я решил восстановить для начала работу, хотя бы админки /wp-admin.
Я решил сначала отключить все плагины, посмотреть – заработает ли сайт, а потом и тему. Я переименовал папку /wp-content/plugins в plugins0. Эффекта это не дало. Затем я переименовал папку /wp-content/themes в themes0.
Весь сайт все еще лежал. Но изменения появились. Теперь fatal error писал о необходимости 400 гигов в пересчете из байт.
Закомментировав модификации файла wp-config.php дистрибутива WP, сделанные в проекте для удобства ведущим разработчиком, я снова ничего нового не увидел – сайт лежал с той же ошибкой.
Я сделал unstage паки /wp-content/ — отменил сделанные изменения и начал размышлять. А ведь еще день назад сайт прекрасно работал. И ему хватало памяти. 1,5 гига хватало с лихвой, судя по ограничениям памяти в файле .htaccess. Последовательно переходя командой git checkout на предыдущие коммиты, я нашел коммит в истории, в котором мой сайт все еще работал.
Я удалил папку /wp-content полностью и снова вернулся на последний коммит в git. И, та-дам. Сайт заработал.
У меня возникло 3 гипотезы – 1) после частичного обновления плагина WP произошло кэширование настроек в таблицах базы данных WordPress.
2) после того, как код был восстановлен, не произошло очищение кэша в БД. И по всей видимости, WordPress, все еще не видел изменений.
3) возможно, заглючила программа Fork и git и какие-то файлы не обновились с приходом нового коммита. Хотя, этот вариант маловероятен. Вероятность не более 1% из 100.
Резюме.
В обычной практике ошибка «Fatal error: Allowed memory size of XXX bytes exhausted» говорит, мол, подкинь памяти для php процесса. И очень часто, если не хватает до 2-3 gb, проблема легко решается. А вот если не хватает от 10 гигов и выше, то тут явно какая-то катастрофа случилась и надо думать, где и как отыскать проблемное место.
В данном случае плагины и тема напрямую не влияли на вызов ошибки – они были переименованы, а ошибка не пропала. И хотя бы, просто должно было загружаться ядро. Этот факт можно было проверить, просто открыв админку WordPress.
Ну что, мой друг, надеюсь, что-то полезное ты узнал из моей статьи. Напиши в комментариях, что думаешь и поставь оценку. Это будет мотивацией писать еще больше, лучше и интереснее.