Pertanyaan ini membuat saya berpikir umpan RSS sementara di wp_options tidak dihapus secara otomatis?
Transien seharusnya kedaluwarsa dan dihapus. Namun satu-satunya cara saya melihat ini ditangani adalah ketika transient kedaluwarsa dan diminta, maka itu dihapus selama permintaan.
Bagaimana jika transien kedaluwarsa tetapi tidak pernah diminta setelah itu? Dari uraian di Codex saya berpikir bahwa semacam pengumpulan sampah tersirat. Sekarang saya tidak begitu yakin dan tidak dapat menemukan kode yang melakukan itu.
Jadi apakah itu hanya akan terjebak dalam database selamanya?
Jawaban:
Mereka sekarang
Dimulai dengan WordPress 3.7 transien kedaluwarsa dihapus pada peningkatan basis data, lihat # 20316
Jawaban lama
Jika seseorang tidak dapat menunjukkan kepada saya sebaliknya, transien tampaknya bukan sampah yang dikumpulkan. Yang membuatnya lebih buruk adalah bahwa tidak seperti opsi mereka tidak dijamin untuk disimpan dalam database. Jadi tidak ada cara yang dapat diandalkan untuk mengambil daftar semua transien untuk memeriksa mereka untuk kedaluwarsa.
Beberapa kode darurat untuk melakukan pengumpulan sampah jika database digunakan untuk penyimpanan:
sumber
time()
yang dapat menyebabkan bug (eksekusi tidak instan secara alami). Waktu permintaan diatur oleh PHP itu sendiri, tidak berasal dari jenis data apa pun yang disediakan pengguna. Mengapa kerentanan ini?Memindahkan beberapa komentar dari diskusi menjadi jawaban, dengan kata-kata ulang dan format ulang ..
Pada dasarnya, apa yang terjadi adalah bahwa kecuali Anda memiliki kasus yang sangat ekstrem, mereka tidak benar-benar perlu "pengumpulan sampah". Jika Anda tidak pernah mengambilnya, maka tidak masalah apakah mereka ada di sana atau tidak.
Lihat, transien disimpan dalam tabel opsi secara default. Dalam instalasi dasar, tabel opsi mungkin memiliki 100 entri di dalamnya. Setiap transien menambahkan dua entri lagi, tetapi bahkan jika Anda memiliki ribuan, mereka tidak mempengaruhi kecepatan situs, karena mereka tidak dimuat secara otomatis.
Saat startup, WordPress memuat opsi ke dalam memori, tetapi hanya memuat opsi yang bendera autoload-nya dihidupkan. Transien tidak mendapatkan ini, jadi jangan dimuat ke dalam memori. Hanya transien yang benar-benar digunakan kemudian akan dikenakan biaya.
Dari perspektif basis data, tabel opsi memiliki indeks pada Id opsi dan nama opsi. Transien selalu dimuat berdasarkan nama (kunci), sehingga pencarian untuk mereka selalu dipilih secara sederhana pada satu nilai kunci unik. Jadi pencariannya adalah O (log (n)) dan sangat cepat. Dengan Big-O log (n), Anda harus masuk ke jutaan dan jutaan baris sebelum menjadi penting. Terus terang, overhead dalam pengaturan dan teardown dari query, bersama dengan transfer data aktual, jauh lebih lama. Permintaan itu sendiri berjalan pada dasarnya nol-waktu dengan perbandingan. Jadi hanya memiliki baris tambahan yang tidak digunakan tidak mempengaruhi apa pun selain menggunakan ruang disk tambahan.
Mengindeks dalam basis data adalah salah satu dari ide-ide yang banyak dibaca yang tidak masuk akal bagi orang-orang yang belum benar-benar memahami apa yang terjadi di balik layar. Database dirancang untuk pengambilan data cepat, dari bawah ke atas, dan dapat menangani hal semacam ini tanpa masalah. Ini adalah bacaan yang sangat bagus: http://en.wikipedia.org/wiki/Index_(database )
Sekarang, pembersihan dengan cara yang paling jelas (memanggil SQL DELETE pada mereka) tidak benar-benar menghapusnya dari database. Itu hanya menghapus mereka dari indeks dan menandai baris sebagai "dihapus". Sekali lagi, ini adalah cara kerja database. Untuk benar-benar membersihkan ruang disk, Anda harus melanjutkan dan melakukan TABEL OPTIMASI setelahnya, dan ini bukan operasi cepat. Ini membutuhkan waktu. Mungkin lebih banyak waktu daripada nilainya. Ini mungkin tidak cukup untuk memberi Anda penghematan waktu CPU, secara total.
Jika Anda memiliki beberapa kasus yang menyebabkan penyisipan transien baru yang terus-menerus tidak digunakan, maka Anda perlu mencari masalah yang mendasarinya. Apa yang memasukkan transien ini? Apakah mereka menggunakan kunci yang berubah atau bermutasi? Jika demikian, maka plugin atau kode yang menyebabkan ini harus diperbaiki, pada dasarnya, jangan lakukan itu. Itu akan lebih membantu, karena kemungkinan kode yang tidak membuatnya dengan benar juga tidak mengambil mereka, dan dengan demikian melakukan lebih banyak pekerjaan daripada yang harus dilakukan.
Di sisi lain, mungkin ada kasus di mana transien sedang dibuat untuk sesuatu seperti setiap pos. Ini mungkin memang bisa diterima. Saya melakukan ini sendiri di SFC, untuk menyimpan komentar yang masuk dari Facebook. Setiap posting memiliki potensi sementara yang terkait dengannya, yang berarti dua baris tambahan per posting. Jika Anda memiliki 10k posting, Anda akan memiliki 20k baris pada tabel opsi (akhirnya). Ini tidak buruk atau lambat, karena sekali lagi, ada sangat sedikit perbedaan antara 100 baris dan 20.000 baris sejauh database sangat peduli. Semuanya diindeks. Ini secepat sih. Sub-sub-milidetik.
Ketika Anda mulai masuk ke jutaan baris, maka saya akan khawatir. Ketika ukuran tabel opsi meningkat di atas ratusan megabyte, maka saya akan cukup peduli untuk melihat lebih dekat. Tetapi secara umum, ini bukan masalah kecuali untuk kasus-kasus ekstrim. Ini tentu bukan masalah untuk hal yang lebih kecil dari sesuatu seperti situs berita besar, dengan ratusan ribu posting. Dan untuk setiap situs yang cukup besar untuk itu menjadi masalah, Anda harus menggunakan objek cache eksternal dari beberapa macam, dan dalam bahwa kasus, transien mendapatkan otomatis disimpan di sana bukan di database.
sumber
Otto - Saya sangat tidak setuju dengan Anda. Masalahnya adalah bahwa pada akhirnya dengan semua transien itu, ukuran meja menjadi konyol. Tidak perlu jutaan baris untuk rawa. Saat ini saya sedang berurusan dengan tabel opsi yang memiliki lebih dari 130 ribu baris, dan hang secara teratur. Karena bidang nilai adalah tipe teks besar, bahkan mencari hanya baris "autoload" menjadi mimpi buruk kinerja. Bidang nilai tersebut disimpan secara terpisah dari sisa data baris. Meskipun secara logis bagian dari tabel yang sama, bergabung harus terjadi untuk menarik baris yang Anda inginkan. Bergabung dengan yang sekarang mengambil selamanya karena data yang Anda butuhkan tersebar di semua tempat pada disk. Pembuatan profil (menggunakan jet profiler untuk mysql) telah membuktikan ini.
Menambahkan auto-load ke kunci yang dikelompokkan mungkin membantu menyelesaikan masalah ini. Pengelompokan pada Autoload Desc, ID ASC misalnya, akan memungkinkan semua baris autoload untuk bergabung bersama terlebih dahulu pada disk. Bahkan masih saya pikir Anda sedang melihat ketegangan besar dari perspektif DB.
Secara pribadi saya pikir desain sistem ini aneh. Tabel opsi tampaknya telah berubah menjadi tangkapan umum untuk semua hal. Tidak masalah jika bidang nilai cukup kecil untuk dimasukkan pada halaman yang sama dengan data baris lainnya, dan dapat diindeks secara efektif. Sayangnya bukan itu masalahnya. Siapa pun yang merancang ini harus kembali ke kelas DB101.
sumber