Salah satu situs Drupal 7 saya memiliki ribuan bidang, banyak jenis konten, lebih dari 25 tampilan, dan ratusan (segera menjadi ribuan) jenis profil. Karena itu, saya menggunakan patch inti yang lebih baik untuk cache info bidang entitas (http://drupal.org/node/1040790), dan versi -dev Tampilan yang lebih baik cache tampilan dengan tampilan (daripada memiliki satu BESAR lihat baris cache dengan semua data tampilan di dalamnya).
Ini telah membantu sebagian besar halaman di situs untuk memuat dengan 20-30MB RAM yang digunakan, daripada 160MB + (bukannya menarik cache_ * baris tabel untuk bidang dan tampilan yang 10MB +, tambalan membantu menjaga data cache_ * jauh lebih efisien).
Ini menimbulkan masalah, bagaimanapun, dalam membangun kembali cache membutuhkan waktu yang sangat lama . Biasanya lebih dari satu atau dua menit. Dan selama ini, Drupal tidak akan memuat halaman apa pun (karena cache yang coba dibaca belum dibuat, permintaan lain harus menunggu).
Selama siklus lalu lintas rendah, ini bukan masalah besar; seratus atau lebih pengguna harus menunggu satu menit sebelum halaman dimuat. Tetapi selama siklus lalu lintas tinggi, server Apache mulai menjadi gila, dengan 40+ CPU load, dan memori dengan cepat terisi karena semua thread pekerja duduk menunggu, dan memaksimalkan memori mereka, menyebabkan pertukaran. Ini semacam spiral kematian. Restart dari httpd akan menghapus semuanya, tetapi butuh 5-10 menit agar semuanya kembali normal.
Tujuan saya adalah membuatnya jadi cache tidak membersihkan situs. Untuk satu, jika saya menggunakan fungsi pembersihan cache admin_menu individu (seperti "CSS dan JS", lalu "Menu", lalu "Theme registry", dll.), Semuanya berjalan lancar sampai saya menekan opsi "Page and else". Saat itulah cache pandangan diatur ulang (operasi yang sangat CPU dan basis data dengan jumlah tampilan yang perlu di-cache), dan ketika cache info bidang diatur ulang (yang juga CPU dan database-intensif di situs ini).
Jadi ... pertanyaan / ide saya:
- Menggunakan drush dan / atau skrip shell lainnya, mungkinkah saya menghapus cache dengan cara yang lebih cerdas daripada "meledakkan semua cache sekaligus, dan berharap untuk membangun kembali yang bersih"?
- Dapatkah saya memblokir permintaan http saat pembersihan cache sedang terjadi sehingga apache tidak tersumbat dengan banyak permintaan cache-cache?
- Jika saya dapat menghapus cache di luar Drupal / permintaan httpd normal, saya mungkin dapat mengatur PHP memory_limit yang lebih tinggi untuk operasi cache yang jelas, dan membatalkan universal memory_limit saya (sekarang ditetapkan ke 256MB, kalau-kalau ada thread httpd individu perlu menghapus cache. ...).
Pada dasarnya: Apakah ada cara cerdas dan anggun untuk menghapus semua cache dengan Drupal selain hanya mengklik tombol di UI, atau menggunakan drush cc all
?
[ Edit untuk klarifikasi : Masalah utama yang saya miliki adalah membangun kembali cache , yang (a) perlu waktu, dan (b) memblokir semua permintaan lain sampai pembangunan kembali selesai. Saya ingin menemukan cara untuk membuatnya sehingga pembangunan kembali tidak begitu mematikan selama masa lalu lintas tinggi.]
sumber
Jawaban:
The tindakan Cache modul melakukan itu. Itu tergantung aturan. Sebagai contoh, Anda dapat mengatur aturan untuk menghapus tampilan tertentu ketika sebuah simpul tipe "x" telah ditambahkan atau diperbarui. Periksa dokumen untuk detail lebih lanjut.
Lihat juga modul cache yang anggun - belum mencobanya tetapi terlihat menarik.
sumber
drush cc [type]
untuk membersihkan cache spesifik (mirip dengan tindakan cache), tapi saya lebih tertarik menemukan cara untuk membersihkan cache lebih anggun dan memastikan utas httpd lainnya tidak membunuh server Apache.Masalah utama adalah bahwa Anda menggunakan MySQL untuk menyimpan data cache - untuk situs beban tinggi ini adalah solusi yang sangat tidak efektif.
Saya menyarankan untuk menggunakan Memcache sebagai gantinya. Ini secara dramatis akan meningkatkan kinerja sistem cache dan memberi Anda 2 manfaat besar:
Berikut adalah contoh konfigurasi Memcache untuk Drupal 7.
sumber
Jika Anda tidak ingin
drush cc type_of_cache
menghapus semua cache, gunakan: untuk menghapus yang spesifik, atau tentukan sendiri.Atau hapus semua tabel seperti cache secara manual, mis
Jika Anda menggunakan memcached (Bash syntax), coba:
Aktifkan mode pemeliharaan (
drush -y vset maintenance_mode 1
) untuk mencegah orang mengakses situs. Atau konfigurasikan front-end untuk mengarahkan ulang di tempat lain (mis. Dalam Varnish, redirect di Apache, atau ubah.htaccess
).Mengosongkan cache tidak membutuhkan lebih banyak memori, tetapi membangun kembali cache setelah dihapus akan membutuhkan lebih banyak. Anda selalu dapat menghangatkan cache dengan menjalankan cron atau membuka halaman apa pun, misalnya
Tentukan
-n
untuk mengabaikanphp.ini
pemrosesan yang juga dapat mempercepat proses pembersihan cache.sumber
Ada potensi biaya moneter yang terlibat, tetapi Anda bisa menggunakan pengaturan server caching seperti Varnish. Sisi baiknya adalah bahwa Varnish akan melayani situs Anda saat cache Anda dihapus pada server produksi, tanpa pengguna menjadi lebih bijak.
The downside: tergantung pada berapa detik / menit downtime dari server produksi vs pengaturan batas waktu VCL Anda, Varnish dapat memperbarui selama waktu itu dan Anda akan melihat layar kesalahan Varnish 503.
Tetapi pendekatan ini bersama dengan Redis atau Memcache dapat membantu.
sumber