Geçici atıklar toplanıyor mu?


61

Bu soru beni geçici RSS'nin otomatik olarak kaldırılmayan wp_options beslemelerini mi düşünüyor ?

Geçicilerin süresinin dolması ve silinmesi gerekiyor. Bununla birlikte, bunun işlendiğini görmemin tek yolu, geçici sürenin sona erdiği ve istendiği zaman, istek sırasında silinir.

Ya geçici sürenin dolması ancak bundan sonra asla talep edilmemesi durumunda? Codex'teki açıklamadan itibaren, bir tür çöp toplama işleminin ima edildiğini düşündüm. Şimdi pek emin değilim ve böyle bir kodun yerini bulamıyorum.

Öyleyse sonsuza dek veritabanında kalacak mı?


teorik olarak cron çalıştırıldıklarında kaldırılmalıdırlar (süresi dolmuşsa)
onetrickpony

1
@ Ambitious Amip evet, biraz bahsetmiştim. Demek istediğim - geçici olan yaratılış hiç talep edileceğini varsaymaz veya garanti etmez. Özgün soru vurgulayan - Ben asla eğer doldu geçici silinir ne zaman ve eğer olsun bunu?
Rarst

1
süresi dolmuş verileri temizlediğinizi varsayar, ancak evet, haklısınız, asla silinmeyeceği durumlar vardır. Geçici olan bir widget'ı kaldırmak gibi. Bunun için trac üzerine bir bilet göndermelisiniz :)
onetrickpony

1
@Rarst - Bir yama yazmak ve trac'e göndermek için mükemmel bir şey gibi görünüyor?
MikeSchinkel

Yanıtlar:


45

Onlar şimdi

WordPress 3.7'den itibaren süresi dolmuş geçici veri tabanı yükseltmelerinde silinir, bkz. # 20316


Eski cevap

Birisi bana aksi gösteremezse, geçici sonuçta toplanan çöp değil gibi görünüyor. Daha da kötüsü, seçeneklerden farklı olarak veritabanında depolanmalarının garanti edilmemesidir. Bu nedenle, tüm geçici sürelerin listesini kontrol etmenin güvenilir bir yolu yoktur.

Veritabanı saklama için kullanılıyorsa, bazı derleme kodları çöp toplama işlemi yapacak:

add_action( 'wp_scheduled_delete', 'delete_expired_db_transients' );

function delete_expired_db_transients() {

    global $wpdb, $_wp_using_ext_object_cache;

    if( $_wp_using_ext_object_cache )
        return;

    $time = isset ( $_SERVER['REQUEST_TIME'] ) ? (int)$_SERVER['REQUEST_TIME'] : time() ;
    $expired = $wpdb->get_col( "SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE '_transient_timeout%' AND option_value < {$time};" );

    foreach( $expired as $transient ) {

        $key = str_replace('_transient_timeout_', '', $transient);
        delete_transient($key);
    }
}

$ time = $ _SERVER ['REQUEST_TIME']; ve sonra $ sorgu kullanmak SQL sorgusunda - bunu yapma. SQL enjeksiyonlarını önlemek için $ _SERVER değişkenleri / değerleri ile daha dikkatli anlaşın.
hakre

@hakre hm ... PHP performansının, üzerinde time()hatalara neden olabilecek kullanımlarını öneren sunumlarından seçtim (yürütmenin doğası gereği anlık değil). Talep süresi PHP'nin kendisi tarafından ayarlanıyor, kullanıcı tarafından sağlanan herhangi bir veriden gelmiyor. Bu güvenlik açığı neden?
Rarst

@Rarst: Kullanmaman gerektiğini söylemedim, sadece SQL sorgusunda kullanılmak üzere güvenli bir şekilde kodlandığından emin olmalısın. Bunu harici bir kaynaktan gelen her değişkenle yapmalısınız. $ _SERVER değişkenleri beklendiği gibi ayarlanmayabilir ve bunun yerine istekte bulunan kullanıcı tarafından bile ayarlanır. Sadece bazı iyi kodlama uygulamalarını yaymak istedim. Her zaman olduğu gibi, asıl kullanılabilirlik durumu hakkında bilgi edinmek için belgelere bakın. Örneğin PHP 4 için, böyle bir değişken mevcut değildir ve özel bir başlık veya ortam değişkeni tarafından üzerine yazılabilir - php.net/manual/en/reserved.variables.server.php
hakre

