Yii2da saytning ishlash tezligini oshirish

rWmycyQrEBRMc6rE4Wf2_28.jpg

Sayt ishlash tezligini oshirish bir qancha faktorlarga bog’liq bo’ladi. Bazilari sayt ishlayotgan muhitga bog’liq bo’ladi, ba’zilari yii freymvorkining o’ziga. Bu yerda bir qancha shunday faktorlarni ko’rib chiqamiz.

PHP muhitni yaxshilash

Yaxshi sozlangan PHP muhiti juda muhim hisoblanadi. Yaxshi samaradorlikka erishish uchun

  • PHPning eng so’nggi versiyalaridan foydalaning. Major versiyalar samaradorlikni oshirishda muhim o’rin tutadi;
  • Opcache yoki APC bilan baytkod keshlashni ishga tushiring. Baytkod keshlash har bir keluvchi so’rovda PHP skriptni parsing qilishda vaqt sarfini kamaytiradi;
  • Realpath() keshlashni sozlang;

Debug holatini o’chirib qo’ying

Debug mode holatida yii freymvork debug qilish uchun ham qo’shimcha vaqt sarflaydi. Debug holatini quyidagicha o’chirish mumkin:

defined(‘YII_DEBUG’) or define(‘YII_DEBUG’, false);

Keshlash texnologiyalaridan foydalaning

Websitening ishlash tezligini turli xildagi keshlash texnologiyalari yordamida oshirish mumkin. Misol uchun, agar sizning ilovangiz foydalanuvchilarga matnni Markdown formatida kiritishga ruxsat bersa, har bir so’rovda bir xildagi Markdown matnlarni takroriy parsing qilishni oldini olish uchun parsing qilingan Markdown matnni keshlashni amalga oshirishingiz mumkin.

Sxema keshlashni ishlatish

Sxema keshlashdan ActiveRecord klassi ishlatilgan har qanday joyda ishlatish mumkin. ActiveRecord qo’shimcha vositalarsiz Dbning jadvali haqidagi sxema ma’lumotini olish imkoniyatiga ega. ActiveRecord bu ma’lumotni qo’shimcha SQL so’rov yordamida aniqlab oladi. Sxema keshlashni yoqish orqali birinchi marta olingan sxema ma’lumoti keshda saqlab qo’yiladi va keying so’rovlar paytida ishlatiladi.

Sxema keshlashni yoqish uchun component konfiguratsiyasi orqali keshlash sozlanadi va yii\db\Connection::$enableSchemaCaching xususiyatiga true qiymati beriladi:

return [
       // …
       ‘components’ => [
            ‘cache’ => [
             ‘class’ => ‘yii\caching\FileCache’,
],
‘db’ => [

                ‘class’ => ‘yii\db\Connection’,
                ‘dsn’ => ‘mysql:host=localhost;dbname=mydatabase’,
                ‘username’ => ‘root’,
                ‘password’ => ‘’,
                ‘enableSchemaCache’ => true,
                //keshning saqlanib turish vaqti
                ‘schemaCacheDuration’ => 3600,
                // sxema ma’lumoti saqlanadigan component keshi nomi
                ‘schemaCache’ => ‘cache’,
],
],
];

Assetsni birlashtirish va kichraytirish

Murakkab web sahifalar ko’plab CSS va/yoki JavaScript asset fayllarni ishlatadi. HTTP so’rovlar sonini kamaytirish uchun(har bir faylni yuklash HTTP so’rov bilan amalga oshadi) hamda yuklanuvchi assets fayllarning umumiy hajmini kichraytirish uchun ularni bitta faylga yig’ish va bu faylni siqish choralarini ko’rishingiz kerak. Bu haqida assets bo’limidan to’liqroq ma’lumot olishingiz mumkin.

Sessiyani saqlashni optimallashtirish

Odatiy holda sessiya ma’lumotlari faylda saqlanadi. Faylga sessiyani saqlashni to’xtatish uchun session_write_close() (Yiida Yii::$app->session->close())dan foydalanish kerak. Sessiya fayli yozishga yopilgan paytda boshqa bir xildagi sessiyalardan foydalanadigan barcha so’rovlar bloklanadi. Bu saytni ishlab chiqishda(development mode) va ba’zan kichik saytlarda foydali bo’ladi. Ammo, juda ko’p sondagi so’rovlar bilan ishlashda, ancha murakkabroq saqlash usulidan, masalan ma’lumotlar bazasidan, foydalangan ma’qul. Yii ko’plab sessiya saqlash vositalariga ega. Bu vositalardan konfiguratsiya faylidagi session komponentasini sozlash orqali foydalanish mumin:

return [
        //…
        ‘components’ => [
               ‘session’ => [

                       ‘class’ => ‘yii\web\DbSession’,
                        // odatdagi ‘db’ning o’rniga boshqa DB komponentdan foydalanmochi
                        // bo’lsangiz quyidagicha xususiyatni sozlang
                        // ‘db’ => ‘mydb’,
                        // odatiy sessiya jadvalini o’zgaritirish uchun quyidagicha sozlang
                        // ‘sessionTable’ => ‘my_session’
]
]
];

