Hapus ribuan pekerjaan cron

16

Saya menemukan bahwa saya memiliki 29.000 pekerjaan cron di database WordPress saya dari plugin yang dinonaktifkan dan dihapus. Saya telah mencoba sejumlah plugin pengoptimal tetapi sejumlah besar pekerjaan cron berarti saya tidak dapat menghapusnya menggunakan plugin.

Saya juga mencoba ini di functions.php saya tidak berhasil:

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

Apakah ada perintah SQL yang dapat saya gunakan di phpmyadmin untuk mencari dengan cron hook dan menghapusnya?

Pádraig Ó Beirn
sumber
Saya menemukan WP Massal hapus, gunakan dengan hati-hati dan maks item untuk menghapus sekaligus
Zwelly

Jawaban:

18

Terima kasih Privateer atas balasan dan saran yang cepat.

Saya menemukan jalan keluar sebelum saya melihat jawaban Anda. Berikut adalah metode langkah demi langkah untuk menghapus ribuan pekerjaan cron lama dan mungkin berguna bagi orang lain.

Saya masuk ke phpMyAdmin. Saya mengklik database saya dan kemudian tab 'cari'. Saya mengetik 'cron' lalu memilih 'semua tabel' dan mengklik 'Pergi'. Saya menggulir ke bawah daftar hasil pencarian ke tabel wp_options saya. Saya mengklik 'Jelajah'. Di bagian atas daftar adalah option_name 'cron'. Saya mengklik 'Edit' lalu menunggu halaman memuat. Saya mengklik kotak yang menunjukkan daftar pekerjaan cron. Daftar cron sangat panjang sehingga butuh sekitar 80 detik untuk merespon kursor saya. Saya kemudian menggunakan Ctrl-A pada keyboard untuk memilih semua sebelum menekan tombol hapus. Butuh sekitar 2 menit sebelum browser saya menyelesaikan penghapusan (chrome timed-out jadi saya mencoba Firefox yang berfungsi).

Setelah beberapa menit, tugas cron untuk plugin aktif saya saat ini mengisi kembali daftar. Ada 9 pekerjaan cron (turun dari lebih dari 29.000!). Enam tahun pekerjaan duplikat cron dari plugin yang kodenya jelek, beberapa di antaranya baru saya instal selama sehari untuk mencobanya. Juga ratusan dari plugin umum seperti Wordfence, BackupBuddy, Nextgen Gallery, dan AutoOptimizer - yang semuanya telah saya hapus di masa lalu. Situs saya sekarang memuat seolah-olah sudah diisi turbo. Area admin jauh lebih cepat. Kesalahan batas waktu admin telah hilang. Saya telah menghabiskan banyak waktu untuk mengoptimalkan situs web saya mencoba untuk mengurangi waktu buka. Saya bahkan memindahkan host dan meningkatkan paket hosting saya. Tidak ada yang meningkatkan kecepatan situs saya seperti menghapus semua pekerjaan cron yang sudah ketinggalan zaman. Waktu unduhan seluler berkurang dari 20 detik menjadi 6 detik.

Dalam pencarian saya untuk solusi, saya menemukan sangat sedikit informasi tentang pengaruh pekerjaan cron pada kinerja situs web. Banyak yang mengatakan itu membuat sedikit perbedaan dan untuk sejumlah kecil pekerjaan cron itu benar. Tapi bertahun-tahun dalam kehidupan situs WordPress saya bertanya-tanya berapa banyak yang membengkak dengan ratusan bahkan ribuan pekerjaan cron lama dari plugin yang dihapus. Alih-alih meminta pengguna untuk memeriksa batas memori php mereka, saya menyarankan agar pengembang terlebih dahulu meminta pengguna untuk memeriksa jumlah pekerjaan cron di wp_options ketika pemecahan masalah kesalahan memori fatal. Anda mungkin terkejut / terkejut dengan apa yang Anda temukan! :-)

Pádraig Ó Beirn
sumber
1
Saya menemukan masalah yang sama. Saya tidak tahu berapa banyak pekerjaan cron yang saya miliki, tapi itu sekitar 15 Mb dalam database. Setelah penghapusan admin area waktu menurun dari 5-7 menjadi 0,3 detik. Waktu muat frontend berkurang dari 2 menjadi 0,4 detik.
Alexey
1
sial! solusi ini menyelamatkan kita! memiliki 35000 cron job di tabel ini. sekarang sepertinya turbocharged seperti yang dijelaskan.
Riccardo
Sangat bagus untuk diketahui karena saya berpikir untuk menginstal salah satu plugin yang disebutkan untuk klien. Jadi sekarang saya tahu apa yang harus diwaspadai ketika kinerja perlahan memburuk.
lowtechsun
10

Mencoba

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

Jika Anda menemukannya, Anda dapat mencoba:

  • Dalam SQL: UPDATE wp_options SET option_value = '' WHERE option_name = 'cron'
  • Di wordpress: update_option('cron', '');

Anda mungkin perlu menghapus opsi cron atau mengatur nilainya ke array serial kosong.

Menggunakan update_option akan lebih aman karena saya tidak yakin apakah nilainya harus berupa array kosong serial atau string kosong. Anda dapat memeriksa di wp-include / options.php ... tetapi menggunakan update_option akan menanganinya dengan benar tanpa khawatir tentang database.

