Memahami Laravel Cache Untuk Mencegah Membengkaknya Hardisk Di Server
Sebagai mantan front-end developer, ini adalah pertama kalinya saya mengerjakan proyek menggunakan framework (pekerjaan saya sebelumnya berfokus terutama pada tata letak dan estetika situs web). Mengingat itu adalah kesalahan pemula, mengabaikan penggunaan cache adalah masalah besar.
Apa yang sebenarnya terjadi?
Bagian dari peran saya saat ini mencakup pengawasan aplikasi dan memastikan mereka mematuhi standar sehingga mereka dapat mencapai potensi penuhnya. Pemantauan adalah salah satu hal terpenting yang harus dilakukan pengembang setelah fase pengembangan. Dengan mengamati dan mencatat berbagai kegiatan, Anda bisa mendapatkan informasi tambahan yang dapat Anda gunakan untuk memperbaiki dan melihat apakah semuanya berjalan dengan baik. Setelah aplikasi disebarkan ke server produksi, pengembang memantau aktivitas aplikasi.
masalah perfoma
Salah satu aplikasi yang menarik perhatian kami adalah folder penyimpanan cache untuk proyek yang menggunakan Laravel sebagai frameworknya. Saat tim memantau kinerja server aplikasi, mereka menemukan bahwa server mengalami masalah karena jumlah pengguna meningkat. Sejumlah besar file disimpan di folder cache (/storage/framework/cache/data).
Setelah beberapa penelitian, analisis, dan penelitian, saya menemukan penyebab masalah ini. Saya mengabaikan beberapa proses yang telah menyimpan beberapa file di folder itu dan membutuhkan banyak penyimpanan dalam skenario I/O aplikasi saya yang tinggi. Jadi, terutama jika Anda menggunakan framework seperti Laravel, Anda harus memiliki pemahaman menyeluruh tentang bagaimana proyek Anda menggunakan cache.
Menggunakan Memcached
Sementara itu, untuk mengatasi masalah memiliki sejumlah besar file yang tidak digunakan - atau mungkin perlu, tetapi saat ini saya tidak tahu seberapa penting atau mengapa itu - sebagai driver cache saya memutuskan untuk menggunakan Memcached. Laravel. Mengganti nilai default CACHE_DRIVER dalam file .env dari 'file' ke 'memcached' untuk memengaruhi config/cache.php
. Konstanta yang digunakan dalam kode ini adalah:
'default' => env('CACHE_DRIVER', 'file')
Seperti yang dijelaskan memcached.org:
Memcached adalah sistem caching objek memori terdistribusi kinerja tinggi gratis dan sumber terbuka yang bersifat umum, tetapi dimaksudkan untuk digunakan untuk membongkar basis data dan mempercepat aplikasi web dinamis. Memcached sederhana namun kuat. Desainnya yang sederhana memfasilitasi penerapan yang cepat dan kemudahan pengembangan, menyelesaikan banyak masalah yang dihadapi oleh cache data yang besar. Perhatikan bahwa jika Anda menggunakan memcached sebagai driver cache, Anda harus menginstal paket PECL Memcached di server Anda.
Memang, tidak membuat file dan menyimpan cache di driver memcache menyelesaikan masalah. Saya pikir lebih baik ini sudah berakhir, bukan? Solusinya tidak menghapus file cache yang saat ini disimpan di folder. Juga, file cache ini tidak dihapus dari waktu ke waktu (harus diatur seperti Cached::Forever). Pada titik ini, Anda harus menghapus secara manual semua file cache yang dibuat yang disimpan di folder cache.
Masalah ini membuka kesempatan untuk belajar tentang caching.
Mengapa aplikasi saya secara otomatis menggunakan caching?
Menggunakan Laravel Cache
Laravel memiliki fungsi bawaan untuk menangani caching semacam ini. Ini adalah:
- Cache::Put()
- Cache::Get()
- Cache::Forever()
- Cache::Has()
Menggunakan fungsi ini memerlukan penggunaan Illuminate/Contracts/Cache/Factory
dan Illuminate/Contracts/Cache/Repository
. Ini memberi Anda akses ke layanan caching Laravel.
Satu-satunya masalah adalah saya tidak menggunakan fungsi di atas sama sekali. Itu tidak ada di bagian mana pun dari kode proyek saya. Yah, kita tidak tahu. Untuk menyelidikinya, saya memilih salah satu proyek di mesin lokal saya dan melihat kapan proyek tersebut menyimpan cache. Pertama, setel CACHE_DRIVER ke 'file' lagi agar kami dapat melihat data untuk penyelidikan. Saat menguji semua tindakan aplikasi saya, saya menemukan bahwa setiap penyimpanan cache akan menyediakan data berikut di folder Storage/Frameworks/Cache/Data
:
Mengetahui cache, "1562547945" adalah kunci untuk mengakses nilai yang ditetapkan dalam file ini. Dalam hal ini nilainya adalah '1'. Untuk penjelasan lebih lanjut, jika Anda sengaja menyimpan cache dengan nilai "Ini adalah cache!", isi file cache yang diharapkan adalah 1562547945: Ini adalah cache!
Pertanyaan pertama adalah, "Dari mana nilai '1' ini berasal?"
Coba gunakan bilah debug Laravel untuk memantau bagian aplikasi Anda yang menyimpan file cache. Selain proses manual coba-coba, lacak semua kode yang berjalan selama proses langkah demi langkah. Cache dibuat hanya saat rute API dipanggil. Sepertinya cache dibuat saat saya mengunjungi root web, tetapi ini hanya terjadi karena saya memanggil API melalui ajax. Anda dapat melihat bahwa setiap kali Anda mengakses sisi API aplikasi Anda, file cache dibuat. Ternyata middleware API Laravel memiliki pelambatan di dalamnya.
Pertimbangkan ini satu-satunya perbedaan dalam API untuk rute lain di app/Http/Kernel.php
:
Ini menggunakan "pelambatan" dan Anda melihat ini di bagian bawah kernel.
File ThrottleRequests yang mengarah ke /vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php
ini menggunakan paket ini: `use Illuminate\Cache\RateLimiter;`
Fitur ini adalah:
Gunakan caching untuk memantau jumlah panggilan API dan membuat batas akses setiap menit. Ini adalah cara paling sederhana untuk menggambarkan pelambatan.
Saya telah membuat rute sampel di Rute API di bawah API Middleware.
Route::group(['middleware' => ['api']], function () {
Route::get('/test-for-throttle', function () {
return 'this is to test throttle';
});
});
Seperti yang Anda lihat, jumlah akses dicatat di file cache di sebelah kiri, menghitung hingga 60 kali (batas akses dalam 1 menit) dan mengembalikan kesalahan jika melebihi itu. Bilah debug Laravel memungkinkan Anda dengan cepat melihat apakah suatu halaman sedang di-cache dan memberi Anda informasi yang cukup untuk mengamatinya dengan mudah.
Ini jauh lebih mudah daripada memeriksa kode secara manual dan memasukkan beberapa kode uji.
Saya telah menemukan bahwa pembatasan adalah apa yang menyimpan file cache, jadi jika menurut Anda ini tidak diperlukan untuk proyek Anda, Anda dapat mematikannya.
Kesimpulan
Kesimpulannya, kita telah mempelajari dua cara framework menyimpan cache. Yang pertama adalah fasad Cache, yang sengaja digunakan tergantung pada proses aplikasi. Lainnya adalah throttle. Angka "1" yang disimpan dalam contoh ini, yang digunakan Laravel untuk memantau jumlah panggilan API, adalah berapa kali rute API diakses.
Kami merekomendasikan penggunaan Memcached sebagai CACHE_DRIVER untuk menghindari masalah ini dengan penyimpanan Anda, terutama jika Anda tidak memerlukan banyak cache. Memcached bagus untuk aplikasi I/O tinggi.
Ini memberi Anda dua opsi:
- Matikan throttle.
- Biarkan pelambatan dan gunakan memcache sebagai CACHE_DRIVER.
xKedua opsi ini mencegah penyimpanan file cache yang tidak perlu.
Selalu pantau bagian aplikasi Anda yang menggunakan banyak penyimpanan dan faktor yang dapat memengaruhi I/O saat aplikasi Anda digunakan oleh banyak pengguna, untuk berjaga-jaga jika hal itu terjadi lagi atau Anda mengalami masalah serupa. Sebaiknya Anda menyelidikinya. Selain itu, menggunakan alat debug seperti Laravel debugbar dapat meminimalkan waktu yang dihabiskan untuk menyelidiki aliran aplikasi Anda. Ini sangat membantu, terutama bagi pemula yang perlu memahami topik semacam ini, seperti file cache.