시간이 지나도 WP Cron이 실행되지 않음


16

목표

wp_schedule_single_event( )사용자가 양식을 제출 한 지 8 분 후에 전자 메일을 보내는 단일 이벤트를 실행하는 데 사용하고 싶습니다 .

문제

다음 코드는 다음과 같습니다 functions.php.

function nkapi_send_to_system( $args ) {
  wp_mail( 'xxx', 'xxx', $args );
}

add_action( 'nkapi_send', 'nkapi_send_to_system' );

function schedule_event( $id ) {
  wp_schedule_single_event( current_time( 'timestamp' ) + 480, 'nkapi_send', array( $id ) );
}

그리고 다음 코드가 호출에 사용됩니다 schedule-event.

schedule_event( $_SESSION['insert_id'] ); // the $_SESSION var contains an INT

8 분 이상 기다린 후받은 편지함에 이메일이 없습니다.

내가 시도한 것

플러그인 Core Control을 사용하면 크론 작업이 예정되어 있는지 확인할 수 있습니다.

핵심 제어 화면

몇 가지 변경을 한 후에 나는 그것들을 꽤 정확하고 좋게 만들었습니다. "지금 실행"을 누르면 실제로받은 편지함에 전자 메일이 도착합니다.

그러나 8 분 후에 사이트를 방문 할 때 왜 크론이 실행되지 않습니까? 이 코드에 어떤 문제가 있습니까? WP Cron을 사용한 것은 이번이 처음입니다.

나는 더 시도

vancoder id 의 의견이 다음 코드를 직접 입력하면 코드가 작동하는지 테스트하기로 결정했습니다 functions.php.

function schedule_event( $id ) {
  wp_schedule_single_event( time(), 'nkapi_send', array( $id ) );
}

if ( isset( $_SESSION['insert_id'] ) ) {
  if ( ! array_key_exists( 'insert_scheduled', $_SESSION ) || $_SESSION['insert_scheduled'] != $_SESSION['insert_id'] ) {
    schedule_event( $_SESSION['insert_id'] );
    $_SESSION['insert_scheduled'] = $_SESSION['insert_id'];
  }
}

이 코드의 단점은 사용자가이 코드를 실행하기 전에 다른 페이지로 이동해야한다는 것입니다. 그러나 다른 한편으로는 이것이 작동하지 않으므로 첫 번째 문제는 아닙니다 ...


1
어디서 어떻게 schedule_event( $_SESSION['insert_id'] );발사됩니까?
vancoder

단축 코드는 페이지에 별도의 파일 (양식 포함)을 포함하며, 해당 양식이 페이지 재로드를 게시되면 동일한 파일이을 실행 schedule_event( )하고 단축 코드에 의해로드 된 포함 된 파일의 맨 위에 표시합니다.
Mike Madern

수행 모든 크론 작업을? wp_version_check 등?
vancoder

나는 어떤 크론도 작동 시키지 않았다 . 그게 무슨 문제일까요?
Mike Madern

확인-핵심 크론 작업조차도 실패합니까?
vancoder

답변:


8

먼저 캐싱 플러그인이 활성화되어 있지 않은지 확인할 수 있습니까? 방문자에게 라이브 페이지가 아닌 캐시 된 버전의 페이지가 제공되므로 캐싱 플러그인은 cron 작업을 방해 할 수 있습니다.

캐싱 플러그인을 사용하는 경우 페이지 중 하나를 선택하고 캐시되지 않도록 해당 페이지의 캐싱 플러그인 설정에 제외를 추가 할 수 있습니다.

그런 다음 몇 분마다 해당 페이지를 방문 할 cron 작업 (공유 호스팅 환경에있는 경우 cpanel을 사용하거나 터미널에서 VPS / 전용 서버 인 경우)을 수동으로 작성해야합니다.

도움이 되길 바랍니다.


캐싱 플러그인이 활성화되었습니다! 정확한 W3 총 캐시
Mike Madern 13:04에

14

먼저 맞춤형 cron 작업 일정을 정의하십시오.

add_filter('cron_schedules', array($this, 'cron_schedules'));

