PHP versiyasini yangilagandan keyin sayt o'rniga oq sahifa, 500 xatosi yoki "Saytda jiddiy xatolik yuz berdi" degan xabar chiqishi juda ko'p uchraydigan holat. Bunday paytda vahima qilish va tasodifiy sozlamalarni o'zgartirish vaziyatni yanada chalkashtiradi. Aslida tiklash tartibi oddiy: avval saytni tezda ishlaydigan holatga qaytarish, keyin xotirjam sababini topish va shundan so'ng yangi versiyaga qayta o'tish. Ushbu maqolada aynan shu tartibni amaliy misol bilan ko'rib chiqamiz.
Birinchi besh daqiqa: saytni ishlaydigan holatga qaytarish
Agar sayt PHP versiyasini o'zgartirgan zahotingiz buzilgan bo'lsa, sababi deyarli aniq yangi versiya bilan mos kelmaslikdir. Shuning uchun eng tez yechim avvalgi versiyani qaytarish. ISPmanager panelida saytlar ro'yxatidan kerakli saytni ochib, PHP sozlamalarida oldingi versiyani tanlang va saqlang. Ko'p hollarda sayt bir necha soniyada qayta ishlay boshlaydi va mijozlar muammoni sezmay qoladi.
Versiyani qaytarishdan oldin bitta ishni qilish foydali: xatolar jurnalidan oxirgi qatorlarni nusxalab oling yoki hech bo'lmasa xato matnini yozib qo'ying. Sayt ishga tushgach ham bu ma'lumot jurnalda qoladi, lekin xato aynan qaysi vaqtda va qaysi faylda yuz berganini oldindan bilish keyingi tahlilni tezlashtiradi.
Xatoning sababini jurnaldan topish
Oq sahifa yoki 500 xatosi foydalanuvchiga hech narsa aytmaydi, lekin server jurnalida aniq sabab yozilgan bo'ladi. ISPmanager'da sayt jurnallarini panelning o'zidan ko'rish mumkin, ular odatda akkauntingizdagi logs papkasida domen nomi bilan saqlanadi. SSH orqali kirish imkoningiz bo'lsa, oxirgi qatorlarni quyidagicha ko'rasiz (fayl nomi serverga qarab biroz farq qilishi mumkin):
# Oxirgi 50 qatorni ko'rish
tail -n 50 ~/logs/example.uz.error.log
# Faqat fatal xatolarni ajratib olish
grep "PHP Fatal error" ~/logs/example.uz.error.log | tail -n 20
Jurnal qatorida uchta muhim ma'lumot bor: xato turi, xabar matni va fayl yo'li bilan qator raqami. Fayl yo'li ko'pincha muammoli plagin yoki mavzuni darhol ko'rsatadi, masalan wp-content/plugins/eski-slayder/ papkasi ichidagi fayl. Shu bilan sababni izlash doirasi bitta komponentga torayadi.
Eng ko'p uchraydigan xatolar va ularning ma'nosi
Eski koddan yangi PHP'ga o'tganda bir xil xatolar qayta-qayta uchraydi. Quyidagi jadval ularni tez tanib olishga yordam beradi:
| Jurnaldagi xabar | Sababi | Yechim yo'nalishi |
|---|---|---|
Call to undefined function mysql_connect() | mysql_* funksiyalari PHP 7.0 da olib tashlangan | Kodni mysqli yoki PDO ga o'tkazish |
Call to undefined function create_function() yoki each() | PHP 8.0 da olib tashlangan | Plagin yoki kodni yangilash |
count(): Argument #1 ($value) must be of type Countable|array | PHP 8 da massiv bo'lmagan qiymatni sanash xatoga aylandi | Plaginni yangilash yoki kodda tekshiruv qo'shish |
Array and string offset access syntax with curly braces is no longer supported | $str{0} yozuvi PHP 8.0 da olib tashlangan | $str[0] ga almashtirish |
Call to undefined function mb_strlen() | Yangi versiyada mbstring kengaytmasi yoqilmagan | Panelda kengaytmani yoqish |
requires the ionCube PHP Loader | Shifrlangan skript uchun yuklovchi yangi versiyada yo'q yoki mos emas | Yuklovchini yoqish yoki skript ishlab chiqaruvchisidan mos versiyani olish |
Jadvaldagi oxirgi ikki holat kod bilan emas, balki sozlama bilan bog'liq. Har bir PHP versiyasining o'z kengaytmalar ro'yxati bor va eski versiyada yoqilgan kengaytma yangisida avtomatik yoqilmagan bo'lishi mumkin. Bunday holatda kodga tegish shart emas, panelda kerakli kengaytmani yoqish kifoya. Agar kengaytmani o'zingiz yoqa olmasangiz, sayt.uz kabinetidan texnik yordamga tiket yozing.
Amaliy misol: Farg'onadagi restoran sayti
Farg'onadagi restoranning sayti example.uz WordPress'da ishlaydi va menyu sahifasida eski slayder plagini o'rnatilgan. Sayt egasi PHP 7.4 dan 8.3 ga o'tdi va bosh sahifa o'rniga "Saytda jiddiy xatolik yuz berdi" yozuvini ko'rdi. U birinchi navbatda versiyani 7.4 ga qaytardi va sayt darhol tiklandi. Keyin jurnalda count(): Argument #1 ($value) must be of type Countable|array, null given xatosini va slayder plagini papkasidagi fayl yo'lini topdi.
Plagin bir necha yildan beri yangilanmagan edi, shuning uchun uni tuzatishni kutishning ma'nosi yo'q edi. Sayt egasi sinov nusxasida plaginni o'chirib, o'rniga faol qo'llab-quvvatlanadigan boshqa slayder plaginini o'rnatdi va menyu rasmlarini qayta joyladi. Sinov nusxasi 8.3 da xatosiz ishlagach, xuddi shu o'zgarishlar asosiy saytda qilindi va PHP yana 8.3 ga o'tkazildi.
WordPress'da qo'shimcha vositalar
WordPress fatal xato yuz berganda administrator pochtasiga tiklash rejimi havolasi bilan xat yuboradi. Bu havola orqali admin panelga kirib, muammoli plaginni o'chirish mumkin. Agar xat kelmasa, plaginni fayl menejeri yoki SSH orqali papka nomini o'zgartirib o'chirsa bo'ladi, WordPress nomi o'zgargan papkadagi plaginni yuklamaydi:
cd ~/www/example.uz/wp-content/plugins
mv eski-slayder eski-slayder.off
Xatolarni ekranga chiqarmasdan faylga yozish uchun wp-config.php fayliga quyidagi qatorlarni vaqtincha qo'shish mumkin. Xatolar wp-content/debug.log fayliga yoziladi. Tekshiruv tugagach bu sozlamalarni o'chirib qo'ying, chunki jurnal fayli tashqaridan ochilishi mumkin.
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
Qayta yangilashdan oldin nimani qilish kerak
Sabab topilib tuzatilgach, yangi versiyaga shoshilmasdan qayta o'tish kerak. Eng ishonchli usul avval sinov nusxasida tekshirish: saytni subdomenga, masalan test.example.uz ga nusxalab, unga yangi PHP versiyasini belgilash va asosiy sahifalarni birma-bir ochib chiqish. Ayniqsa forma yuborish, savat, to'lov va admin panel sahifalarini tekshirish muhim, chunki xato faqat ma'lum bir sahifada chiqishi mumkin.
- Yangilashdan oldin fayllar va ma'lumotlar bazasining zaxira nusxasini oling.
- Barcha plaginlar va mavzuni eng so'nggi versiyaga yangilang, qo'llab-quvvatlanmaydiganlarini almashtiring.
- Yangi versiyada kerakli kengaytmalar yoqilganini tekshiring.
- O'tishni tashrif kam bo'lgan vaqtda qiling va keyingi bir-ikki kun jurnalni kuzatib boring.
Shuni ham yodda tutingki, versiyani qaytarish faqat vaqtinchalik yechim. Eski PHP versiyalari xavfsizlik yamoqlarini olmaydi, shuning uchun sayt ishlashi bilan tinchlanib qolmasdan, tuzatish va qayta yangilash uchun aniq muddat belgilash kerak.