Bagaimana cara menyimpan hasil db_query ()?

9

Saya biasa views_get_view_result()mendapatkan hasil dari tampilan karena nyaman pada waktu itu. Hasil kueri jarang berubah; Saya bisa menggunakan cache pandangan selama 6 hari.

Jika saya ingin mengonversinya menjadi panggilan ke db_query()bagaimana saya bisa mengaktifkan caching?

kamu
sumber

Jawaban:

9

Tidak masalah untuk caching jika Anda menggunakan tampilan atau db_query (). Caching bekerja selalu sama, bagaimana data diambil ketika cache hilang sepenuhnya terserah Anda.

  1. Buat ID cache untuk mengidentifikasi entri cache Anda. Dapat berupa string sederhana, hardcoded atau sesuatu yang kompleks berdasarkan argumen dan sebagainya.
  2. Periksa apakah dapat memuat dari cache.
  3. Jika tidak, buat ulang data dan masukkan ke dalam cache dengan waktu kedaluwarsa yang diinginkan.

Untuk melihat beberapa contoh, Anda dapat melihat fungsi yang menggunakan cache_get () , misalnya variable_initialize () .

Jika fungsi Anda dipanggil beberapa kali maka Anda mungkin ingin menggabungkannya dengan cache statis, lihat misalnya archiver_get_info () . Dan jika pembangunan kembali data sangat lambat, Anda dapat mencegahnya terjadi berulang kali dengan menggunakan kerangka kerja penguncian seperti yang dilakukan variable_initialize ().

Perhatikan bahwa cache satu permintaan hanya masuk akal jika itu lambat, karena cache_get () juga merupakan permintaan db kecuali Anda menggunakan backend cache alternatif seperti Memcache.

Dan terakhir, Views memiliki caching yang sudah ada di dalamnya dan dapat dikonfigurasi dalam tampilan Anda. Jadi itu bisa jadi pilihan juga.

Berdir
sumber
Kalahkan saya;) Saya akan meninggalkan jawaban saya sebagai contoh kode tetapi ini adalah informasi yang jauh lebih berguna
Clive
Saya pikir contoh PDO tidak serial?
mpdonadio
1
Tidak, mereka tidak, tetapi itu tidak relevan. Anda tidak menembolok sumber daya hasil pdo, Anda menembolok struktur data apa pun yang sebenarnya Anda ambil dari kueri itu.
Berdir
Saya akan mengatakan itu sangat relevan. @MotoTribe bertanya tentang hasil caching dari db_query(), dan harus men- cache nilai dari $results->fetchAll()dan bukan $resultsmerupakan kunci untuk benar-benar membuatnya berfungsi.
mpdonadio
7

Saya tidak berpikir layer DB memiliki mekanisme caching bawaan (meskipun saya mungkin salah), tetapi Anda bisa menggunakan API cache default.

Ini hanya contoh dasar yang akan men-cache hasil query untuk mendapatkan node dari tipe tertentu:

function MYMODULE_get_nodes_by_type($type) {
  // Setup a cache ID
  $cid = 'MYMODULE:node_types:' . $type;

  // If a cached entry exists, return it
  if ($cached = cache_get($cid)) {
    return $cached->data;
  }

  // Otherwise load the data
  $data = db_query('SELECT * FROM {node} WHERE type = :type', array(':type' => $type))->fetchAll();

  // And cache it
  cache_set($cid, $data, 'cache', strtotime('+6 days'));
}
Clive
sumber
3

Selain standar cache_set / cache_get mekanisme yang Drupal menyediakan, jika Anda menggunakan MySQL sebagai database Anda, maka Anda dapat mengaktifkan cache query , yang dapat cache hasil dari pandangan, atau query database lainnya, transparan. mysqltuner dapat membantu menentukan nilai bagus untuk ukuran cache.

Perhatikan bahwa jika Anda melakukan banyak penulisan ke basis data, maka caching kueri menjadi kurang efektif karena cara strategi pembatalan cache bekerja (penulisan ke tabel membatalkan semua entri yang SELECT FROM atau JOIN table itu).

Ada juga mekanisme caching untuk PostgreSQL , tapi saya tidak punya pengalaman langsung dengannya.

mpdonadio
sumber
3

Saya baru-baru ini menemukan modul Tindakan Cache . Dengan modul ini, Anda dapat mengatur cache pandangan Anda ke Cache yang dipicu oleh aturan dan membuat aturan untuk membatalkan cache pada tampilan dan tampilan tampilan tertentu.

Misalnya, cache untuk tampilan yang mencantumkan node dari tipe konten tertentu dapat dikosongkan ketika node baru dibuat dari tipe konten tersebut.

weekbeforenext
sumber