Meningkatkan Performa Dgn Cache Phalcon

Phalcon menyediakan kelas Phalcon \ Cache  yang memungkinkan akses cepat ke data yg sering digunakan atau data yang telah diproses. Phalcon \ Cache ditulis dalam C, mencapai kinerja yang lebih tinggi dan mengurangi overhead ketika mendapatkan item dari backends. Kelas ini menggunakan struktur internal komponen frontend dan backend . Komponen front-end bertindak sebagai sumber masukan atau interface, sedangkan komponen backend menawarkan pilihan penyimpanan ke kelas frontend.

kapan menerapkan cache? 

Meskipun komponen ini sangat cepat, mengimplementasikannya dalam kasus-kasus yang tidak diperlukan dapat menyebabkan hilangnya kinerja daripada keuntungan. Kami menyarankan Anda memeriksa kasus ini sebelum menggunakan cache:

  • Anda membuat perhitungan yang rumit bahwa setiap kali mengembalikan hasil yang sama (berubah jarang)
  • Anda menggunakan banyak pembantu dan output yang dihasilkan hampir selalu sama
  • Anda mengakses data database terus-menerus dan data ini jarang berubah

CATATAN Bahkan setelah menerapkan cache, Anda harus memeriksa rasio hit cache Anda selama jangka waktu. Hal ini dapat dengan mudah dilakukan, terutama dalam kasus Memcache atau APC, dengan alat yang relevan yang menyediakan backends.

Perilaku Caching 

Proses caching dibagi menjadi 2 bagian:

  • Frontend: Bagian ini bertanggung jawab untuk memeriksa apakah kunci telah berakhir dan melakukan transformasi tambahan untuk data sebelum menyimpan dan setelah mengambil mereka dari backend-
  • Backend: Bagian ini bertanggung jawab untuk berkomunikasi, menulis / membaca data yang dibutuhkan oleh frontend.

Cache Fragmen Output 

Sebuah fragmen output adalah bagian dari HTML atau teks yang di-cache sebagaimana adanya. Output secara otomatis diambil dari fungsi ob_* atau output PHP sehingga dapat disimpan dalam cache. Contoh berikut menunjukkan penggunaan tersebut. Ini menerima output yang dihasilkan oleh PHP dan menyimpannya ke dalam file. Isi file ini diperbarui setiap 172.800 detik (2 hari).

Pelaksanaan mekanisme cache ini memungkinkan kita untuk mendapatkan kinerja dengan tidak mengeksekusi helper Phalcon\Tag::linkTo.

<?php

//Create an Output frontend. Cache the files for 2 days
$frontCache = new Phalcon\Cache\Frontend\Output(array(
    "lifetime" => 172800
));

// Create the component that will cache from the "Output" to a "File" backend
// Set the cache file directory - it's important to keep the "/" at the end of
// the value for the folder
$cache = new Phalcon\Cache\Backend\File($frontCache, array(
    "cacheDir" => "../app/cache/"
));

// Get/Set the cache file to ../app/cache/my-cache.html
$content = $cache->start("my-cache.html");

// If $content is null then the content will be generated for the cache
if ($content === null) {

    //Print date and time
    echo date("r");

    //Generate a link to the sign-up action
    echo Phalcon\Tag::linkTo(
        array(
            "user/signup",
            "Sign Up",
            "class" => "signup-button"
        )
    );

    // Store the output into the cache file
    $cache->save();

} else {

    // Echo the cached output
    echo $content;
}

CATATAN Dalam contoh di atas, kode kita tetap sama, echo output ke pengguna seperti yang telah lakukan sebelumnya. Komponen cache transparan menangkap output dan menyimpannya dalam file cache (ketika cache dihasilkan) atau mengirimkannya kembali ke pengguna pre-compiled dari panggilan sebelumnya, sehingga menghindari operasi yang berlebih.

Cache Data Arbitrary 

Cache data sama pentingnya untuk aplikasi Anda. Cache dapat mengurangi beban database dengan menggunakan kembali data yg umum digunakan (tapi tidak diperbarui), sehingga mempercepat aplikasi Anda.

Contoh File Backend 

Salah satu adapter cache adalah ‘File’. Satu-satunya area key untuk adaptor ini adalah lokasi di mana file cache akan disimpan. Hal ini dikendalikan oleh opsi cachedir yang harus memiliki garis miring terbalik pada akhirnya.

<?php

// Cache the files for 2 days using a Data frontend
$frontCache = new Phalcon\Cache\Frontend\Data(array(
    "lifetime" => 172800
));

// Create the component that will cache "Data" to a "File" backend
// Set the cache file directory - important to keep the "/" at the end of
// of the value for the folder
$cache = new Phalcon\Cache\Backend\File($frontCache, array(
    "cacheDir" => "../app/cache/"
));

