Məzmuna keç
Konfiqurasiya

WordPress-də "Allowed Memory Size Exhausted" xətasını düzəltmək

Saytınızda Fatal error: Allowed memory size of 268435456 bytes exhausted görünürsə, wp-config.php faylında / That's all, stop editing! / sətrindən yuxarı bu sətri əlavə edin.

Nəşr olundu

Saytınızda Fatal error: Allowed memory size of 268435456 bytes exhausted görünürsə, wp-config.php faylında /* That's all, stop editing! */ şərhindən yuxarı bu sətri əlavə edin: define( 'WP_MEMORY_LIMIT', '256M' );. Bu, əksər saytları bir dəqiqədən az müddətdə yenidən işlək vəziyyətə qaytarır. Ancaq getməzdən əvvəl bu səhifənin qalan hissəsini oxuyun, çünki limiti qaldırmaq müalicə deyil, diaqnozdur. Çökmə daha yüksək rəqəmdə yenidən baş verirsə, əsl problem yaddaşı hədsiz istehlak edən koddur və daha böyük tavan sadəcə ona daha çox meydan verir.

Xəta əslində nə deməkdir

PHP hər sorğunun nə qədər yaddaş ayırdığını izləyir. Tək bir sorğu php.ini faylında təyin edilən (və ya WordPress tərəfindən əvəz edilən) memory_limit həddindən artıq yaddaş ayırmağa cəhd etdikdə, PHP sorğunu dərhal fatal xəta ilə dayandırır və çökdüyü bayt sayını çap edir. 268435456 bytes 256M-dir. 134217728 128M-dir. 536870912 512M-dir. “tried to allocate” ifadəsindən sonrakı rəqəm son damlanın ölçüsünü göstərir, problemin ölçüsünü yox.

WordPress öz limitlərini PHP-nin üzərinə əlavə edir. WP_MEMORY_LIMIT (standart 40M, və ya daha yüksəkdirsə PHP limiti) ön hissəni idarə edir. WP_MAX_MEMORY_LIMIT (standart 256M) media kitabxanası və plagin yeniləmələri kimi, real olaraq daha çox yaddaşa ehtiyacı olan admin tərəfindəki əməliyyatları idarə edir. WordPress bu sabitlərə əsasən yükləmə zamanı ini_set('memory_limit', ...) çağırır — ancaq yalnız hostunuz ini_set-ə icazə verirsə və yalnız hostunuzun təyin etdiyi sərt hədd qədər. Məhz bu sonuncu hissəyə görə wp-config.php faylını redaktə etmək bəzən heç bir təsir göstərmir kimi görünür.

Ardıcıllıqla düzəldin

1. WordPress limitini wp-config.php faylında qaldırın. Bu, ilk sınanmalı addımdır, çünki geri qaytarıla biləndir və başqa heç nəyə toxunmur.

define( 'WP_MEMORY_LIMIT', '256M' );
define( 'WP_MAX_MEMORY_LIMIT', '512M' );

Bu sətrlərin hara qoyulacağından əmin deyilsinizsə və ya digər ümumi sabitlərin də eyni zamanda düzgün təyin olunmasını istəyirsinizsə, bizim wp-config generatorumuz yapışdıra biləcəyiniz təmiz bir blok yaradır. Yerləşdirmə vacibdir — “stop editing” sətrindən aşağıdakı hər şey nəzərə alınmır.

2. Bu heç nə etmirsə, hostunuz PHP-ni məhdudlaşdırır. memory_limit dəyərini PHP səviyyəsində qaldırın. php.ini faylında:

memory_limit = 256M

Bir çox paylaşımlı hostda php.ini faylını birbaşa redaktə edə bilmirsiniz. Bunun əvəzinə web root qovluğunuzda .user.ini faylını sınayın, və ya Apache/mod_php quraşdırmasında bunu .htaccess vasitəsilə təyin edin:

php_value memory_limit 256M

Nəzərə alın ki, .htaccess faylındakı php_value nginx və ya PHP-FPM quraşdırmalarında 500 xətası yaradır, çünki bu Apache/mod_php direktivdir. Onu əlavə etdikdən sonra 500 xətası alırsınızsa, səbəbi budur — onu silin və .user.ini istifadə edin.

3. Faktiki olaraq aktiv olan dəyəri təsdiqləyin. Redaktə etdiyinizə deyil, PHP-nin bildirdiyinə etibar edin. Web root qovluğunuza bir sətirlik fayl qoyun:

<?php echo ini_get('memory_limit');

