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


14

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
}

このような短い間隔と精度が必要な場合は、たとえばLinux cronまたはサードパーティのcronサービスをよく調べてください。
birgire

時間間隔を考慮する必要はありませんので、サイトのhavs大量のトラフィック..必ずそれがすべての2または3分間トリガされますが...クライアントからそれを行うことを好むfunctions.php
フーリッシュ・コーダ

タイマーを使用してサーバー上で何かを実行せずにphpファイルをトリガーすることはできません。
アンドリューウェルチ

ファイル?我々はのfunctions.php内の関数について話している
愚かコーダ

無料の監視サービスがCRONをトリガーするpingであると思いますか?newrelic.com/server-monitoring
jgraup

回答:


27

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回)実行されます。訪問者が1秒ごとにページを要求するトラフィックの多いサイトがある場合、wp-cronが1秒ごとにトリガーされ、サーバーに余分な負荷がかかります。

解決策は、wp-cronを非アクティブにし、スケジュールされたwp-cronジョブを最速で繰り返す時間間隔(実際には5分)で実際のcronジョブを介してトリガーすることです。

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

別の方法として、次のような無料のサードパーティサービスを使用できます。 UptimeRobot wp-cronを非アクティブ化し、実際のcronジョブを介してトリガーしたくない場合、5分ごとにサイトを照会(およびwp-cronをトリガー)できます。


2

サイトに大量のトラフィックが発生する場合は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' );
}

まあ、えー、ええ?!
...-ボンガー

ええ、それは機能していません。functions.phpページにアクセスしたときに、次のコードを使用して、データベース内のテーブルを更新しますfunction run_evry_five_minutes() { $homepage = file_get_contents('link to visit'); echo $homepage; }。ただし、DBテーブルは6分後でも更新されません。
愚かなコーダー

それはあなたのために働いていない理由を知っているが、実際には使用してそれについて考えてはいけないget_transient()/をset_transient()cronのスタッフなしでは多くの理にかなって、はるかに単純な、答えを更新します...
bonger

@bongerは、wp_schedule_event()の代替として適していますか?
マルコクニック16年

@MarkoKunić正直に言ってわからない、試していない...それは回避策として提供されただけですが、試してみたら私たちに知らせてください...!(Johano Fierraの答えはよさそうだwordpress.stackexchange.com/a/216121/57034を
bonger

2

各プラグイン呼び出しの代わりに、プラグインのアクティベーションでトリガーできます:

//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

誰かが機能を実行しているサイトを訪問するのを待つ以外に、この/programming/878600/howのようなものを使用してサーバーにcronジョブをセットアップすること以外のオプションはないことを恐れています-to-create-cronjob-using-bash、またはサーバーにcpanelスタイルのインターフェイスがある場合、これを設定するためのGUIがあります。


ええ、。、私は..私はすでにcPnaelから作成されたいくつかのcronsを持っていることを理解して..しかし、今、私はから関数を実行しようとしていますfunctions.php関数がであるときに理由pluginかでfunctions.php私たちはcPanelのからのcronを設定するようにクライアントを求めることはできません自分で..
愚かなコーダー

1

cronジョブスケジューラプラグインが必要なのは、少なくとも1アクションとUnixのcrontabスケジュールで、あなたのサイトを訪問すること誰なく確実かつタイムリーに頻繁にタスクを実行することができます。

非常に使いやすく、非常に柔軟です。独自の関数を作成し、その中にアクションを定義します。次に、プラグインメニューからアクションを選択し、いつでも実行できます。


0

スケジュール機能と再帰的なWP Ajax機能を使用して可能なソリューションがあります。

  1. 関数を実行するための60分のスケジュールイベントを作成する
  2. この関数は、Ajaxを使用して再帰関数をトリガーします file_get_contents()
  3. ajax関数のデータベースには、合計数60(時間内の1分ごと)のカウンターがあります。
  4. このajax関数はあなたのカウンターをチェックして:

カウンターが60以上の場合、カウンターをリセットし、次のcronジョブを待ちます。

5の倍数(5分ごと)の場合、目的の機能を実行します

そして、条件に加えて、59秒間スリープsleep(59);します(あなたの機能が速いと仮定します)。睡眠の後、それはそれ自身をトリガーしますfile_get_contents()再びしてされます。

注意すべき重要事項:

  1. プロセスを中断する方法を作成する(つまり、DBの値を確認する)
  2. 2つのプロセスを同時に防ぐ方法を作成する
  3. file_get_contentsで、ヘッダーの時間制限を2秒または3秒に設定します。そうしないと、サーバーはさまざまなプロセスで何も待たない場合があります
  4. を使用しset_time_limit(90);て、スリープする前にサーバーが機能を中断しないようにしてください。

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


0

@johanoの答えは、WP cronジョブのカスタム間隔を設定する方法を正しく説明しています。2番目の質問には答えていませんが、これは毎分cronを実行する方法です。

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

    define('DISABLE_WP_CRON', true);
  2. cronジョブを追加します(crontab -eunix / linuxの場合):

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

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

@Johanoの答え(5分ごとにタスクを実行する方法)と私(手動でcronを実行する方法)を使用すると、目標を達成できるはずです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.