Làm thế nào để chạy một chức năng cứ sau 5 phút?


14

Tôi có một chức năng để được chạy cứ sau 5 phút. Tôi đã giới thiệu sau đây từ codex:

<?php wp_schedule_event(time(), 'hourly', 'my_schedule_hook', $args); ?> 

Tôi muốn chạy chức năng này cứ sau 5 phút bất kể khi nào bắt đầu. Làm thế nào tôi có thể này?

Ngoài ra, nó nói codex cho biết cron sẽ được chạy khi khách truy cập truy cập vào trang web. Có cách nào để chạy cron như mỗi phút và không chờ đợi một chuyến thăm?

giả sử các chức năng sau đây cần được chạy mỗi 5 phút sau đó làm thế nào tôi có thể làm điều đó bằng wp_schedule_event()hoặc wp_cron?

function run_evry_five_minutes(){
    // codes go here
}

Tốt hơn hết, bạn nên xem xét các dịch vụ cron Linux hoặc cron của bên thứ 3 nếu bạn cần một khoảng thời gian ngắn và chính xác như vậy,
birgire

trang web có lưu lượng truy cập lớn .. vì vậy không cần phải xem xét khoảng thời gian .. chắc chắn nó sẽ được kích hoạt cứ sau 2 hoặc 3 phút .. khách hàng thích làm điều đó từfunctions.php
Foderish Coder

không thể kích hoạt tệp php mà không có thứ gì chạy trên máy chủ với bộ hẹn giờ.
Andrew Welch

tập tin? chúng ta đang nói về một chức năng trong
hàm.php

Bạn có nghĩ rằng một dịch vụ giám sát miễn phí có thể là ping kích hoạt CRON không? newrelic.com/server-monitoring
jgraup

Câu trả lời:


27

Bạn có thể tạo thời gian lịch biểu mới thông qua cron_schedules:

function my_cron_schedules($schedules){
    if(!isset($schedules["5min"])){
        $schedules["5min"] = array(
            'interval' => 5*60,
            'display' => __('Once every 5 minutes'));
    }
    if(!isset($schedules["30min"])){
        $schedules["30min"] = array(
            'interval' => 30*60,
            'display' => __('Once every 30 minutes'));
    }
    return $schedules;
}
add_filter('cron_schedules','my_cron_schedules');

Bây giờ bạn có thể lên lịch cho chức năng của mình:

wp_schedule_event(time(), '5min', 'my_schedule_hook', $args);

Để chỉ lên lịch một lần, hãy bọc nó trong một chức năng và kiểm tra trước khi chạy nó:

$args = array(false);
function schedule_my_cron(){
    wp_schedule_event(time(), '5min', 'my_schedule_hook', $args);
}
if(!wp_next_scheduled('my_schedule_hook',$args)){
    add_action('init', 'schedule_my_cron');
}

Lưu ý tham số $ args! Không chỉ định tham số $ args trong wp_next_schediated, nhưng việc có $ args cho wp_schedule_event, sẽ khiến một số lượng gần như vô hạn của cùng một sự kiện được lên lịch (thay vì chỉ một).

Cuối cùng, tạo chức năng thực tế mà bạn muốn chạy:

function my_schedule_hook(){
    // codes go here
}

Tôi nghĩ điều quan trọng là phải đề cập rằng wp-cron đang kiểm tra lịch trình và chạy các công việc theo lịch trình mỗi khi một trang được tải.

Vì vậy, nếu bạn có một trang web có lưu lượng truy cập thấp chỉ có 1 khách truy cập một giờ, wp-cron sẽ chỉ chạy khi khách truy cập đó duyệt trang web của bạn (mỗi giờ một lần). Nếu bạn có một trang web có lưu lượng truy cập cao với khách truy cập yêu cầu một trang mỗi giây, wp-cron sẽ được kích hoạt mỗi giây gây thêm tải cho máy chủ.

Giải pháp là hủy kích hoạt wp-cron và kích hoạt nó thông qua một công việc cron thực trong khoảng thời gian bạn lặp lại nhanh nhất công việc wp-cron theo lịch trình (5 phút trong trường hợp của bạn).

Lucas Rolff giải thích vấn đề và đưa ra giải pháp chi tiết.

Cách khác, bạn có thể sử dụng dịch vụ bên thứ 3 miễn phí như UptimeRobot để truy vấn trang web của mình (và kích hoạt wp-cron) cứ sau 5 phút, nếu bạn không muốn hủy kích hoạt wp-cron và kích hoạt nó thông qua công việc định kỳ thực.