// Try to get cached records
$cacheKey = 'robots_order_id.cache';
$robots    = $cache->get($cacheKey);
if ($robots === null) {

    // $robots is null because of cache expiration or data does not exist
    // Make the database call and populate the variable
    $robots = Robots::find(array("order" => "id"));

    // Store it in the cache
    $cache->save($cacheKey, $robots);
}

// Use $robots 🙂
foreach ($robots as $robot) {
   echo $robot->name, "\n";
}

Contoh Backend Memcached  

Contoh di atas sedikit perubahan (terutama dalam hal konfigurasi) ketika kita menggunakan backend memcached.

<?php

//Cache data for one hour
$frontCache = new Phalcon\Cache\Frontend\Data(array(
    "lifetime" => 3600
));

// Create the component that will cache "Data" to a "Memcached" backend
// Memcached connection settings
$cache = new Phalcon\Cache\Backend\Libmemcached($frontCache, array(
    "host" => "localhost",
    "port" => "11211"
));

// Try to get cached records
$cacheKey = 'robots_order_id.cache';
$robots    = $cache->get($cacheKey);
if ($robots === null) {

    // $robots is null because of cache expiration or data does not exist
    // Make the database call and populate the variable
    $robots = Robots::find(array("order" => "id"));

    // Store it in the cache
    $cache->save($cacheKey, $robots);
}

// Use $robots 🙂
foreach ($robots as $robot) {
   echo $robot->name, "\n";
}

Query cache 

Unsur-unsur ditambahkan ke cache secara unik diidentifikasi oleh key. Bila menggunakan backend file, kuncinya adalah nama file yang sebenarnya. Untuk mengambil data dari cache, kita hanya harus memanggilnya menggunakan kunci unik tsb. Jika kunci tidak ada, metode get akan mengembalikan null.

<?php

// Retrieve products by key "myProducts"
$products = $cache->get("myProducts");

Jika Anda ingin tahu key apa saja yang disimpan dalam cache Anda bisa memanggil metode queryKeys:

<?php

// Query all keys used in the cache
$keys = $cache->queryKeys();
foreach ($keys as $key) {
    $data = $cache->get($key);
    echo "Key=", $key, " Data=", $data;
}

//Query keys in the cache that begins with "my-prefix"
$keys = $cache->queryKeys("my-prefix");

Menghapus data dari cache 

Ada saat-saat di mana Anda akan perlu untuk secara paksa membatalkan entri cache (karena update dalam data cache). Satu-satunya persyaratan adalah mengetahui key yg digunakan untuk menyimpan data tsb.

<?php

// Delete an item with a specific key
$cache->delete("someKey");

// Delete all items from the cache
$keys = $cache->queryKeys();
foreach ($keys as $key) {
    $cache->delete($key);
}

Memeriksa keberadaan Cache 

Hal ini dimungkinkan untuk memeriksa apakah cache sudah ada dengan kunci yang diberikan:

<?php

if ($cache->exists("someKey")) {
    echo $cache->get("someKey");
} else {
    echo "Cache does not exists!";
}

Lifetime 

“lifetime” adalah waktu dalam detik cache tetap disimpan tanpa berakhir. Secara default, semua cache dibuat menggunakan lifetime yg telah diatur saat penciptaan frontend. Anda dapat mengatur lifetime tertentu dalam penciptaan atau menerima data dari cache:

Mengatur lifetime ketika mengambil:

<?php

$cacheKey = 'my.cache';

//Setting the cache when getting a result
$robots = $cache->get($cacheKey, 3600);
if ($robots === null) {

    $robots = "some robots";

    // Store it in the cache
    $cache->save($cacheKey, $robots);
}

Mengatur seumur hidup saat menyimpan:

<?php

$cacheKey = 'my.cache';

$robots = $cache->get($cacheKey);
if ($robots === null) {

    $robots = "some robots";

    //Setting the cache when saving data
    $cache->save($cacheKey, $robots, 3600);
}

Multi-Level Cache 

Fitur komponen cache ini, memungkinkan pengembang untuk menerapkan cache multi-level. Fitur baru ini sangat berguna karena Anda dapat menyimpan data yang sama di beberapa lokasi cache yang dengan lifetime yang berbeda, pertama membaca dari adapter yg tercepat dan kemudian dengan yg lebih lambat sampai data expired:

<?php

use Phalcon\Cache\Frontend\Data as DataFrontend,
    Phalcon\Cache\Multiple,
    Phalcon\Cache\Backend\Apc as ApcCache,
    Phalcon\Cache\Backend\Memcache as MemcacheCache,
    Phalcon\Cache\Backend\File as FileCache;

$ultraFastFrontend = new DataFrontend(array(
    "lifetime" => 3600
));

$fastFrontend = new DataFrontend(array(
    "lifetime" => 86400
));

$slowFrontend = new DataFrontend(array(
    "lifetime" => 604800
));