Privateer
sumber
7

Peristiwa cron Wordpress juga dapat dihapus dari baris perintah, menggunakan WP-CLI :

wp cron event list
wp cron event delete your_example_event

Lebih detail dalam dokumen wp-cli .

Paul Wenzel
sumber
3
Atau hapus semua acarawp option delete cron
Samuel Elh
1
wp option delete cronberfungsi ketika ada ribuan pekerjaan cron yang diisi dalam opsi. Pekerjaan buruk ini sebagian besar berasal dari plugin yang buruk, melakukan cron dengan cara yang salah.
Swashata Ghosh
6

Solusi yang lebih sederhana adalah dengan memanggil delete_option( 'cron' );sekali di beberapa plugin. Semua pekerjaan cron yang ditambahkan secara otomatis akan ditambahkan lagi pada kunjungan / permintaan situs Anda berikutnya.

Sebagai plugin satu kasus (mu) yang hanya berjalan setiap kali Anda mengaktifkannya:

<?php
/** Plugin Name: Clean Cron */
register_activation_hook( __FILE__, function()
{
    delete_option( 'cron' );
} );
kaisar
sumber
Terima kasih kaiser! Bagi mereka yang tidak nyaman dengan membuat / mengedit plugin (itu sederhana!), Anda dapat menggunakan apa yang dicatat kaiser dalam file functions.php Anda. Cukup tambahkan, simpan, muat situs Anda, lalu hapus dan simpan lagi.
Privateer
Bagaimana dengan pekerjaan cron yang telah dibuat pada aktivasi plugin? Pekerjaan cron ini tidak akan dibuat kembali sampai Anda menonaktifkan dan mengaktifkan kembali plugin.
alpipego
Yah, itu tidak mungkin per default , baik dengan ini atau dengan pertanyaan lain. Yang harus Anda lakukan adalah menghapus dan mengaktifkan kembali plugin tersebut (~ 3 menit kerja), atau - jika Anda mencari jawaban otomatis - cari fungsi-fungsi pada plugin tersebut dan picu dari dalam plugin Anda.
kaiser
1

Jika seseorang ingin menghapus nama cron tertentu (katakan 'CRON_NAME'), solusi ini bekerja untuk saya:

    $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);
Indivision Dev
sumber
1

Saya memiliki satu tahun penuh dengan pekerjaan cron yang tertunda, sekitar 5 Mb data untuk entri basis data tunggal ini. Menghapus tugas cron dari database. Pekerjaan cron yang dinonaktifkan di wp-config.php

Mengatur pekerjaan cron manual di cpanel. Sekarang situs saya benar-benar terbang. Saya telah memutakhirkan server, membeli lebih banyak CPU / RAM, tetapi semua hanya membuang-buang uang dan waktu.

Untuk menghapus semua pekerjaan cron yang tertunda jalankan kueri ini di phpmyadmin> Jalankan kueri:

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

Terima kasih banyak, Pádraig Ó Beirn.

Preetinder Singh
sumber
Terima kasih, Preetinder! Saya senang itu bisa membantu. Terima kasih atas tip tentang pekerjaan cron yang tertunda juga.
Pádraig Ó Beirn
0

Jika Anda menghapus tugas cron Anda dengan cara ini dan Anda menggunakan UpdraftPlus, Anda perlu menyimpan kembali pengaturan Anda untuk membuat ulang tugas cron. Sampai Anda melakukan ini, cadangan otomatis Anda tidak akan berjalan (tetapi cadangan manual akan).

Pengaturan akan tetap ada di sana, dan Anda tidak perlu mengedit apa pun. Cukup buka [menu teratas UpdraftPlus] -> Pengaturan, dan gulir ke bawah ke bawah dan klik "Simpan Perubahan".

Rebecca
sumber
0

Saya tiba di sini karena sejumlah besar sm_pingcronjobs masukwp_options . Jika itu masalah Anda, Anda bisa mencoba yang berikut:

Masukkan ini di functions.php (tema anak) jika Anda tidak memiliki akses ke phpmyadmin, terutama jika situs Anda dibengkak dengan ping cronjobs (sm_ping):

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

Saya mengalami masalah serupa, di mana karena salah satu kesalahan pengkodean saya sendiri, ribuan salinan dari satu pekerjaan cron tertentu telah ditambahkan ke situs. Fungsi wp_clear_scheduled_hook tampaknya time out dan gagal. Saya menyiasatinya dengan skrip yang menghapus semua contoh fungsi cron di dalam array dan kemudian menambahkan array yang difilter sebagai opsi cron baru di tabel opsi. Lihat di bawah.

Dengan cara ini, saya menghindari meniup pekerjaan cron yang diinginkan yang sebelumnya ditambahkan ke situs.

Ini dapat dimodifikasi sebagai fungsi yang mengambil array pegangan untuk menghilangkan atau array pegangan untuk dilestarikan.

$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);
David F. Carr
sumber
0

Saya memiliki cara yang sangat sederhana untuk menghapus semua acara cron. Sebelumnya, Anda perlu MENONAKTIFKAN WP Cron di wp-config Kemudian, Anda menginstal Plugin WP Control Kemudian, Pindah ke menu Alat> Acara Cron> Klik pilih semua> Hapus semua. Bisakah Anda mencobanya. Terima kasih.

Berangin
sumber