@hakre düzeltildi (bence), PHP4 hatırlatıcısı btw için teşekkürler (WordPress'in desteğini bırakmasını bekleyemiyorum)
Rarst

Bu gözlerimde çok daha iyi görünüyor;). Umarız time () ile sorun yaşamadıkça ve geçici olarak tüm kazaları silebilecek veya negatif tamsayılar olabilir. Çalışan bir sisteme asla güvenme: P
hakre

20

Tartışmadan gelen yorumların bir kısmını yeniden ifade edip yeniden biçimlendirme ile bir cevaba taşımak.

Temel olarak, bunun aşağısı şudur: süper aşırı bir durumunuz olmadığı sürece, gerçekten “toplanmış çöpler” olmaları gerekmez. Onları asla getirmezseniz, onların orada olup olmadıklarının önemi yoktur.

Görüyorsunuz, geçici olanlar seçenekler tablosunda varsayılan olarak saklanıyor. Bir temel kurulumda, seçenekler tablosunda 100 giriş olabilir. Her geçici iki giriş daha ekler, ancak binlerce tane olsa bile, otomatik olarak yüklenmediklerinden site hızını etkilemezler.

Başlangıçta, WordPress seçenekleri belleğe yükler, ancak yalnızca otomatik yükleme bayrağı açık olan seçenekleri yükler. Geçici olanlar bunu anlamıyor ve hafızaya yüklenmiyorlar. Yalnızca daha sonra gerçekten kullanılan geçici olaylar bir maliyete neden olur.

Veritabanına göre, seçenekler tablosunda hem seçenek kimliği hem de seçenek adı üzerinde dizinler bulunur. Geçici olaylar her zaman adı (anahtar) temel alarak yüklenir ve bu nedenle, bunlar için yapılan aramalar her zaman basit bir benzersiz anahtar değer seçer. Böylece arama O (log (n)) ve süper hızlıdır. Büyük O kütüğüyle (n), farkedilmeden önce milyonlarca ve milyonlarca sıraya girmeniz gerekir. Açıkçası, gerçek veri aktarımı ile birlikte sorgunun kurulumunda ve aranmasında genel gider daha uzun sürüyor. Sorgu, karşılaştırma yaparak aslında sıfır zamanda çalışır. Yani basitçe sahip ekstra disk alanı kullanarak başka bir şey etkilemez ekstra kullanılmayan satırları.

Veritabanlarında indeksleme, sahnelerin gerisinde neler olup bittiğini anlamayan insanlara mantıklı gelmeyen derinlemesine düşünülmüş fikirlerden biridir. Veritabanları sıfırdan hızlı veri alımı için tasarlanmıştır ve bu tür şeyleri sorunsuzca halledebilir. Bu oldukça iyi bir okuma: http://en.wikipedia.org/wiki/Index_(database )

Şimdi, en belirgin şekilde temizleme (üzerlerinde SQL DELETE çağırmak) aslında onları veritabanından silmez. Sadece dizinden kaldırır ve satırı "silindi" olarak işaretler. Yine, bu sadece veritabanlarının nasıl çalıştığıdır. Disk alanını gerçekten temizlemek için devam etmeli ve daha sonra OPTİMİZE TABLOSU yapmalısınız ve bu hızlı bir işlem değildir. O zaman alır. Muhtemelen değdiğinden daha fazla zaman. Toplamda CPU zamanından tasarruf etmek için muhtemelen yeterli değildir.

Kullanılmayan yeni geçici olayların sürekli olarak eklenmesine neden olan bir durum varsa, bunun yerine bunun altında yatan sorunu bulmanız gerekir. Bu geçici olayları ne ekliyor? Değişen veya mutasyona uğramış bir anahtar mı kullanıyorlar? Öyleyse, buna neden olan eklenti veya kodun, temelde bunu yapmaması için sabitlenmesi gerekir. Bu daha yararlı olacaktır, çünkü onları doğru şekilde oluşturmayan kodun da onları almadığı ve bu nedenle yapması gerekenden daha fazla iş yaptığı muhtemeldir.

Öte yandan, her yazı gibi bir şey için geçici olayların yaratıldığı bir durum olabilir. Bu gerçekten de tamamen kabul edilebilir olabilir. Bunu Facebook'tan gelen yorumları saklamak için SFC'de yapıyorum. Her gönderi, kendisiyle ilişkili potansiyel bir geçici süreye sahiptir, bu da gönderi başına iki ekstra satır anlamına gelir. 10k yayınınız varsa, seçenekler tablosunda (sonunda) 20k satırınız olur. Bu kötü ya da yavaş değildir, çünkü yine de, veritabanlarının gerçekten umursadığı sürece 100 satır ile 20.000 satır arasında çok az bir fark vardır. Her şey endekslendi. Heck kadar hızlı. Alt alt milisaniye.