//Backends are registered from the fastest to the slower
$cache = new Multiple(array(
    new ApcCache($ultraFastFrontend, array(
        "prefix" => 'cache',
    )),
    new MemcacheCache($fastFrontend, array(
        "prefix" => 'cache',
        "host" => "localhost",
        "port" => "11211"
    )),
    new FileCache($slowFrontend, array(
        "prefix" => 'cache',
        "cacheDir" => "../app/cache/"
    ))
));

//Save, saves in every backend
$cache->save('my-key', $data);

Adapter frontend 

Adapter frontend yang tersedia yang dapat digunakan sebagai interface atau sumber masukan ke cache adalah:

Adaptor Deskripsi Contoh
Output Baca input data dari output PHP standar Phalcon \ Cache \ Frontend \ output
Data Ini digunakan untuk cache berbagai jenis data PHP (array besar, benda, teks, dll). Data diserialisasi sebelum disimpan di backend. Phalcon \ Cache \ Frontend \ Data
Base64 Ini digunakan untuk cache data biner. Data serial menggunakan base64_encode sebelum disimpan di backend. Phalcon \ Cache \ Frontend \ Base64
JSON Data di-encode dalam JSON sebelum disimpan di backend. Di-Decode setelah diambil. Frontend ini berguna untuk berbagi data dengan bahasa atau framework lainnya. Phalcon \ Cache \ Frontend \ JSON
IgBinary Ini digunakan untuk cache berbagai jenis data PHP (array besar, benda, teks, dll). Data diserialisasi menggunakan IgBinary sebelum disimpan di backend. Phalcon \ Cache \ Frontend \ Igbinary
None Ini digunakan untuk cache jenis data PHP tanpa serialisasi. Phalcon \ Cache \ Frontend \ None

Menerapkan adapter Frontend Anda sendiri 

antarmuka Phalcon \ Cache \ FrontendInterface  harus diimplementasikan dalam rangka menciptakan adapter frontend anda sendiri atau extend yang sudah ada.

Backend Adapter 

Backend adapter yang tersedia untuk menyimpan data cache adalah:

Adaptor Deskripsi Info Ekstensi yang dibutuhkan Contoh
File Menyimpan data ke file plain lokal Phalcon \ Cache \ Backend \ File
Memcached Menyimpan data ke server memcached Memcached memcache Phalcon \ Cache \ Backend \ Memcache
APC Menyimpan data ke Alternative PHP Cache (APC) APC Ekstensi APC Phalcon \ Cache \ Backend \ APC
Mongo Menyimpan data ke database Mongo MongoDB Mongo Phalcon \ Cache \ Backend \ Mongo
XCache Menyimpan data di XCache XCache ekstensi xcache Phalcon \ Cache \ Backend \ XCache

Menerapkan adapter Backend Anda sendiri 

antarmuka Phalcon \ Cache \ BackendInterface  harus diimplementasikan dalam rangka menciptakan adapter backend anda sendiri atau extend yang sudah ada.

Opsi File Backend  

Backend ini akan menyimpan konten di-cache ke file di server lokal. Opsi yang tersedia untuk backend ini adalah:

Pilihan Deskripsi
prefix Sebuah awalan yang secara otomatis ditambahkan di depan key cache
cachedir Sebuah direktori (yang dapat ditulis) di mana file cache akan ditempatkan

 

Opsi Memcached Backend 

Backend ini akan menyimpan konten di-cache pada server memcached. Pilihan yang tersedia untuk backend ini adalah:

Pilihan Deskripsi
prefix Sebuah awalan yang secara otomatis prepended ke tombol tembolok
host host memcached
port port memcached
persistent membuat sambungan persistent untuk memcached?

 

Opsi APC Backend 

Backend ini akan menyimpan konten di-cache pada Alternatif PHP Cache ( APC ). Pilihan yang tersedia untuk backend ini adalah:

Pilihan Deskripsi
prefix Sebuah awalan yang secara otomatis prepended ke tombol tembolok

 

Opsi Mongo Backend 

Backend ini akan menyimpan konten di-cache pada server MongoDB. Pilihan yang tersedia untuk backend ini adalah:

Pilihan Deskripsi
prefix Sebuah awalan yang secara otomatis prepended ke tombol tembolok
Server MongoDB connection string
db Nama database Mongo
collection Koleksi Mongo dalam database

 

Opsi XCache Backend 

Backend ini akan menyimpan konten di-cache pada XCache ( XCache ). Pilihan yang tersedia untuk backend ini adalah:

Pilihan Deskripsi
prefix Sebuah awalan yang secara otomatis prepended ke tombol tembolok

Ada lebih adapter yang tersedia untuk komponen ini di Phalcon Inkubator

 

Terjemahan dr

http://docs.phalconphp.com/en/latest/reference/cache.html