public function cron_schedules($schedules){
    $prefix = 'cron_';// Avoid conflict with other crons. Example Reference: cron_30_mins
    $schedule_options = array(
        '30_mins' => array(
            'display' => '30 Minutes',
            'interval' => '1800'
        ),
        '1_hours' => array(
            'display' => 'Hour',
            'interval' => '3600'
        ),
        '2_hours' => array(
            'display' => '2 Hours',
            'interval' => '7200'
        )
    );
    /* Add each custom schedule into the cron job system. */
    foreach($schedule_options as $schedule_key => $schedule){
        $schedules[$prefix.$schedule_key] = array(
            'interval' => $schedule['interval'],
            'display' => __('Every '.$schedule['display'])
        );
     }
     return $schedules;
}

실제로 일정을 예약 할 장소와시기를 결정해야합니다.

다음은 코드 스 니펫 예제이며, 사용자 정의 클래스 메소드를 호출합니다.

$schedule = $this->schedule_task(array(
    'timestamp' => current_time('timestamp'), // Determine when to schedule the task.
    'recurrence' => 'cron_30_mins',// Pick one of the schedules set earlier.
    'hook' => 'custom_imap_import'// Set the name of your cron task.
));

실제로 이벤트를 예약하는 코드는 다음과 같습니다.

private function schedule_task($task){
    /* Must have task information. */
    if(!$task){
        return false;
    }
    /* Set list of required task keys. */
    $required_keys = array(
        'timestamp',
        'recurrence',
        'hook'
    );
    /* Verify the necessary task information exists. */
    $missing_keys = array();
    foreach($required_keys as $key){
        if(!array_key_exists($key, $task)){
            $missing_keys[] = $key;
        }
    }
    /* Check for missing keys. */
    if(!empty($missing_keys)){
        return false;
    }
    /* Task must not already be scheduled. */
    if(wp_next_scheduled($task['hook'])){
        wp_clear_scheduled_hook($task['hook']);
    }
    /* Schedule the task to run. */
    wp_schedule_event($task['timestamp'], $task['recurrence'], $task['hook']);
    return true;
}

이제 사용자 정의 cron 작업의 이름을 호출하기 만하면됩니다. 이 예에서 cron 태스크 이름은 custom_imap_import입니다.

add_action('custom_imap_import', array($this, 'do_imap_import'));

public function do_imap_import(){
    // .... Do stuff when cron is fired ....
}

따라서이 예에서는 $this->do_imap_import();30 분마다 호출됩니다 (웹 사이트에 충분한 트래픽이 있다고 가정).


노트

cron이 올바른 시간에 실행 되려면 페이지 방문이 필요합니다.

예 : 30 분 간격으로 작업을 예약했지만 아무도 4 시간 동안 사이트를 방문하지 않으면 해당 방문자가 4 시간 후에 사이트에 올 때까지 크론 작업이 시작되지 않습니다. 실제로 30 분마다 작업을 실행해야하는 경우 웹 호스팅 제공 업체를 통해 합법적 인 크론 작업을 설정하여 원하는 간격으로 웹 사이트를 방문하는 것이 좋습니다.

워드 프레스 크론 작업은 웹 사이트를 느리게 만들지 않습니다!

아마도 cron-script를 실행하는 데 시간이 오래 걸리면 방문자가 스크립트가 실행될 때까지 기다려야 할 것입니다. 아니! 어떻게 가능할까요? wp-cron.php파일 을 보면 줄을 찾을 수 있습니다

ignore_user_abort(true);

php.ini사이트 / 스크립트로드를 중지하면 스크립트 실행이 중지되지 않도록 설정 하는 구성입니다.

wp-includes/cron.php파일 을 보면 다음 과 같은 줄이 있습니다.

wp_remote_post( $cron_url, 
array('timeout' => 0.01,
 'blocking' => false, 
 'sslverify' => apply_filters('https_local_ssl_verify', true)) );

즉, 워드 프레스는 다음이 중단됩니다하지만 당신이 설정 한대로 실행을 트리거 만 0.01 초를 대기 ignore_user_aborttrue스크립트 실행됩니다. 이 기능은 WordPress cron 작업에서 큰 스크립트를 실행하는 데 큰 이점이 있습니다.

도움이되는 기능 :


6
이것은 내가 볼 수있는 한 실제 질문을 해결하지 못하는 놀랍도록 포괄적 인 응답입니다. 따라서 예약 된 모든 작업 (핵심 작업 포함)이 실패하는 이유입니다.
vancoder