Milyonlarca sıraya girmeye başladığınızda , o zaman endişelenirim. Seçenekler tablosu yüzlerce megabaytın üstüne çıktığında, daha yakından bakmak için yeterince endişeliyim. Ancak genel olarak konuşursak, bu aşırı durumlar dışında bir sorun değildir. Bu, kesinlikle yüz binlerce yayın içeren büyük bir haber sitesi gibi bir şeyden daha küçük bir şey için önemli değil. Ve sorun yaratabilecek kadar büyük herhangi bir site için, bir tür harici nesne önbellek kullanıyor olmalısınız ve bu durumda, geçici veriler veritabanında otomatik olarak orada saklanır.


1
Not: bitiş süresi ile geçici do autloaded olsun ve hiçbir sona erme olan varsayılan bir uygulama / eklenti onlar her sayfa / sonrası yük bellek parçalarını kullanıyor olacak bir son kullanım tarihi belirlemek geçici bir sürü oluşturma ve olmayıp, bu yüzden.
webaware,

"Son kullanmayan bir geçici" kullanmak için hiçbir sebep yoktur, çünkü bu temelde normal bir "seçenek" ile aynıdır.
Otto,

1
Tabii, ama varsayılan . Bu nedenle, pek çok eklenti yazarı süresi dolmayan geçici ekler ekliyor.
webaware,

1
Eh, buradaki çözüm basit: Bu eklentileri kullanmayın. Yanlış yapıyorlar. Geçici durumlar seans olarak kullanılmamalıdır, anlamlı bir son kullanma tarihi olmadan kullanmamalısınız ve mutasyona uğramış veya değiştirilmiş anahtarlar olmamalıdır.
Otto,

2
7 gün söyle. Bir eklenti / tema yazarı daha büyük veya daha küçük bir şey isterse, onu belirtir. Otomatik yükleme yapmak istiyorlarsa, süre sonu için 0 belirtilmemeliler (= sonsuz), ancak şu anda sahip oldukları süre sonu parametresi, yes / no autoload parametresi olarak çift görevlidir. Her iki durumda da, varsayılan süre sonu ayrıca autoload'a yol açmamalı = varsayılan olarak evet; bu sadece sorun istiyor.
webaware

18

Otto - Sana daha fazla katılmıyorum. Mesele şu ki tüm bu geçici durumlarla birlikte, masanın büyüklüğü saçma. Aşağı yukarı sallamak milyonlarca sıraya ihtiyaç duymaz. Şu anda 130 binin üzerinde satır içeren ve düzenli olarak takılan bir seçenek tablosu ile uğraşıyorum. Değer alanı büyük bir metin türü olduğundan, yalnızca "otomatik yükleme" satırlarını aramak bile performansın kabusu olur. Bu değer alanları, satır verilerinin geri kalanından ayrı olarak depolanır. Mantıksal olarak aynı tablonun bir parçası olmasına rağmen, istediğiniz satırları çekebilmek için birleştirme yapılmalıdır. İhtiyacınız olan veri diskteki her yere yayıldığından sonsuza dek süren birleşimler. Profil oluşturma (mysql için jet profiler kullanarak) bunu kanıtlamıştır.

Kümelenmiş tuşa otomatik yükleme eklemek bu sorunu çözmenize yardımcı olabilir. Örneğin ID ASC olan Autoload Desc'de kümeleme, tüm otomatik yükleme satırlarının ilk önce disk üzerinde bir araya gelmesine izin verecektir. Yine de, DB perspektifinden büyük bir zorlamaya baktığınızı düşünüyorum.

Şahsen ben bu sistemin tasarımının saçma olduğunu düşünüyorum. Seçenekler tablosu, bir çok şey için genel bir sorun haline geldi. Değer alanı, satır verilerinin geri kalanıyla aynı sayfaya dahil edilecek kadar küçükse ve etkili bir şekilde dizine eklenebilirse sorun yoktur. Ne yazık ki durum böyle değil. Bunu kim tasarladıysa, DB101 sınıfına geri dönmesi gerekiyor.


5
doğru, ancak WordPress geliştirmeye başladığında, hiç kimse veri
tabanı

@onetrickpony bu yüzden her zaman vaktinizi alıp doğru olanı yapmak önemlidir, bir gün çok büyük olmasını bekleseniz de olmasın :)
Mahmoud Al-Qudsi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.