Untuk situs web institusi besar, dengan cache yang berat, saya ingin membuat cache sesegera mungkin, sehingga tidak ada pengguna yang dapat tiba di pembuatan cache ...
Saya memiliki cron set semua menit yang melakukannya, dengan menjalankan beberapa fungsi dan meminta halaman-halaman penting, tetapi apa yang saya cari adalah cara untuk mengetahui kapan cache baru saja dihapus , lebih disukai sebuah kait, jadi saya dapat meluncurkan ini menghasilkan-fungsi.
Ada ide ?
Jawaban:
Tidak ada dalam Drupal 7.x tetapi ini ditambahkan sebagai hook inti, hook_rebuild di Drupal 8.x setelah cukup banyak orang memintanya. Namun, mungkin ada cara yang lebih baik untuk menyelesaikan masalah Anda di 7.x - Anda mencoba memulai beberapa jenis fungsi penghangat cache setelah cron membersihkan cache, betul? Cara lain untuk mendekati ini adalah dengan menggunakan Elysia cron yang memiliki sejumlah peningkatan signifikan pada bagaimana cron beroperasi tetapi dua yang mungkin relevan dengan use case Anda adalah:
Anda dapat menggunakan modul ini untuk memiliki kontrol yang lebih baik atas bagaimana cron Anda berjalan untuk membantu menyelesaikan masalah cache basi. Khususnya, Anda bisa menambahkan hook ke fungsi rebuild Anda ke cron dan kemudian menggunakan Elysia cron, atur operasi ini untuk berjalan segera setelah operasi pembersihan cache.
Ini juga terdengar seperti Anda mungkin mengalami masalah dengan cron running yang sering menyebabkan cache terlalu sering dibuat ulang. Jika itu masalahnya, Anda dapat mengatur operasi pembersihan cache spesifik di Elysia cron untuk dijalankan pada tingkat yang berbeda dari operasi cron Anda yang lain, jadi misalnya pencarian indeks akan memperbarui setiap 5 menit tetapi cache penuh yang jelas hanya akan berjalan setiap 6 jam, dll.
sumber
Cara untuk melakukan ini adalah menggunakan
hook_flush_caches
dalam kombinasi denganregister_shutdown_function
. Kode contoh:Menggunakan
register_shutdown_function
berarti bahwa fungsi membangun kembali cache kita akan dipanggil setelah cache dihapus. Kami menyalahgunakanhook_flush_caches
dengan cara yang tidak pernah dimaksudkan untuk digunakan, tetapi ini harus melakukan apa yang Anda butuhkan.sumber
register_shutdown_function()
Drupal, dan menemukan drupal_register_shutdown_function core Drupal () : "Wrapper untuk register_shutdown_function () yang menangkap pengecualian yang dilemparkan untuk menghindari" Pengecualian yang dilemparkan tanpa bingkai stack di Tidak Dikenal " . Saya tahu itu membuat saya merasa lebih baikabusing hook_flush_caches
jika saya hanya menggunakan fungsi inti Drupal untuk melakukannyaTidak, tidak ada. Tidak juga. Setidaknya tidak dalam 6 atau 7. Dengan asumsi 7:
Jika Anda akan melihat
drupal_flush_all_caches()
Anda akan melihatnya memohonhook_flush_caches()
. Pengait ini dimaksudkan untuk:Akan tergoda untuk hanya membuat hook modul Anda yang terakhir dan menulis kode di sana. Tapi mari kita lihat lagi
drupal_flush_all_caches()
. Penghapusan aktual terjadi seperti ini:Ini berarti bahwa semua kait dilepaskan sebelum apapun benar-benar dihapus. Hanya ada satu fungsi yang disebut setelah penghapusan sebenarnya,
_system_update_bootstrap_status()
tetapi hanya panggilanhook_boot
,hook_exit
,hook_watchdog
danhook_language_init
- kait Anda tidak ingin menerapkan hanya untuk menyediakan fungsionalitas cache-jelas tergantung.sumber
Garis besar di sini:
Meskipun tidak ada hook di luar sana di pra-D8, Anda bisa menulis backend database Anda sendiri berdasarkan standar
DrupalDatabaseCache
dan kemudian menulis segala atau semua jenis logika ke dalamclear()
fungsi Anda . Pandangan cepat akan menyarankan ini menjadi cukup mudah di D7 (cukup salin kelas ke nama kustom Anda dan memodifikasinya dll dengan melemparkan yangmodule_invoke_all()
sesuai) dan dengan modul cache_backport bahkan akan bekerja di D6. Lalu tunjukkan tempat sampah yang ingin Anda bersihkan bersih-bersih dan Anda harus segera pergi.sumber
Jika Anda melihat sumbernya
drupal_flush_all_caches()
danclear_cache_all()
, Anda akan melihat bahwa tidak ada kait yang dipanggil setelah pembersihan, yang merupakan bug bug yang cukup.Sangat sulit untuk menjamin bahwa seorang pengguna tidak akan pernah harus menunggu beberapa entri cache dibangun, jadi saya mencoba untuk menghindari cache penuh sebanyak mungkin.
Salah satu metode yang benar-benar membantu adalah membentuk mengubah halaman kinerja untuk memasang pengatur pengiriman yang hanya membersihkan cache yang menghadap ke depan, dan tidak menyentuh menu, registri, dan cache inti yang serupa. Saya mendapatkan hasil yang baik dengan ini, karena membangun kembali menu dan registri memakan waktu setengah dari waktu untuk membangun kembali cache penuh.
Hal lain yang saya punya skrip drush yang melakukan
drupal_http_request()
pada semua URL saya (bukan hanya yang penting) sehingga semuanya di-cache. Cara ini dilakukan bervariasi berdasarkan situs. Kadang-kadang saya hanya bisa EFQ node yang diterbitkan, dan membangun URL seperti itu. Di lain waktu, Anda dapat meminta tabel sitemap XML untuk mendapatkan URL Anda. Saya kemudian memanggil ini dari cron sistem saya sesering yang saya butuhkan.sumber
Beberapa pilihan:
https://www.drupal.org/project/cache_graceful mungkin persis seperti yang Anda inginkan.
https://www.drupal.org/project/apdqc memiliki 2 kait yang menyala pada cache yang bersih memungkinkan Anda untuk mengubah yang kosong
drupal_alter('apdqc_cache_clear', $cid, $wildcard, $this->bin, $caller);
dan setelah memungkinkan Anda bereaksi terhadap yang kosongmodule_invoke_all('apdqc_cache_clear', $cid, $wildcard, $this->bin, $caller);
. Dapatkan APDQC bekerja dengan benar dan atur$conf['apdqc_call_hook_on_clear'] = TRUE;
di file settings.php Anda & maka kait harus dipanggil setiap kali cache jelas dilakukan.sumber
Ini mungkin tidak cocok untuk semua orang, dan mungkin tidak cukup cepat untuk OP - karena hanya dipicu pada inisialisasi halaman berikutnya. Namun, itu membantu saya dengan memicu kode tepat setelah "cache membersihkan semua" yang tidak peka waktu.
Jika Anda memiliki bin tertentu yang perlu Anda targetkan, yang di atas dapat dimodifikasi untuk mendukung itu, selama seluruh bin dikosongkan pada titik cache Anda kosong.
hook_init
hanya dijalankan untuk halaman yang tidak di-cache. Meskipun karena cache penuh jelas berarti tidak ada halaman dalam cache, ini seharusnya tidak menyebabkan masalah. Namun, sistem caching eksternal seperti Varnish akan menghalangi pemicu ini, dan akan berarti itu hanya akan terjadi ketika permintaan yang tepat berikutnya mencapai kembali ke Drupal.sumber
Saya memiliki kebutuhan yang sama, di mana klien ingin mem-flush cache Drupal dan Varnish ketika mereka menekan tombol "flush all caches". Saya membajak item menu untuk melakukannya.
Tembolok ini tidak akan mencapai cache apa pun yang dihapus pada cron atau di mana pun - hanya di tautan menu.
sumber
Anda mungkin ingin mencoba https://www.drupal.org/project/recacher - menggunakan modul Cache Expiration untuk mendeteksi halaman yang sudah kadaluwarsa dan kemudian melakukan cache ulang hanya halaman-halaman itu menggunakan HTTPRL yang sangat baik.
sumber