Binlerce cron işini sil


16

WordPress veritabanımda devre dışı bırakılan ve silinen eklentilerden 29.000 cron işim olduğunu keşfettim. Bir dizi optimizasyon eklentisi denedim ama çok sayıda cron işi eklentileri kullanarak bunları silemediğim anlamına geliyor.

Ben de bunu benim fonksiyonları.php başarılı olmadan denedim:

add_action("init", "clear_crons_left");
function clear_crons_left() {
    wp_clear_scheduled_hook("cron_name");
}

Phpmyadmin cron kanca ile aramak ve kaldırmak için kullanabileceğiniz herhangi bir SQL komutu var mı?


WP Toplu silme buldum, dikkatli kullanın ve bir kerede silmek için maksimum öğe koydum
Zwelly

Yanıtlar:


18

Hemen cevap ve tavsiye için Privateer teşekkürler.

Cevabınızı görmeden önce bir yol buldum. İşte binlerce eski cron işini silmek için adım adım bir yöntem ve başka biri için yararlı olabilir.

PhpMyAdmin'de oturum açtım. Veritabanımı ve ardından 'arama' sekmesini tıkladım. 'Cron' yazıp 'tüm tabloları' seçtim ve 'Git'i tıkladım. Arama sonuçları listesini wp_options tabloma kaydırdım. 'Gözat'ı tıkladım. Listenin başında option_name 'cron' vardı. 'Düzenle'yi tıkladıktan sonra sayfanın yüklenmesini bekledim. Cron işleri listesini gösteren kutuyu tıkladım. Cron listesi o kadar uzundu ki imlecimin yanıt vermesi yaklaşık 80 saniye sürdü. Daha sonra, sil düğmesine basmadan önce tümünü seçmek için klavyede Ctrl-A kullandım. Tarayıcımın silinmesini tamamlaması yaklaşık 2 dakika sürdü (krom zaman aşımına uğradı, bu yüzden çalışan Firefox'u denedim).

Birkaç dakika sonra geçerli aktif eklentilerimin cron işleri listeyi yeniden doldurdu. 9 cron işi vardı (29.000'den aşağı!). Kötü kodlanmış eklentilerden altı yıl yinelenen cron işleri, bazıları denemek için bir günlüğüne kurdum. Ayrıca Wordfence, BackupBuddy, Nextgen Gallery ve AutoOptimizer gibi yaygın eklentilerden yüzlerce geçmişti. Sitem artık turbo şarjlı gibi yükleniyor. Yönetici alanı çok daha hızlı. Yönetici zaman aşımı hataları kayboldu. Yükleme süresini kısaltmaya çalışarak web sitemi optimize etmeye çok zaman harcadım. Hatta ana bilgisayarlar taşındı ve hosting planlarımı yükselttim. Hiçbir şey, eski moda cron işlerini silmek gibi sitemin hızını arttırmadı. Mobil indirme süresi 20 saniyeden 6 saniyeye düşürüldü.

Bir çözüm arayışımda, cron işlerinin web sitesi performansı üzerindeki etkisi hakkında çok az bilgi buldum. Birçoğu bunun çok az fark yarattığını ve az sayıda cron işi için doğru olduğunu söyledi. Ancak bir WordPress sitesinin hayatına yıllarca, silinmiş eklentilerden binlerce eski cron işi olmasa da kaç kişinin yüzlerce şişirildiğini merak ediyorum. Kullanıcılardan php bellek sınırlarını kontrol etmelerini istemek yerine, geliştiricilerin öncelikle problem çözmede ölümcül bellek hataları olduğunda wp_options içindeki cron işlerinin sayısını kontrol etmelerini istersiniz. Bulduğunuz şeyde şaşırabilirsiniz / şok olabilirsiniz! :-)


1
Aynı problemi buldum. Artık ne kadar cron işim olduğunu bilmiyorum, ama veritabanında 15 Mb civarındaydı. Silme işleminden sonra yönetim alanı yükleme süresi 5-7'den 0.3 saniyeye düşürüldü. Ön uç yükleme süresi 2'den 0,4 saniyeye düşürüldü.
Alexey

1
lanet olsun! bu çözüm bizi kurtardı! bu masada 35000 cron işi vardı. şimdi tarif edildiği gibi turboşarjlı gibi görünüyor.
Riccardo

Bir istemci için bahsedilen eklentilerden birini kurmayı düşündüğüm için gerçekten bilmek çok iyi. Şimdi performans yavaşça kötüleştiğinde nelere dikkat edeceğimizi biliyorum.
lowtechsun

10

Deneyin

SELECT * FROM `wp_options` WHERE option_name = 'cron'

Eğer bulursanız deneyebilirsiniz:

  • SQL'de: UPDATE wp_options SET option_value = '' WHERE option_name = 'cron'
  • WordPress'te: update_option('cron', '');

Cron seçeneğini silmeniz veya değeri boş bir serileştirilmiş diziye ayarlamanız gerekebilir.

Değerin serileştirilmiş boş bir dizi mi yoksa boş bir dize mi olacağından emin olmadığım için update_option kullanmak daha güvenli olurdu. Yine de wp-include / options.php giriş yapabilirsiniz ... ama update_option kullanmak veritabanı hakkında endişelenmeden düzgün işlemek olacaktır.


7

Wordpress cron olayları da WP-CLI kullanılarak komut satırından silinebilir :

wp cron event list
wp cron event delete your_example_event

Wp-cli belgelerinde daha fazla ayrıntı .


3
Veya tüm etkinlikleri silinwp option delete cron
Samuel Elh

