web-dev-qa-db-ja.com

5分ごとに機能を実行する方法

5分ごとに実行する機能があります。私はコーデックスから以下を参照しました:

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

いつ開始するかにかかわらず、5分ごとにこの関数を実行したいです。どうすればこれができますか?

また、コーデックスは、訪問者がそのサイトを訪問したときにcronが実行されると述べています。訪問を待たずに、分単位でcronを実行する方法はありますか?

たとえば、次の関数を5分ごとに実行する必要があるとしましょう。それでwp_schedule_event()またはwp_cronを使用してそれを実行するにはどうすればよいですか。

function run_evry_five_minutes(){
    // codes go here
}
10
Foolish Coder

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');

今すぐあなたの機能をスケジュールすることができます。

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

一度だけスケジュールするには、それを関数にラップして実行する前にチェックします。

$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');
}

$ argsパラメータに注意してください。 wp_next_scheduledで$ argsパラメーターを指定しないで、wp_schedule_eventに$ argsを指定すると、ほぼ無限の数の同じイベントが(1つだけではなく)スケジュールされます。

最後に、実行したい実際の関数を作成します。

function my_schedule_hook(){
    // codes go here
}

Wp-cronがスケジュールをチェックし、ページがロードされるたびにスケジュールされたジョブを実行していることを言及することは重要だと思います。

したがって、1時間に1人の訪問者しかいないトラフィックの少ないWebサイトがある場合、wp-cronはその訪問者があなたのサイトを閲覧したときにのみ実行されます(1時間に1回)。毎秒ページを要求しているビジターの多いトラフィックの多いサイトがあると、wp-cronが毎秒トリガーされてサーバーに余分な負荷がかかります。

解決策は、wp-cronを無効にして、スケジュールされたwp-cronジョブを最も速く繰り返す時間間隔(実際の場合は5分)で実際のcronジョブを介してそれを起動することです。

Lucas Rolff は問題を説明し、解決策を詳細に説明します。

代わりに、 UptimeRobot のような無料のサードパーティ製サービスを使用して、5分ごとにサイトに問い合わせ(およびwp-cronを起動)してください。ジョブ。

23
Johano Fierra

あなたのサイトが大量のトラフィックを得ているなら、set_transient()を使って5分ごとにそれを実行することを試みることができます。例えば:

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' );
}
2
bonger

各プラグイン呼び出しではなく、プラグインのアクティブ化で起動することができます。

//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.");
}
2

誰かがあなたのサイトにアクセスして関数を実行するのを待つ以外に、他の唯一の選択肢はこのようなものを使ってあなたのサーバー上にcronジョブを設定することです https://stackoverflow.com/questions/878600/how-to-create-cronjob-using-bash またはあなたのサーバーにcpanelスタイルのインターフェースがある場合、これを設定するためのguiがある場合があります。

1
Andrew Welch

Cronjob Scheduler プラグインを使用すると、誰もが自分のサイトにアクセスしなくても、頻繁に行われるタスクを確実かつタイムリーに実行できます。

とても使いやすく、そしてとても柔軟です。あなたはあなた自身の関数を作成し、その中にアクションを定義します。それからあなたはプラグインメニューからあなたの行動を選択し、いつでも好きなときにそれを起動することができます。

1
Marco

@ johanoの回答がWP cronジョブのカスタム間隔を設定する方法を正しく説明しています。 2番目の質問には答えられません、それは毎分クーロンを走らせる方法です:

  1. ファイルwp-config.phpに、次のコードを追加します。

    define('DISABLE_WP_CRON', true);
    
  2. Cronジョブを追加します(unix/linuxのcrontab -e):

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

最初の部分(ステップ1)はWordPressの内部クーロンジョブを無効にします。 2番目の部分(ステップ2)では、毎分WordPressのcronジョブを手動で実行します。

@ Johanoの答え(5分ごとにタスクを実行する方法)と私のもの(手動でクーロンを実行する方法)で、あなたはあなたの目標を達成することができるはずです。

0
Mike

私はスケジュール関数と再帰的なWP Ajax関数を使った可能な解決策を持っています。

  1. 機能を実行するための60分のスケジュールイベントを作成する
  2. この関数はfile_get_contents()を通してAjaxを使って再帰的関数を起動します。
  3. Ajax関数はデータベース上に合計60のカウンターを持っています(毎時の毎分)。
  4. このAjax関数はあなたのカウンターをチェックします:

Counterが60以上の場合、counterをリセットして次のcronジョブを待ちます。

5の倍数(5分ごとにそう)であれば、それはあなたの希望する機能を実行します

そして、条件の他に、59秒間sleep(59);スリープします(あなたの関数が素早いものであると仮定します)。睡眠の後、それはfile_get_contents()againを使ってそれ自身を誘発するでしょう。

注意すべき重要事項

  1. プロセスを中断する方法を作成します(すなわち、DBの値をチェックします)。
  2. 同時に2つのプロセスを防ぐ方法を作成する
  3. File_get_contentsでは、headerの制限時間を2秒または3秒に設定します。それ以外の場合、サーバーはさまざまなプロセスで何も待機しないことがあります。
  4. set_time_limit(90);を使用して、スリープ前にサーバーが機能を停止させないようにすることをお勧めします。

それは解決策であり、良い解決策ではありません、そしてそれはサーバーによってブロックされるかもしれません。外部クーロンを使用すると、簡単な機能を設定することができ、サーバーは5分に1回そのリソースを使用します。このソリューションを使用すると、サーバーは常にリソースを使用します。

0
Bruno Cantuaria