Yuqoridagi sozlash sessiyani saqlash uchun ma’lumotlar bazasidagi jadvaldan foydalanadi. Odatiy holda ma’lumotlar bazasiga bog’lanish uchun u db komponentasidan foydalanadi. Siz session jadvalini oldindan quyidagicha yaratib olishingiz kerak:

CREATE TABLE session (
                id CHAR(40) NOT NULL PRIMARY KEY,
                expire INTEGER,
                data BLOB
)

Bundan tashqari sessiyani faylda ham saqlashingiz mumkin. Bunda yii\web\CacheSession dan foydalanasiz. Nazariy jihatdan sessiyani xohlagan turdagi keshlash bilan keshlab qo’ysa bo’ladi. Ammo, shuni yodda tutish kerakki, ba’zi keshlash vositalari keshlangan ma’lumotni saqlash limiti tugagan paytda o’chirib yuboradi.

Agar serverizda Redis texnologiyasi bo’lsa, yii\redis\Session yordamida sessiyani saqlash tavsiya qilinadi.

Ma’lumotlar bazasini optimallashtirish

Ma’lumotlar bazasi so’rovlarini ishlatish va undan ma’lumot olish web ilovadagi asosiy ishlardan hisoblanadi. Garchi ma’lumotlarni keshlash usullari samaradorlikni oshirsa ham, bu muammoni to’lig’icha hal qilolmaydi. Ma’lumotlar bazasida juda katta ma’lumot bo’lsa va keshlangan ma’lumot bazadagi bilan mos kelmasa, oxirgi ma’lumotlarni bazadan olib kelish kerak bo’lmay qoladi va natijada samaradorlik pasayib ketadi.

Ma’lumotlar bazasi so’rovlarining samaradorligini oshirishning umumiy texnikasi filterlanadigan jadval ustunlari uchun indekslar yaratish hisoblanadi. Masalan, agar sizga username nomli foydalanuvchi ma’lumotini qidirishingiz kerak bo’lsa, siz qo’shimcha username uchun indeks yaratishingiz kerak bo’ladi. Indekslar SELECT operatsiyasini ancha tezlashtiradi, lekin INSERT, UPDATE va DELETE so’rovlarini sekinlashtiradi.

Murakkab ma’lumotlar bazasi(MB) so’rovlari uchun MB viewlarini yaratishingiz kerak. Viewlar so’rovni parsing qilishni va tayyorgarlik vaqtini saqlab turadi.

Oxirgisi va eng asosiysi, SELECT so’rovlarida LIMITdan foydalaning. Bu ma’lumot olib kelishda juda katta hajmdagi ma’lumot kelishini oldini oladi.

Oddiy arraydan foydalanish

Garchi ActiveRecord foydalanishga juda qulay bo’lsa ham, MBdan katta o’lchamli ma’lumotlarni olishda oddiy arraylar kabi samarador emas. ActiveRecorddan foydalanish paytida as Array() dan foydalanib Active Record obyektlaridan emas arraylardan foydalanish maqsadga muvofiq bo’ladi. Masalan:

class PostController extends Controller
{
   public function actionIndex()
   {
       $posts = Post::find()->limit(100)->as Array()->all();
       return $this->render(‘index’, [‘posts’ => $posts]);
   }
}

Composer Autoloaderni optimallashtirish

Composer Autoloader qo’shimcha klass fayllarni yuklashda foydalaniladi. Shu sababli uni quyidagi buyruqni ishlatish orqali optimallashtiriladi:

composer dumpautoload –o

Offlayn ma’lumotlarni qayta ishlash

So’rov o’z ichiga ko’p sonli operatsiya resurslarini olsa, siz shu operatsiyalarni offlayn holatda foydalanuvhchilarni kuttirmay turib bajarilish yo’llarini o’ylab qo’yishingiz kerak.

Ma’lumotlarni offlayn qayta ishlashning ikki xil yo’li bor: pull va push.

Pull usulida, so’rov murakkab operatsiyalarni o’z ichiga olsa, siz shu operatsiyalarga mos biror amal(task) yaratib uni biror joyga, masalan MBga, saqlab qo’yishingiz kerak. Shunda siz birorta alohida jarayon(cron jobga o’xshash)dan saqlagan amalingizni olish va qayta ishlashda foydalanasiz. Bu usul ishlatishga oson, ammo unda ba’zi kamchiliklar mavjud. Maslan, saqlab qo’ygan amalingiz doimiy ravishda saqlangan joyidan olib turiladi. Agar olib ishlatish jarayoni juda kam sonda bo’lsa, amallar juda katta kechikish bilan ishlatiladi, agar juda katta bo’lsa, yuklanish oshib ketadi.

Push usulida, amallarni boshqarishda message queue(m: RabbitMQ, ActiveMQ, Amazon SQS, …)lardan foydalanib bajariladi. Qachonki yangi amal navbatga qo’yilganida, u amalni bajarish uchun amalni qabul qiladi yoki u haqida xabar beradi.

Manbaa: yiiframework.com