Yii2: Handle Large Data with FileCache dan MemCache

cha-ching-logo#) Intermezzo
By default Yii2 telah cache ready yaitu menggunakan FileCache, silahkan lihat di conmmon\config\main

'components' => [
        'cache' => [
            'class' => 'yii\caching\FileCache',
		]
]

Namun hanya ready lho.. ibarat pedang.. udah ada ditangan kamu, namun tidak pernah kamu ayunkan untuk menebas leher musuhmu. Yup saya tahu bahwa lidah lebih tajam dari pedang sehingga kita gak perlu menggunakan pedang kita.. tapi bukan itu maksud saya. :) Btw udah pada tahu kan fungsi cache kan? jika belum mending gugling dulu..

#) Ruang Lingkup Masalah
Sebelum saya melangkah lebih jauh, saya ingin menyampaikan bahwa salah satu “masalah” yang dihadapi ketika data pada tabel kita sangat besar (berjuta juta tahun cahaya) adalah lemot. Nah hal ini, jika di Yii2 diperparah dengan sebuah komponen yang kurang efisien (baca: penulis belum tau cara optimisenya) atau bahkan tidak efisien yaitu Gridview. Saya mencoba di laptop saya (i3 ram 2GB.. Windows7 license.. kecil amat yak..) untuk data 2 juta baris.. butuh waktu 5 detik.. lama nggak nih?

Bagaimana optimasinya?? jawabanya saya belum tahu.. justru nulis ini karena minta masukan.. Namun yang saya tahu adalah bagaimana menerapkan cache pada sehingga load halaman yang sama untuk kedua kalinya akan serasa melayang diudara..

#) Tools yang digunakan untuk Problem Solving
Lalu FileCache atau Memcache??

Sekai lagi, jangan suka membandingkan dua hal yang berbeda, bisa jadi masing2 punya kelebihan sendiri napa gak dipakai dua duanya?.. emang bisa? bisa dunk.. Jadi FileCache itu mekanisme menyimpan data pada suatu file, sedangkan Memcached adalah menyimpan data pada memory dengan bantuan memcache server (kamu perlu instal ini). Mana yang lebih cepat?? yang pasti yang menggunakan memory. Mana yang lebih baik? yang lebih mahal banyak.. maksudnya FileCache mampu menyimpan data yang lebih besar sedangkan memcached terbatas sesuai kapasitas memori server.. entahlah.. haha

#) Konfigurasi di Server Environment
Kalo pake FileCache Anda gak perlu setting apapun, namun kalo pake memcached maka perlu :
Asumsi Windows yah.. linux dan mac harusnya malah lebih mudah
1. Download http://windows.php.net/downloads/pecl/releases/memcache/3.0.8/
pilih sesuai dengan PHP kamu , extract lalu taruh di folder php ext (punya saya C:\xampp\php\ext)
2. Edit php.ini (punya saya C:\xampp\php\php.ini), lalu tambahkan

extension=php_memcache.dll
[Memcache]
memcache.allow_failover = 1
memcache.max_failover_attempts=20
memcache.chunk_size =8192
memcache.default_port = 11211

Setting memcache diatas rekomendasi dari PHPManual
3. Download memcached server

http://code.jellycan.com/files/memcached-1.2.6-win32-bin.zip

atau dimana saja kamu jumpai..
Extract ke folder manapun boleh.. gampang kan
4. Via terminal as Administrator, Install memcached dengan perintah
/path/memcached kamu/memcached.exe -d install
5. Jalankan memcached
/path/memcached kamu/memcached.exe -d start
6. Restart webserver kamu.. supaya memcached bener2 digunakan..
7. Selesai.. jika error hubungi gugle.. (mungkin belum baca bismillah tadi)

#) Konfigurasi di Yii

Jika server dah ok, sekarang kita bisa terapkan di Yii2.. buka common\config\main.php ubah filecache jadi memcached

'components' => [
	'cache' => [
		/* 'class' => 'yii\caching\FileCache', */
		'class' => 'yii\caching\MemCache',
		'servers' => [
			[
				'host' => 'localhost', // sesuaikan dengan server kamu
				'port' => 11211, // default port
				'weight' => 100, // saya gagal faham disini
			],
		], 
	],

Jika digunakan bareng gimana??

	'cache' => [
		'class' => 'yii\caching\FileCache', 		
	],
	'cache2' => [
		'class' => 'yii\caching\MemCache',
		'servers' => [
			[
				'host' => 'localhost', // sesuaikan dengan server kamu
				'port' => 11211, // default port
				'weight' => 100, // saya gagal faham disini
			],
		], 
	],
	

Intinya hajar aja bleh..

#) Bagaimana penerapan koding di Yiinya?
Kita hanya akan fokus dengan Gridview yak dan actionIndex selebihnya Anda belajar sendiri (maksudnya ajarin saya)
1) di Controller actionIndex (sebenarnya gak signifikan.. tapi.. biar keren)

public function actionIndex()
{
	$searchModel = false;
	$dataProvider = false;
	$cacing = Yii::$app->cache;
	$key = !empty($_GET['page'])?$_GET['page']:1; // Ini untuk key dari cache kita
	
	$searchModel = $cacing->get('employee-searchModel-'.$key); // buat mbedain aja
	if ($searchModel === false) {
		$cacing->set('employee-searchModel-'.$key, new EmployeeSearch(), 300); // di cache 300 detik
		$searchModel = Yii::$app->cache2->get($key.'model');
	}      
	
	$dataProvider = $cacing->get('employee-dataProvider-'.$key);
	if ($dataProvider === false) {
		$cacing->set($key, $searchModel->search(Yii::$app->request->queryParams), 300);
		$dataProvider = $cacing->get('employee-dataProvider-'.$key);
	}      
			
	return $this->render('index', [
		'searchModel' => $searchModel,
		'dataProvider' => $dataProvider,
		'key' => $key, // lempar key
	]);
}

Langkah diatas disebut sebagai DataCaching

2) di view employee index, bagian Gridview, bungkus dengan mekanisme cache..

<?php
if ($this->beginCache('employee-view-'.$key, ['duration' => 3600])) {
	?>
	<?= GridView::widget([
		'dataProvider' => $dataProvider,
		'filterModel' => $searchModel,
		'columns' => [
			['class' => 'yii\grid\SerialColumn'],
			'id',
			'name',
			'gender',
			'born',
			'email:email',
			['class' => 'yii\grid\ActionColumn'],
		],
	]); ?>
	<?php
	$this->endCache();
}
?>

Langkah diatas disebut dengan FragmentCaching

3. Selesai

Inikan pake memcached, kalo pake fileCache?? sama aja kaka..

Silahkan di coba dan rasakan bedanya CMIIW

Tip: You may use different cache storage in the same application. A common strategy is to use memory-based cache storage to store data that is small but constantly used (e.g. statistical data), and use file-based or database-based cache storage to store data that is big and less frequently used (e.g. page content).

Reference: http://www.yiiframework.com/doc-2.0/guide-caching-overview.html

5 Comments
  1. Nico Susanto
    • Hafid Mukhlasin
      • Ilham Malik Ibrahim
        • Hafid Mukhlasin
  2. samuel prasetya

Leave a Reply

Your email address will not be published. Required fields are marked *