Kecha yaxshi ishlagan sayt birdan "Database Error" yoki "Error establishing a database connection" degan yozuvni ko'rsatib qo'ydi, oradan bir soat o'tgach esa o'z-o'zidan tiklandi. Keyingi kuni yana o'sha holat. Bunday "kelib-ketadigan" xatoning ko'p uchraydigan sabablaridan biri MySQL foydalanuvchisiga qo'yilgan soatlik ulanishlar limitidir. Xato loglarida bu holat max_connections_per_hour nomi bilan ko'rinadi va uni bir marta tushunib olsangiz, keyingi safar bir necha daqiqada aniqlay olasiz.
1226 xatosi aslida nima deydi
MySQL har bir foydalanuvchiga resurs limitlari qo'yish imkonini beradi: soatiga nechta so'rov, nechta o'zgartirish va nechta yangi ulanish ochishi mumkinligi. Agar foydalanuvchi bir soat ichida ruxsat etilgan ulanishlar sonidan oshib ketsa, server yangi ulanishni rad etadi va quyidagi xabarni qaytaradi:
ERROR 1226 (42000): User 'shop_user' has exceeded the
'max_connections_per_hour' resource (current value: 50)
Bu yerda muhim jihat shundaki, limit bir vaqtdagi ulanishlarni emas, balki bir soat davomida ochilgan barcha ulanishlarni sanaydi. PHP saytlarida odatda har bir sahifa ochilishi bazaga yangi ulanish ochadi. Demak, soatlik limit 50 bo'lsa, sayt soatiga taxminan 50 ta sahifa ko'rishdan keyin ishlashdan to'xtaydi. Hisoblagich soat tugagach nolga tushadi, shuning uchun xato o'z-o'zidan yo'qolgandek tuyuladi, lekin trafik qaytib kelishi bilan yana paydo bo'ladi.
Uni boshqa ulanish xatolaridan qanday ajratish mumkin
MySQL ulanish bilan bog'liq bir nechta o'xshash xato beradi va ularni adashtirmaslik kerak, chunki yechimlari har xil. 1226 soatlik kvota tugaganini bildiradi. 1203 xatosi, ya'ni max_user_connections, foydalanuvchining bir vaqtdagi ochiq ulanishlari limitdan oshganini ko'rsatadi. 1040 Too many connections esa butun serverning umumiy ulanish limiti to'lganini anglatadi va odatda bitta foydalanuvchiga bog'liq bo'lmaydi. Noto'g'ri parol yoki foydalanuvchi nomi uchun esa 1045 Access denied chiqadi.
Sayt foydalanuvchiga ko'pincha faqat umumiy "baza xatosi" sahifasini ko'rsatadi, aniq kod esa PHP xato logida yoki saytning o'z logida yoziladi. Hosting panelidagi loglar bo'limini yoki sayt papkasidagi error_log faylini ochib, xato kodini topib olish tashxisning birinchi qadamidir.
Joriy limitlarni tekshirish
Agar sizda MySQL'ga administrator darajasida kirish imkoni bo'lsa, masalan o'z VPS serveringizda, foydalanuvchiga qanday limitlar qo'yilganini mysql.user jadvalidan ko'rish mumkin. Bu jadvalda max_connections ustuni aynan soatlik ulanishlar limitini saqlaydi, max_user_connections esa bir vaqtdagi ulanishlar uchun javob beradi. Qiymat 0 bo'lsa, limit qo'yilmagan bo'ladi:
SELECT user, host, max_questions, max_updates,
max_connections, max_user_connections
FROM mysql.user
WHERE user = 'shop_user';
Shared hostingda bu jadvalga oddiy foydalanuvchi kira olmaydi. Bunday holatda limit qiymatini va uni o'zgartirish mumkinligini hosting texnik yordamidan so'rash kerak bo'ladi.
Limitni oshirish va hisoblagichni tozalash
Server administratori limitni ALTER USER buyrug'i bilan o'zgartiradi. Zamonaviy saytlar uchun soatiga 50 ta ulanish juda kam qiymat, shuning uchun uni minglab ulanishgacha ko'tarish yoki umuman olib tashlash odatiy amaliyot. O'zgarishdan keyin hisoblagichni darhol nolga tushirish uchun FLUSH USER_RESOURCES ishlatiladi, aks holda joriy soat tugashini kutishga to'g'ri keladi:
ALTER USER 'shop_user'@'localhost'
WITH MAX_CONNECTIONS_PER_HOUR 20000;
FLUSH USER_RESOURCES;
Limitni butunlay olib tashlash uchun qiymat sifatida 0 beriladi. Lekin shared hostingda limitlar bir mijoz butun serverni band qilib qo'ymasligi uchun ham kerak, shuning uchun ko'pincha cheksiz emas, balki saytning real trafigiga yetadigan yuqori qiymat tanlanadi. O'z VPS serveringizda esa bu qarorni o'zingiz qabul qilasiz.
Ulanishlar sonini kamaytirish
Limitni oshirish tezkor yechim, ammo sayt bir soatda minglab ulanish ochayotgan bo'lsa, uning sababini ham bilish foydali. Ko'pincha ulanishlarning katta qismini real tashrifchilar emas, balki botlar, tez-tez ishlaydigan rejalashtirilgan vazifalar yoki keshsiz og'ir sahifalar keltirib chiqaradi. Quyidagi nuqtalarni tekshirib chiqing:
- Sahifa keshi yoqilganmi: keshdan berilgan sahifa bazaga umuman ulanmaydi, shuning uchun ulanishlar soni keskin kamayadi.
- Kirish logida bir xil sahifalarni tinimsiz so'rayotgan qidiruv va tahlil botlari bormi, ularni sayt darajasida cheklash mumkin.
cronvazifalari har daqiqada ishga tushmayaptimi, ko'p holatda besh yoki o'n besh daqiqalik oraliq yetarli.- WordPress saytlarida administrator panelidagi
admin-ajax.phpso'rovlari ochiq qoldirilgan brauzer oynasidan ham muntazam yuborilib turadi.
Amaliy misol: klinika saytining tushki uzilishlari
Samarqanddagi xususiy klinikaning example.uz sayti har kuni tushga yaqin bir soatcha ishlamay qolardi. Shifokorlar qabul jadvali va onlayn yozilish shakli aynan shu vaqtda eng ko'p ishlatilar, administrator esa muammoni hosting sekinligidan deb o'ylardi. PHP xato logida ketma-ket 1226 kodli yozuvlar topildi, kirish logi esa bir soatda bir necha yuz sahifa ochilganini ko'rsatdi, bu esa 50 lik limitdan ancha ko'p edi.
Texnik yordam foydalanuvchi limitini sayt hajmiga mos qiymatga ko'tarib, hisoblagichni tozaladi. Sayt egasi esa sahifa keshini yoqdi va qabul jadvalini yangilaydigan rejalashtirilgan vazifani har daqiqadan har o'n daqiqaga o'tkazdi. Natijada xato butunlay yo'qoldi, sahifalar esa avvalgidan tezroq ochila boshladi. sayt.uz hostingida bunday holatda xato kodini ko'rsatib, kabinet orqali tiket ochish kifoya.
Muammo qaytmasligi uchun
Soatlik limit muammosi ko'pincha sayt o'sib, trafik oshgan paytda birinchi marta namoyon bo'ladi. Shuning uchun reklama kampaniyasi yoki mavsumiy aksiya oldidan bazaga ulanish limitlari saytning kutilayotgan yukiga yetishini oldindan aniqlab olish foydali. Xato logini haftasiga bir marta ko'zdan kechirish, kesh ishlayotganini tekshirish va keraksiz botlarni cheklash saytni bunday kutilmagan uzilishlardan himoya qiladi.