이 답변은 WordPress 크론 작업을 올바르게 이해하고 예약하기 위해 올바른 방향으로 사용자를 안내하는 것입니다.
Michael Ecklund

4
이 확실한 것은 WordPress와 함께 cron 일정을 이해하는 데 크게 도움이되었습니다.
Mike Madern

2
마이클, 더 자주 대답해야합니다. 위대한 하나 +1
Kaiser

1
WP_Cron나머지 WP와 같이 GMT를 사용 한다고 생각 합니다 . time()대신 첫 번째 이벤트를 예약하는 것이 좋습니다 current_time().
Ian Dunn

3

WordPress Cron에서는 작업을 예약 할 수 있지만 사이트에 대한 요청이있는 경우에만 실행됩니다. 워드 프레스가 수신하는 각 요청에 대해 처리 할 크론 작업이 있는지 확인하고 작업이 처리되도록 /wp-cron.php?doing_wp_cron비동기식으로 요청을 발생 시키는 지 확인합니다. 작업의 예약 된 시작이 요청없이 통과되면 cron 프로세스가 시작되지 않습니다.

예약 된 작업을보고 실행할 수 있으므로 특히 캐싱 플러그인을 사용하는 경우 cron 작업을 시작하도록 요청하는 요청이 없을 수 있습니다. 이것을보다 정기적 인 일정으로 오프로드하는 가장 좋은 옵션은 WordPress에서 기본 확인을 비활성화하고를 사용하는 것 crontab입니다.

먼저 클라이언트 측 성능에 약간의 도움이 될 수있는 기본 검사를 비활성화하려면 다음을 추가하십시오 wp-config.php.

// Disable default check for WordPress cron jobs on page loads
define( 'DISABLE_WP_CRON', true );

다음 wp-cron.php으로 백엔드의 작업을 처리하기 위해 1 분에 한 번 페이지 를 페치하는 태스크를 작성 하여 명령 행 crontab -e에서 다음과 같은 행을 추가 하십시오 .

*/1 * * * * /usr/bin/curl --silent http://example.com/wp-cron.php?doing_wp_cron=$(date +\%s.\%N) >/dev/null 

2
doing_wp_cron에 값을 제공하지 않으면 작업이 때때로 두 번 실행될 수 있습니다. doing_wp_cron=$(date +\%s.\%N)그것을 막기 위해 사용하십시오 .
Alexander Garden

0

DISABLE_WP_CRON이 구성에 설정되어 있지 않은지 확인하십시오.

실패하면 모든 플러그인을 비활성화하십시오 (핵심 제어 제외-wp-crontrol을 사용하지만) 핵심 작업이 작동하는지 확인하십시오. 그렇다면 플러그인 어딘가에있는 것입니다.

마찬가지로 표준 20 가지 테마로 전환 해보십시오.

이들 중 어느 것도 차이가 없다면 호스팅 문제 일 가능성이 있습니다.


DISABLE_WP_CRON내 설정 하지 않은 wp-config.php, 더 많은 것을 시도하고 나중에 다시 올 것이다
마이크 Madern

0

Wordpress를 숨기는 플러그인을 확인하십시오.

이것이 문제인지 확인하는 방법?

  1. http (s) : //yoursite.com/wp-cron.php로 이동하십시오. 빈 페이지가 나타납니다. 완전히 비어있는 것.
  2. 또한 cron 작업 관리자에서 "다음 실행"아래의 시간을 볼 수 있어야합니다. Cron 작업 예약-wp-cron.php가 제대로 작동하는 경우 "대기열에서"텍스트뿐만 아니라 주어진 시간-일부 항목의 경우 "대기열에서"는 가끔은 괜찮지 만 유일한 경우 당신은 참조-> 당신의 cron이 작동하지 않습니다.)

+1. "Cron이 작동하는지 확인"하는 플러그인을 믿지 마십시오. 예를 들어 WP Cron 상태 검사기 플러그인에 cron이 작동하고 있음이 표시되었습니다. 그러나 실제로는 그렇지 않았습니다. 그것이 무엇이든간에-이 플러그인이 아닌 눈을 믿으십시오!

결론 : 404 오류 인 경우 a) 다른 사람들이 제안한대로 플러그인 캐싱뿐만 아니라 b) Wordpress를 숨기는 플러그인도 끕니다.

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