1
wp option delete cronseçeneklerde doldurulmuş binlerce cron işi olduğunda çalışır. Bu kötü işler çoğunlukla kötü eklentilerden gelir ve cron'u yanlış yapar.
Swashata Ghosh

6

Daha da basit bir çözüm, delete_option( 'cron' );bazı eklentilerde bir kez aramaktır. Otomatik olarak eklenen tüm cron işleri, sitenizin bir sonraki ziyaretinde / isteğinde tekrar eklenir.

Yalnızca her etkinleştirdiğinizde çalışan bir vaka (mu) eklentisi olarak:

<?php
/** Plugin Name: Clean Cron */
register_activation_hook( __FILE__, function()
{
    delete_option( 'cron' );
} );

Teşekkürler kaiser! Eklentileri oluşturma / düzenleme konusunda rahat olmayanlar için (basit!), Function.php dosyanızda belirtilen kaiser'i kullanabilirsiniz. Sadece ekleyin, kaydedin, sitenizi yükleyin, ardından kaldırın ve tekrar kaydedin.
Özel

Eklenti aktivasyonunda yaratılan cron işleri ne olacak? Bu cron işleri, eklentiyi kaldırıp yeniden etkinleştirene kadar yeniden oluşturulmaz.
alpipego

Peki, bu varsayılan olarak mümkün değildir , ne bu ne de diğer sorularla. Yapmanız gereken, bu eklentileri (~ 3 dakika çalışma) kaldırmak ve yeniden etkinleştirmek ya da - otomatik bir yanıt arıyorsanız - bu eklentilerdeki işlevleri aramak ve eklentinizden onları tetiklemektir.
kaiser

1

Birisi belirli bir cron adını silmek isterse ('CRON_NAME' deyin), bu çözüm benim için çalıştı:

    $crons = _get_cron_array();
    //echo "Found total ".count($crons)."<br />";
    //Keep only the ones that don't match the cron name
    $updated = array_filter($crons, function($v){return !array_key_exists("CRON_NAME",$v);});
    //echo "Reduced to ".count($updated)."<br />";        
    _set_cron_array($updated);

1

Bekleyen cron işleri, bu tek veritabanı girişi için yaklaşık 5 Mb veri dolu bir yıl vardı. Cron işlerini veritabanından sildi. Wp-config.php dosyasında devre dışı bırakılmış cron işleri

Cpanel'de manuel bir cron işi oluşturun. Şimdi sitem tam anlamıyla uçuyor. Sunucuları yükseltiyordum, daha fazla CPU / RAM satın alıyordum, ama hepsi para ve zaman kaybıydı.

Bekleyen tüm cron işlerini silmek için bu sorguyu phpmyadmin> Sorguyu çalıştır'da çalıştırın:

UPDATE wp_options SET option_value = '' WHERE option_name = 'cron'

Çok teşekkürler Pádraig Ó Beyrut.


Bir şey değil. Yardım etmekten çok memnunum. Bekleyen cron işleri için ipucu için teşekkürler.
Pádraig Ó Beyrut

0

Cron görevlerinizi bu şekilde temizlerseniz ve UpdraftPlus kullanıyorsanız, cron görevlerini yeniden oluşturmak için ayarlarınızı yeniden kaydetmeniz gerekir. Bunu yapana kadar otomatik yedeklemeleriniz çalışmaz (ancak manuel yedeklemeler).

Ayarlar hala orada olacaktır ve hiçbir şeyi düzenlemenize gerek yoktur. [UpdraftPlus üst menüsü] -> Ayarlar'a gidin ve aşağı kaydırın ve "Değişiklikleri Kaydet" i tıklayın.


0

Buraya çok miktarda sm_pingcronjobs yüzünden geldim wp_options. Sorununuz buysa, aşağıdakileri deneyebilirsiniz:

Phpmyadmin'e erişiminiz yoksa, özellikle siteniz ping cronjobs (sm_ping) ile şişirilmişse, function.php (child theme) içine koyun.

if (isset($_GET['doing_wp_cron'])) {
remove_action('do_pings', 'do_all_pings');
wp_clear_scheduled_hook('do_pings');
}

0

Benzer bir sorunla karşılaştım, burada kendi kodlama hatalarımdan biri nedeniyle, belirli bir cron işinin binlerce kopyası bir siteye eklenmişti. Wp_clear_scheduled_hook işlevi zaman aşımına uğradı ve başarısız oldu. Ben dizi içinde cron işlevinin tüm örneklerini unset bir komut dosyası ile etrafında var ve sonra seçenekler tablosunda yeni cron seçeneği olarak filtre dizisi ekler. Aşağıya bakınız.

Bu şekilde, daha önce siteye eklenen arzu edilen cron işlerini havaya uçurmaktan kaçındım.

Bu, elimine edilecek bir dizi tutamacı veya korunacak bir tutamaç dizisini alan bir işlev olarak değiştirilebilir.

$crons = _get_cron_array();
    $hook = 'tj_flush_w3tc_cache';
    foreach ( $crons as $timestamp => $cron ) {
    if ( isset( $cron[ $hook ] ) ) {
        unset($cron[$hook]);
    }
    if(!empty($cron))
        $newcron[$timestamp] = $cron;       
    }
    update_option('cron',$newcron);

0

Tüm cron olaylarını silmek için çok basit bir yolum var. Önce, wp-config'te WP Cron'u DEVRE DIŞI BIRAKMALISINIZ Sonra, Eklenti WP Denetimi'ni yükledikten sonra, Araç menüsüne taşı> Cron olayları> Tümünü seç'i tıklayın> Tümünü sil'i tıklayın. Deneyebilir misin? Teşekkürler.

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.