2

Nếu trang web của bạn nhận được lưu lượng truy cập lớn thì bạn có thể thử sử dụng set_transient()để chạy nó (rất xấp xỉ) cứ sau 5 phút, ví dụ:

function run_every_five_minutes() {
    // Could probably do with some logic here to stop it running if just after running.
    // codes go here
}

if ( ! get_transient( 'every_5_minutes' ) ) {
    set_transient( 'every_5_minutes', true, 5 * MINUTE_IN_SECONDS );
    run_every_five_minutes();

    // It's better use a hook to call a function in the plugin/theme
    //add_action( 'init', 'run_every_five_minutes' );
}

Chà, ừ, ừ?! ...
bonger

yeah., nó không làm việc .. Tôi đã sử dụng đoạn mã sau trong functions.phpkhi một lần làm cho trang, một bản cập nhật sẽ được thực hiện cho một bảng trong cơ sở dữ liệu của tôi .. function run_evry_five_minutes() { $homepage = file_get_contents('link to visit'); echo $homepage; }. Nhưng bảng DB không được cập nhật sau 6 phút.
ngu ngốc

Không biết tại sao nó không hiệu quả với bạn nhưng thực sự nghĩ về việc nó chỉ sử dụng get_transient()/ set_transient()không có công cụ định kỳ sẽ có ý nghĩa hơn nhiều, đơn giản hơn nhiều, sẽ cập nhật câu trả lời ...
bonger

@bonger đây có phải là sự thay thế tốt cho wp_schedule_event () không?
Marko Kunic

@ MarkoKunić Đừng biết thành thật, bạn đã không thử nó ... nó chỉ được cung cấp như một cách giải quyết nhưng nếu bạn thử thì hãy cho chúng tôi biết ...! (Câu trả lời của Johano Fierra có vẻ tốt wordpress.stackexchange.com/a/216121/57034 )
bonger

2

Bạn có thể kích hoạt nó trong kích hoạt plugin thay vì trên mỗi cuộc gọi plugin:

//Add a utility function to handle logs more nicely.
if ( ! function_exists('write_log')) {
    function write_log ( $log )  {
        if ( is_array( $log ) || is_object( $log ) ) {
            error_log( print_r( $log, true ) );
        } else {
            error_log( $log );
        }
    }
}

/**
 * Do not let plugin be accessed directly
 **/
if ( ! defined( 'ABSPATH' ) ) {
    write_log( "Plugin should not be accessed directly!" );
    exit; // Exit if accessed directly
}

/**
 * -----------------------------------------------------------------------------------------------------------
 * Do not forget to trigger a system call to wp-cron page at least each 30mn.
 * Otherwise we cannot be sure that trigger will be called.
 * -----------------------------------------------------------------------------------------------------------
 * Linux command:
 * crontab -e
 * 30 * * * * wget http://<url>/wp-cron.php
 */

/**
 * Add a custom schedule to wp.
 * @param $schedules array The  existing schedules
 *
 * @return mixed The existing + new schedules.
 */
function woocsp_schedules( $schedules ) {
    write_log("Creating custom schedule.");
    if ( ! isset( $schedules["10s"] ) ) {
        $schedules["10s"] = array(
            'interval' => 10,
            'display'  => __( 'Once every 10 seconds' )
        );
    }

    write_log("Custom schedule created.");
    return $schedules;
}

//Add cron schedules filter with upper defined schedule.
add_filter( 'cron_schedules', 'woocsp_schedules' );

//Custom function to be called on schedule triggered.
function scheduleTriggered() {
    write_log( "Scheduler triggered!" );
}
add_action( 'woocsp_cron_delivery', 'scheduleTriggered' );

// Register an activation hook to perform operation only on plugin activation
register_activation_hook(__FILE__, 'woocsp_activation');
function woocsp_activation() {
    write_log("Plugin activating.");

    //Trigger our method on our custom schedule event.
    if ( ! wp_get_schedule( 'woocsp_cron_delivery' ) ) {
        wp_schedule_event( time(), '10s', 'woocsp_cron_delivery' );
    }

    write_log("Plugin activated.");
}

// Deactivate scheduled events on plugin deactivation.
register_deactivation_hook(__FILE__, 'woocsp_deactivation');
function woocsp_deactivation() {
    write_log("Plugin deactivating.");

    //Remove our scheduled hook.
    wp_clear_scheduled_hook('woocsp_cron_delivery');

    write_log("Plugin deactivated.");
}

