Bagaimana cara yang benar untuk membersihkan file sementara yang tersimpan di php?
Saya mencoba mencari cara untuk membersihkan ruang penyimpanan sementara saya menggunakan php. Saya tahu saya dapat mengatur pekerjaan cron tetapi, apakah ada cara untuk melakukannya dari php itu sendiri?
Saya menggunakan folder penyimpanan sementara untuk menyimpan file pdf yang dihasilkan untuk diunduh pengguna. Saya telah berhasil memaksakan kedaluwarsa pada file tersebut sehingga tidak lagi tersedia untuk umum untuk diakses setelah 3 menit. Sekarang masalahnya. Meskipun file tidak dapat diakses publik, itu masih disimpan di server saya. Saya telah membuat kode seperti ini untuk membersihkan penyimpanan.
/** from the main thread */
if (rand(1, 100) <= 5) {
Reports::clean();
}
/** the clean function */
public static function clean()
{
$path = static::getStoragePath(); if($dir_handle = opendir($path)) { while (($fileName = readdir($dir_handle)) !== false) { $file = $path . '/' . $fileName;
if (!is_file($file)) continue; // If file is older that 3 minutes delete it if (time() - filemtime($file) > static::$expires) { unlink($file);
}
}
closedir($dir_handle);
}
}
jadi ini akan membersihkan penyimpanan secara acak. Sebagian besar ini baik-baik saja. tetapi masalahnya adalah ketika pembersihan penyimpanan dimulai, ini memperlambat permintaan itu seperti kura-kura.
Jadi saya berpikir untuk membuat cronjob. Tetapi apakah ada cara yang benar untuk melakukan ini dari php itu sendiri?
Catatan: Saya menggunakan slim-4, juga tidak memiliki banyak keahlian dalam menyiapkan cronjobs. Jadi sumber daya apa pun juga akan membantu
Jawaban
Jawaban singkatnya: tidak.
PHP tidak memiliki cara untuk memicu sendiri tindakan apa pun.
Buat skrip (atau perintah jika itu kerangka kerja) dan picu dengan cronjob.
Dalam penerapan Anda, setiap kali rutinitas pembersihan mencapai utas utama, bergantung pada volume file di direktori PDF Anda, ini dapat membuat jeda yang signifikan dalam respons.
Seperti dicatat dalam komentar / jawaban lain, tugas cron memang akan menjadi cara "standar" untuk menangani ini. Namun, jika Anda tidak memiliki akses ke cron job, atau lebih memilih solusi PHP murni, ada beberapa kemungkinan pendekatan, selain apa yang sudah Anda lakukan.
Simpan log dari file yang dibuat bersama dengan stempel waktu pembuatan. Ketika rutinitas bersih dipanggil, alih-alih melakukan pemindaian direktori lengkap dengan pemeriksaan waktu yang dimodifikasi, hapus berdasarkan catatan Anda, dan bersihkan entri yang dihapus dari catatan. Simpan catatan Anda misalnya sebagai file JSON, atau sebagai CSV / TSV. Ini akan memberikan percepatan yang signifikan jika ada volume file yang signifikan, mengingat berkurangnya akses sistem file.
Jika Anda tidak ingin mengganggu pengguna dengan jeda pembersihan, pindahkan rutin dari file yang menghadap pengguna ke file khusus admin, atau lakukan pemeriksaan pengguna admin, dan sesuaikan pemicu frekuensi pembersihan (dalam OP dengan 1:20) untuk mencocokkan frekuensi penggunaan admin. Ini tentu saja dapat mengurangi frekuensi pembersihan (jika admin tidak ada), tetapi akan mengurangi beban publik.
Terakhir, jadilah Tn. Cron dan picu pembersihan secara manual sesekali, setiap hari, atau sebelum server Anda kehabisan ruang. Secara umum, kecuali Anda sangat kekurangan ruang, sepertinya tidak perlu membersihkan setiap 20 panggilan halaman atau lebih. Saya tidak tahu tentang volume PDF yang dihasilkan, lalu lintas yang terjadi, atau sumber daya server, jadi sulit untuk mendapatkan angka yang direkomendasikan tentang frekuensi pembersihan.
Ini adalah konsep yang buruk, gunakan penjadwal cronjob untuk pekerjaan ini. Berikut adalah bash oneliner untuk menghapus semua file di folder / tmp / some_path jika isi folder melebihi 10MB (silahkan modifikasi sesuai kebutuhan anda):
SIZE=$(du -bs --block-size=1M /tmp/some_path | cut -f1); if [[ $SIZE -gt 10 ]];then echo "Folder '/tmp/some_path' has size ($SIZE MB)."; rm -r /tmp/some_path/*; fi
Anda dapat menyisipkan kode ini ke script.sh (termasuk shebang misalnya untuk bash #!/bin/bash
di bagian atas dan membuat file dapat dieksekusi misalnya chmod +x script.sh
), Kemudian tambahkan baris baru ke penjadwal cronjob (misalnya crontab -e
) untuk memeriksa ukuran folder setiap jam :
0 * * * * <path_to_the_script>/script.sh
Anda dapat menemukan lebih banyak tentang cronjobs di sini: https://crontab.guru