Xóa hàng ngàn công việc định kỳ


16

Tôi phát hiện ra rằng tôi có 29.000 công việc định kỳ trong cơ sở dữ liệu WordPress của mình từ các plugin bị vô hiệu hóa và bị xóa. Tôi đã thử một số bổ trợ tối ưu hóa nhưng số lượng lớn công việc định kỳ có nghĩa là tôi không thể xóa chúng bằng các plugin.

Tôi cũng đã thử điều này trong hàm.php của mình nhưng không thành công:

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

Có bất kỳ lệnh SQL nào tôi có thể sử dụng trong phpmyadmin để tìm kiếm bằng cron hook và loại bỏ chúng không?


Tôi đã tìm thấy WP Số lần xóa, sử dụng một cách cẩn thận và đặt tối đa các mục cần xóa cùng một lúc
Zwelly

Câu trả lời:


18

Cảm ơn Privateer đã trả lời nhanh chóng và lời khuyên.

Tôi tìm thấy một cách xung quanh nó trước khi tôi thấy câu trả lời của bạn. Đây là một phương pháp từng bước để xóa hàng ngàn công việc cũ và có thể được sử dụng cho người khác.

Tôi đã đăng nhập vào phpMyAdmin. Tôi đã nhấp vào cơ sở dữ liệu của mình và sau đó là tab 'tìm kiếm'. Tôi đã nhập 'cron' rồi chọn 'tất cả các bảng' và nhấp vào 'Đi'. Tôi cuộn danh sách kết quả tìm kiếm xuống bảng wp_options của mình. Tôi bấm vào 'Duyệt'. Đứng đầu danh sách là tùy chọn 'cron'. Tôi đã nhấp vào 'Chỉnh sửa' rồi đợi trang tải. Tôi bấm vào ô hiển thị danh sách các công việc định kỳ. Danh sách cron quá dài đến nỗi mất khoảng 80 giây để con trỏ của tôi phản hồi. Sau đó, tôi đã sử dụng Ctrl-A trên bàn phím để chọn tất cả trước khi nhấn nút xóa. Mất khoảng 2 phút trước khi trình duyệt của tôi hoàn thành việc xóa (hết thời gian sử dụng chrome nên tôi đã thử Firefox hoạt động).

Sau một vài phút, các công việc định kỳ cho các plugin đang hoạt động hiện tại của tôi đã điền lại danh sách. Có 9 công việc định kỳ (giảm từ hơn 29.000!). Sáu năm làm việc cron trùng lặp từ các plugin bị mã hóa kém, một số trong đó tôi chỉ cài đặt trong một ngày để thử. Ngoài ra hàng trăm từ các plugin phổ biến như Wordfence, BackupBuddy, Nextgen Gallery và AutoOptimizer - tất cả những thứ mà tôi đã gỡ cài đặt trong quá khứ. Trang web của tôi bây giờ tải như thể nó đã được sạc. Khu vực quản trị nhanh hơn nhiều. Lỗi hết thời gian quản trị đã biến mất. Tôi đã dành rất nhiều thời gian để tối ưu hóa trang web của mình để cố gắng giảm thời gian tải. Tôi thậm chí đã chuyển máy chủ và nâng cấp kế hoạch lưu trữ của tôi. Không có gì làm tăng tốc độ trang web của tôi như xóa tất cả các công việc định kỳ lỗi thời. Thời gian tải xuống điện thoại di động giảm từ 20 giây xuống còn 6 giây.

Trong quá trình tìm kiếm giải pháp, tôi tìm thấy rất ít thông tin về ảnh hưởng của công việc định kỳ đối với hiệu suất trang web. Nhiều người nói rằng nó đã tạo ra một chút khác biệt và đối với một số ít công việc định kỳ là sự thật. Nhưng nhiều năm trong cuộc đời của một trang web WordPress, tôi tự hỏi có bao nhiêu người bị cồng kềnh với hàng trăm nếu không phải là hàng ngàn công việc cũ từ các plugin đã bị xóa. Thay vì yêu cầu người dùng kiểm tra giới hạn bộ nhớ php của họ, tôi sẽ đề nghị các nhà phát triển trước tiên yêu cầu người dùng kiểm tra số lượng công việc cron trong wp_options khi giải quyết vấn đề lỗi bộ nhớ nghiêm trọng. Bạn có thể ngạc nhiên / sốc trước những gì bạn tìm thấy! :-)


1
Tôi tìm thấy vấn đề tương tự. Bây giờ tôi không có bao nhiêu công việc định kỳ mà tôi có, nhưng cơ sở dữ liệu khoảng 15 Mb. Sau khi xóa khu vực quản trị, thời gian tải giảm xuống từ 5-7 đến 0,3 giây. Thời gian tải frontend giảm từ 2 xuống 0,4 giây.
Alexey

1
Chết tiệt! Giải pháp này đã cứu chúng tôi! có 35000 công việc định kỳ trong bảng này. bây giờ có vẻ như tăng áp như mô tả.
Riccardo

Rất tốt để biết thực sự vì tôi đã suy nghĩ để cài đặt một trong những plugin được đề cập cho một khách hàng. Vì vậy, bây giờ tôi biết những gì cần chú ý khi hiệu suất chậm dần.
lowTechsun

10

Thử

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

Nếu bạn tìm thấy nó, bạn có thể thử:

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

Bạn có thể cần phải xóa tùy chọn cron hoặc đặt giá trị thành một mảng nối tiếp trống.