Onu brauzerdə yükləyin, dəyəri oxuyun, sonra faylı silin. 256M təyin etdikdən sonra hələ də 128M yazırsa, hostunuz sizi əvəz edir və onlarla əlaqə saxlamalı və ya onların idarəetmə paneli parametrindən istifadə etməlisiniz.

Əksər bələdçilərin ötüb keçdiyi hissə

Limiti qaldırmaq diaqnozdur. Nəticəni belə oxuyun.

256M təyin etsəniz və sayt normal trafik altında işləməyə davam edərsə, çox aşağı olan qanuni bir tavanınız var idi — bu, böyük media kitabxanaları, WooCommerce və ya səhifə qurucuları olan saytlarda geniş yayılmışdır. İşiniz bitdi.

256M təyin etsəniz və yenidən çökərsə, sonra 512M təyin etsəniz və yenidən çökərsə, onu qaldırmağı dayandırın. Normal WordPress sorğusuna 512M lazım deyil. Yaddaş istifadəsi tavansız artırsa, nəsə dövrə vurur və ya yığılır: bütöv verilənlər bazası cədvəlini massivə yükləyən plagin, özünü rekursiv şəkildə işə salan add_action, hər sətri eyni anda yaddaşda saxlayan idxal proseduru, və ya eyni hook daxilində vuruşan iki plagin. Limiti qaldırmaq sonsuz dövrü düzəltmir — sadəcə çökməni bir neçə saniyə sonraya keçirir və onu təkrar yaratmağı çətinləşdirir.

Günahkarı tapmaq üçün bütün plaginləri deaktiv edin və Twenty Twenty-Four kimi standart bir mövzuya keçin. Xəta dayanarsa, geri qayıdana qədər plaginləri bir-bir yenidən aktivləşdirin. Harada çökdüyünü tutmaq üçün debug jurnalını aktiv edin:

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );

wp-content/debug.log faylındakı fatal sətir son hissəni ayıran faylın və sətir nömrəsinin adını göstərir. Bu, adətən dövrün özüdür və ya ondan bir funksiya çağırışı uzaqdadır.

Nə etməməli

WP_MEMORY_LIMIT dəyərini -1 və ya 1024M təyin edib unutmayın. Limitsiz yaddaş sızmanı düzəltmir; o, idarədən çıxmış bir sorğuya bütün serveri yeməyə imkan verir, bu da eyni maşındakı bütün digər saytları söndürə və hostunuzdan zəng ala bilər. Tavan bir təhlükəsizlik xüsusiyyətidir. Onu saxlayın.

ini_set('memory_limit', '512M') sətrini əsas həll kimi functions.php faylına yapışdırmayın. Bəzi nasazlıqlar üçün çox gec işləyir — çökmə mövzunuzun functions.php faylı işə düşməzdən əvvəl WordPress nüvəsinin yüklənməsi zamanı baş verirsə, sətir heç vaxt işləmir. wp-config.php daha erkən yüklənir və düzgün yerdir.

Bunun hosting problemi olduğunu güman edib planınızı təkmilləşdirməyin. Bəzən bu, həqiqətən də çatışmayan hostingdir. Çox vaxt eyni çökmə plaginlərinizlə birlikdə gəldiyi üçün böyük plana da sizi izləyir. Əvvəlcə dövrü istisna edin; bu, pulsuzdur.

max_execution_time xətasını düzəltmək üçün memory_limit dəyərini qaldırmayın. Bunlar fərqli mesajları olan fərqli limitlərdir. Yaddaş tükənməsi “Allowed memory size … exhausted” deyir. Vaxt aşımı “Maximum execution time … exceeded” deyir. Səhv olanı qaldırmaq bir günortadan çıxarır.

Hələ də ilişib qalmısınız?

Aktiv limitin həqiqətən 256M və ya daha yüksək olduğunu təsdiqləmisinizsə, bütün plaginlər söndürülmüş və standart bir mövzu ilə test etmisinizsə və o hələ də yaddaşı tükədirsə, sizdə qaldırılmalı bir tavan yox, debug jurnalında izlənməyə dəyər real bir sızma var. Fatal sətri tutun, hansı plaginin qovluğuna işarə etdiyini qeyd edin, bu da sizin xəta hesabatınızdır. Limitlərin düşündüyünüz yerdə təyin olunduğunu bilmək üçün əvvəlcə baza wp-config.php sabitlərinizi wp-config generatoru ilə düzgün təyin edin — sonra gedib jurnalı oxuyun.