1

Tôi sợ rằng ngoài việc chờ ai đó truy cập trang web của bạn chạy chức năng, lựa chọn duy nhất khác là thiết lập công việc định kỳ trên máy chủ của bạn bằng cách sử dụng cái gì đó như thế này /programming/878600/how -to-created-cronjob-using-bash hoặc nếu bạn có giao diện kiểu cpanel trên máy chủ của mình, đôi khi có một gui để thiết lập điều này.


yeah,., tôi hiểu rằng .. Tôi đã có một số crons tạo từ cPnael .. nhưng bây giờ tôi đang cố gắng để chạy một hàm từ functions.phpvì khi chức năng là trong một pluginhoặc trong functions.phpchúng ta không thể yêu cầu khách hàng để thiết lập một cron từ cpanel một mình ..
ngu ngốc

1

Các Cronjob Scheduler Plugin cho phép bạn chạy các nhiệm vụ thường xuyên đáng tin cậy và kịp thời mà không cần bất cứ ai phải truy cập vào trang web của bạn, bạn chỉ cần có ít nhất 1 hành động và một lịch trình Unix Crontab.

Nó rất dễ sử dụng và rất linh hoạt. Bạn tạo chức năng của riêng mình và xác định một hành động trong đó. Sau đó, bạn có thể chọn hành động của mình từ menu plugin và kích hoạt nó bất cứ khi nào bạn muốn.


0

Tôi có một giải pháp khả thi khi sử dụng hàm lịch biểu và hàm WP Ajax đệ quy.

  1. Tạo một sự kiện lịch trình trong 60 phút để chạy một chức năng
  2. Hàm này sẽ kích hoạt hàm đệ quy bằng Ajax thông qua file_get_contents()
  3. Hàm ajax sẽ có một bộ đếm trên cơ sở dữ liệu với tổng số 60 (cho mỗi phút trong giờ).
  4. Hàm ajax này sẽ kiểm tra bộ đếm của bạn để:

Nếu bộ đếm bằng hoặc cao hơn 60, nó sẽ đặt lại bộ đếm và chờ công việc định kỳ tiếp theo.

Nếu truy cập bội số của 5 (cứ sau 5 phút) nó sẽ thực hiện chức năng mong muốn của bạn

Và, bên cạnh các điều kiện, nó sẽ ngủ trong 59 giây sleep(59);(giả sử chức năng của bạn là nhanh). Sau khi ngủ, nó sẽ tự kích hoạt bằngfile_get_contents() lại.

Những điều quan trọng cần lưu ý:

  1. Tạo một cách để làm gián đoạn quá trình (nghĩa là kiểm tra một giá trị trên DB)
  2. Tạo một cách để ngăn chặn 2 quá trình cùng một lúc
  3. Trên file_get_contents đặt giới hạn thời gian trên tiêu đề là 2 hoặc 3 giây, nếu không, máy chủ có thể có nhiều quy trình khác nhau không chờ đợi gì
  4. Bạn có thể muốn sử dụng set_time_limit(90);để thử ngăn máy chủ phá vỡ chức năng của bạn trước khi ngủ

Đó là một giải pháp, không phải là một giải pháp tốt và nó có thể bị máy chủ chặn. Sử dụng một cron bên ngoài, bạn có thể thiết lập một chức năng đơn giản và máy chủ sẽ sử dụng tài nguyên trên đó một lần trong mỗi 5 phút. Sử dụng giải pháp này, máy chủ sẽ luôn sử dụng tài nguyên trên đó.


0

Câu trả lời của @ johano giải thích chính xác cách thiết lập khoảng thời gian tùy chỉnh cho công việc cron WP. Câu hỏi thứ hai không được trả lời, đó là cách chạy cron mỗi phút:

  1. Trong tệp wp-config.php, thêm mã sau đây:

    define('DISABLE_WP_CRON', true);
  2. Thêm một công việc định kỳ ( crontab -etrên unix / linux):

    1 * * * * wget -q -O - http://example.com/wp-cron.php?doing_wp_cron

Phần đầu tiên (bước 1) sẽ vô hiệu hóa công việc định kỳ nội bộ của WordPress. Phần thứ hai (bước 2) sẽ tự chạy công việc cron WordPress mỗi phút.

Với câu trả lời của @ Johano (cách chạy một nhiệm vụ cứ sau 5 phút) và của tôi (cách chạy cron thủ công), bạn sẽ có thể đạt được mục tiêu của mình.

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.