Sử dụng update_option sẽ an toàn hơn vì tôi không chắc chắn về việc giá trị sẽ là một mảng trống được tuần tự hóa hay một chuỗi trống. Bạn có thể kiểm tra wp-gộp / tùy chọn.php mặc dù ... nhưng sử dụng update_option sẽ xử lý đúng cách mà không phải lo lắng về cơ sở dữ liệu.


7

Các sự kiện cron Wordpress cũng có thể bị xóa khỏi dòng lệnh, sử dụng WP-CLI :

wp cron event list
wp cron event delete your_example_event

Thêm chi tiết trong các tài liệu wp-cli .


3
Hoặc xóa tất cả các sự kiệnwp option delete cron
Samuel Elh

1
wp option delete cronhoạt động khi có hàng ngàn công việc định kỳ nhồi trong các tùy chọn. Những công việc tồi tệ này chủ yếu đến từ các plugin xấu, thực hiện sai cách.
Swashata Ghosh

6

Một giải pháp thậm chí đơn giản hơn là gọi delete_option( 'cron' );một lần trong một số plugin. Tất cả các công việc định kỳ được thêm tự động sẽ được thêm lại vào lần truy cập / yêu cầu tiếp theo của trang web của bạn.

Là một plugin (mu) trường hợp chỉ chạy bất cứ khi nào bạn kích hoạt nó:

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

Cảm ơn kaiser! Đối với những người không thoải mái với việc tạo / chỉnh sửa plugin (thật đơn giản!), Bạn có thể sử dụng những gì kaiser đã lưu ý trong tệp tin.php của bạn. Chỉ cần thêm nó, lưu nó, tải trang web của bạn, sau đó xóa nó và lưu lại.
Cá nhân

Còn những công việc cron đã được tạo khi kích hoạt plugin thì sao? Các công việc định kỳ này sẽ không được tạo lại cho đến khi bạn hủy và kích hoạt lại plugin.
alpipego 15/03/2016

Chà, điều đó không thể xảy ra theo mặc định , không phải với điều này cũng như với các câu hỏi khác. Những gì bạn sẽ phải làm là hủy kích hoạt lại các plugin đó (~ 3 phút làm việc) hoặc - trong trường hợp bạn đang tìm kiếm một câu trả lời tự động - tìm kiếm các chức năng trong các plugin đó và kích hoạt chúng từ trong plugin của bạn.
kaiser

1

Trong trường hợp ai đó muốn xóa tên cron cụ thể (giả sử 'CRON_NAME'), giải pháp này hiệu quả với tôi:

    $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

Tôi đã có một năm với đầy đủ các công việc định kỳ đang chờ xử lý, khoảng 5 Mb dữ liệu cho mục nhập cơ sở dữ liệu này. Đã xóa các công việc cron từ cơ sở dữ liệu. Công việc cron bị vô hiệu hóa trong wp-config.php

Thiết lập một công việc cron thủ công trong cpanel. Bây giờ trang web của tôi là bay theo nghĩa đen. Tôi đã nâng cấp máy chủ, mua thêm CPU / RAM, nhưng tất cả đều lãng phí tiền bạc và thời gian.

Để xóa tất cả các công việc cron đang chờ xử lý, hãy chạy truy vấn này trong phpmyadmin> Chạy truy vấn:

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

Cảm ơn rất nhiều Pádraig Ó Beirn.


Bạn được chào đón Preetinder! Tôi rất vui vì nó đã được giúp đỡ. Cảm ơn các mẹo về công việc cron đang chờ xử lý là tốt.
Pádraig Ó Beirn

0

Nếu bạn xóa các tác vụ cron theo cách này và bạn sử dụng UpdraftPlus, bạn sẽ cần lưu lại cài đặt của mình để tạo lại các tác vụ cron. Cho đến khi bạn làm điều này, sao lưu tự động của bạn sẽ không chạy (nhưng sao lưu thủ công sẽ).

Các cài đặt sẽ vẫn ở đó và bạn không cần chỉnh sửa gì cả. Chỉ cần chuyển đến [Menu trên cùng của UpdraftPlus] -> Cài đặt và cuộn xuống phía dưới và nhấp vào "Lưu thay đổi".


0

Tôi đến đây vì số lượng sm_pingcronjobs rất lớn wp_options. Nếu đó là vấn đề của bạn, bạn có thể thử như sau:

Đặt cái này trong Hàm.php (chủ đề con) nếu bạn không có quyền truy cập vào phpmyadmin, đặc biệt nếu trang web của bạn bị đầy ắp với ping cronjobs (sm_ping):

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

0

Tôi gặp phải một vấn đề tương tự, vì một trong những lỗi mã hóa của riêng tôi, hàng ngàn bản sao của một công việc định kỳ cụ thể đã được thêm vào một trang web. Hàm wp_clear_schediated_hook đã hết thời gian và không thành công. Tôi đã xử lý nó với một tập lệnh bỏ đặt tất cả các phiên bản của hàm cron trong mảng và sau đó thêm mảng được lọc làm tùy chọn cron mới trong bảng tùy chọn. Xem bên dưới.

Bằng cách này, tôi tránh được việc thổi bay các công việc định kỳ mong muốn được thêm vào trang web.

Điều này có thể được sửa đổi như là một chức năng cần một mảng các tay cầm để loại bỏ hoặc một mảng các tay cầm được bảo tồn.

$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ôi có một cách rất đơn giản để xóa tất cả các sự kiện cron. Trước đây, bạn cần DISABLE WP Cron trong wp-config Sau đó, bạn cài đặt Plugin WP Control Sau đó, Chuyển đến menu Tool> Sự kiện Cron> Nhấp vào chọn tất cả> Xóa tất cả chúng. Bạn có thể thử nó Cảm ơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.