5 분마다 기능을 실행하는 방법은 무엇입니까?


15

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

필요 시간 간격을 고려하지 할 수 있도록 사이트 돼도 교통 체증은 ... .. 확인은 클라이언트에서 그것을 할 것을 선호합니다 .. 매 2 ~ 3 분 동안 트리거됩니다functions.php
어리석은 코더

타이머로 서버에서 실행중인 것이 없으면 PHP 파일을 트리거 할 수 없습니다.
앤드류 웰치

파일? 우리는 functions.php의 함수에 대해 이야기하고 있습니다
어리석은 코더

무료 모니터링 서비스가 CRON을 유발하는 핑이 될 수 있다고 생각하십니까? newrelic.com/server-monitoring
jgraup

답변:


28

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를 지정하면 거의 동일한 수의 동일한 이벤트가 스케줄됩니다 (하나가 아닌).

마지막으로 실행할 실제 함수를 작성하십시오.

function my_schedule_hook(){
    // codes go here
}

wp-cron이 일정을 확인하고 페이지가로드 될 때마다 예정된 작업을 실행한다고 언급하는 것이 중요하다고 생각합니다.

따라서 한 시간에 방문자가 1 명인 트래픽이 적은 웹 사이트가있는 경우 방문자가 사이트를 탐색 할 때 (1 시간에 한 번) wp-cron 만 실행됩니다. 방문자가 초당 페이지를 요청하는 트래픽이 많은 사이트 인 경우 wp-cron이 1 초마다 트리거되어 서버에 추가로드가 발생합니다.

해결책은 wp-cron을 비활성화하고 예약 된 wp-cron 작업을 가장 빠르게 반복하는 시간 간격 (실제 5 분)으로 실제 cron 작업을 통해 트리거하는 것입니다.

Lucas Rolff 는 문제를 설명하고 솔루션을 자세하게 제공합니다.

대안으로, wp-cron을 비활성화하고 실제 cron 작업을 통해 트리거하지 않으려는 경우 UptimeRobot 과 같은 무료 타사 서비스 를 사용하여 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; }. 데이터베이스의 테이블이 업데이트됩니다 . 그러나 6 분 후에도 DB 테이블이 업데이트되지 않습니다.
어리석은 코더

당신을 위해 일하지만, 실제로는 단지 사용하여 그것에 대해 생각하지 왜 몰라 get_transient()/ set_transient()크론 물건없이 것은 ... 대답을 업데이트합니다 더 많은 의미, 훨씬 간단을 만든다
bonger

@bonger는 wp_schedule_event ()에 대한 좋은 대안입니까?
Marko Kunic

@ 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

누군가 기능을 실행하는 귀하의 사이트를 방문하기를 기다리는 것 외에 다른 옵션은 https : //.com/questions/878600/how와 같은 것을 사용하여 서버에서 크론 작업을 설정하는 것입니다. -to-create-cronjob-using-bash 또는 서버에 cpanel 스타일 인터페이스가있는 경우이 설정을위한 GUI가있는 경우가 있습니다.


그래,., 나는 이미 cPnael에서 생성 된 일부 크론이 ... 그 이해 ...하지만 지금은 함수를 실행하려고 functions.php함수가있을 때 때문에 plugin나에 functions.php우리의 cPanel에서 크론을 설정하는 클라이언트를 요청할 수 없습니다 자신에 ..
어리석은 코더

1

cron 작업 스케줄러 플러그인은 당신이 필요로하는 모든 적어도 한 행동과 유닉스의 crontab 일정, 당신은 귀하의 사이트를 방문해야하는 사람이없이 안정적으로 적시 자주 작업을 실행할 수 있습니다.

사용하기 매우 쉽고 유연합니다. 자신 만의 함수를 작성하고 그 안에서 조치를 정의합니다. 그런 다음 플러그인 메뉴에서 작업을 선택하고 원할 때마다 실행할 수 있습니다.


0

일정 기능과 재귀 WP Ajax 기능을 사용하여 가능한 솔루션이 있습니다.

  1. 60 분의 스케줄 이벤트를 작성하여 기능을 실행하십시오.
  2. 이 함수는 Ajax를 통해 재귀 함수를 트리거합니다. file_get_contents()
  3. 아약스 함수는 데이터베이스에 카운터가 있으며 총 시간은 60 분입니다 (1 분 안에 1 분마다).
  4. 이 아약스 기능은 카운터를 확인하여 다음을 수행합니다.

카운터가 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);서버 를 사용 하여 절전 모드 전에 기능이 중단되지 않도록 할 수 있습니다.

좋은 해결책이 아니라 해결책이며 서버에 의해 차단 될 수 있습니다. 외부 크론을 사용하면 간단한 기능을 설정할 수 있으며 서버는 5 분마다 한 번씩 리소스를 사용합니다. 이 솔루션을 사용하면 서버는 항상 리소스를 사용합니다.


0

@johano의 답변은 WP cron 작업에 대한 사용자 정의 간격을 설정하는 방법을 올바르게 설명합니다. 두 번째 질문은 대답하지 않습니다. 매분마다 cron을 실행하는 방법입니다.

  1. 파일 wp-config.php에서 다음 코드를 추가하십시오.

    define('DISABLE_WP_CRON', true);
  2. 크론 작업 추가 ( crontab -eUNIX / Linux) :

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

첫 번째 부분 (1 단계)은 WordPress 내부 크론 작업을 비활성화합니다. 두 번째 부분 (2 단계)은 1 분마다 WordPress cron 작업을 수동으로 실행합니다.

@Johano의 답변 (5 분마다 작업을 실행하는 방법)과 내 (크론을 수동으로 실행하는 방법)를 사용하면 목표를 달성 할 수 있어야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.