Friday, May 30, 2014

Yiida website sahifalarining necha marta ko'rilganligini hisoblash .


Assalomu alaykum.
Bu maqola websitedagi sahifalar, rasmlar va boshqa qismlari, foydalanuvchilar tomonidan necha marta bosilgani, necha marta ko'rilgani yani usha sahifaga necha marta kirgani, rasmni necha marta ochib ko'rganini hisoblab boruvchi hisoblagichni o'rganib chiqamiz.




Bu juda ham oddiy, oddiy bo'lsa ham kopchilik uchun qiziq va keraklidir.
Bu ishni qilishni 2 xil usulini ko'rib chiqamiz.
1-usul: save() metodi yordamida;
2-usul: saveCounters() metodi yordamida;


1-usul:

Faraz qilaylik sizda PostController, Post(model) mavjud, biror sahifani ko'rish uchun ushbu controllerning actoinView metodiga murojat qiladi.
Albatta sizning post jadvalingizda 'visits' yoki 'count', 'hits' va shunga o'xshagan o'ziz hohlagan ustun bo'lishi kerak, yani necha marta ko'rilganini yozib borish uchun.

public function actionView($id) {
    $post = Post::model()->findByPk($id);
    $post->hits+= 1;
    $post->save();
    $this->render('view', array('post' => $post));
}

Ko'rib turganingizdek juda ham oddiy, yani 'hits' ning qiymatini 1 taga oshiradi halos.

2-usul
Yii Framework ning 1.1.8 — versiyasidan boshlab CActiveRecord klassiga yani metod, saveCounters() metodi qo'shildi.
Bu metod ham sanash uchun ishlatiladi.

public function actionView($id) {
    $post = Post::model()->findByPk($id);
    $post->saveCounters(array('hits'=>1));
    $this->render('view', array('post' => $post));
}


Ko'rib turganingizdek deyarli bir hil.

Keling endi ikkalasini solishtiramiz.
Bularning farqi nimada, qaysi bir afzal yoki qaysi biri tez ishlaydi degan savol tug'ilishi mumkin sizda.
Quyidagi kodni o'zingiz yozib ham tekshirib ko'rishingiz mumkin.
$start = microtime(true);
for($i=0;$i<1000;$i++) {
       $post->hits++;
       $post->save();
             yoki
       $post->saveCounters(array('hits'=>1));
}
echo microtime(true)-$start;


Natija:

— save() ~39 sekundda bajardi
— saveCounters() ~23sekundda bajardi

Ko'rib turganingizdek, saveCounters() save() ga nisbatan deyarli 41% tez ishlar ekan.
Buning siri nimada?
Javob oddiy, save() metodida saveCounters() metodiga nisbatan kattaroq bo'lgan SQL so'rovi bajariladi, ushanchun, yani:
save():
UPDATE `post` SET `id`=1, `title`='bleble',  `content`='long-long description', `hits`=3560,  `iduser`='2', `created_at`='2012-02-17 13:14:02', ...  WHERE `post`.`id`=1


save() funksiyasi bitta 'hits' ustunini update qilish uchun qolgan hamma ustunni update qilib chiqadi.
saveCounters():
UPDATE `post` SET `hits`=`hits`+1 WHERE `post`.`id`=1


saveCounters() funksiyasi esa bitta ustunni update qiladi.

O'ylaymanki ushbu maqola ko'pchilik uchun foydali bo'ladi.

Sardor Dushamov <dsq2190@gmail.com>

Manba: habrahabr.ru/post/138534/

No comments:

Post a Comment

Yii2 frameworkda frontend va backend sozlanmalarini sozlash(Apache)

Yii2 framework 2 xil template mavjud; Bularni yaxshi bilsangiz kerak, bular basic va advanced; Bularni farqlarini quyidagi rasm orqali bil...