programing

워드프레스 크론 작업은 순차적으로 실행됩니까, 아니면 병렬로 실행됩니까?

fastcode 2023. 3. 21. 22:38
반응형

워드프레스 크론 작업은 순차적으로 실행됩니까, 아니면 병렬로 실행됩니까?

호스팅 서비스의 이메일 제한에 대응하기 위해 웹사이트에서 보내는 이메일 수를 제한하려고 합니다.cron 작업과 데이터베이스에 이메일을 쌓아올리는 표시기를 사용하여 보낸 이메일 수가 보낸 최대 이메일 제한에 도달했는지 확인합니다.

이 방법은 예약된 프로세스를 직접 실행한 후 큐 내의 위치에 따라 일정 시간 동안 'sleep' 상태로 만든 다음 이메일을 보내고 데이터베이스에 로그인하는 것입니다.예약된 작업을 사용하고 'sleep'을 실행하는 이유를 자세히 설명하려면 다음 시나리오를 고려하십시오.

  1. 사용자가 제 웹사이트에 등록하려고 하는데 곧 메일이 올 것으로 예상하고 있습니다.따라서 이메일/분 할당량을 초과하면 다른 메시지를 보내야 합니다. "서버가 사용 중입니다. 필요한 작업을 수행하는 데 'x'분을 허용하십시오."
  2. 이메일 전송 요청은 모두 AJAX를 통해 이루어집니다.사용자는 'busy message'가 echo'd가 될 때까지 x분을 기다려야 하기 때문에 프로세스 내에서 'sleep'을 사용하는 것 자체는 선택사항이 아닙니다.
  3. 메시지를 에코하기 위해 ob_flush, flush... 등의 조합을 사용하여 시도했지만 서버는 백그라운드에서 모든 것을 처리했지만 작동하지 않았습니다.AJAX 콜은 항상 결과를 에코하기 위해 스크립트가 종료되기를 기다리고 있었습니다.
  4. PHP PHP PHP!작업을 이각이 cron에서 되어 .이 작업에서는 쌓인 각 이메일이 다음 시간에 실행되도록 예약되어 있습니다.time()(예: 예약된 작업을 직접 실행) 전자 메일을 보내는 것과 동일한 기능에 연결되어 있습니다.플래그를 사용하면 요청이 쌓인 전자 메일임을 인식하고 전자 메일 할당량을 재설정하는 데 필요한 시간까지 'sleep' 상태로 만듭니다.

  5. 문제:5명이 거의 동시에 등록한 경우(이메일 파일이 아직 남아 있는 동안), 5개의 cron 작업이 모두 동시에 실행되어 잠시 sleeve 상태가 됩니다(이메일 파일 내의 이메일 수가 이미 이메일 할당량을 초과한 경우 sleep 시간은 다를 수 있습니다). 그러면 이메일이 전송됩니다.그러나 데이터베이스의 로그를 확인해보니 스케줄링된 작업이 병렬이 아닌 순차적으로 실행된다는 것을 알 수 있습니다.cron 작업이 다른 작업이 종료되기 전에 실행되는 경우가 있지만 동시에 실행되지 않습니다.

wordpress cron 작업은 실제로 cron 작업이 아니며 누군가가 웹 사이트를 방문하면 실행됩니다(그리고 예약된 모든 작업을 실행하기 위해 등록 요청이 전송된 후 페이지를 새로 고칩니다).하지만 호스팅 서버가 서버에 대한 액세스를 허용하지 않고 cron 작업 일정도 허용하지 않기 때문에 이러한 옵션만 있는 것 같습니다.

다음은 위의 내용을 실행하는 코드의 일부입니다.

//Test example to pile up emails, where quota is set to 2 emails every 30 seconds
$Emails_Threshold = 2;
$Threshold_Duration = 0.5*60;
//Get email indicator info
$Email_Info = $wpdb->get_row( 
"SELECT * 
FROM PileEmails 
WHERE priority = -1 
AND Status='New';"
,ARRAY_A);

if ($sleep ==0 && $Queue_Info_id==0){ //Not a scheduled event
   //Check if there are queued emails
   $Queue_exist = $wpdb->get_row (
    $wpdb->prepare("
                    SELECT Status 
                    FROM PileEmails
                    WHERE Status='Queued';"
                    ,$mail_priority)
                ,ARRAY_A);
  if (!empty($Queue_exist) || ($Email_Info['last_email_time']   > (time()-$Threshold_Duration))){
    if ($Email_Info['count_emails']>=$Emails_Threshold){
           //Code to Pile up
    }
  }else{ 
   //Reset email counter
  }
}else{ 
$wpdb->insert( "PileEmails",$Sleep_Info,$format);
sleep(10); //10 seconds here just as an example
}
//Code to send emails

할당량을 초과한 후 10개의 이메일을 보내려고 하면 데이터베이스에 로그인하게 됩니다.

MYSQL 데이터베이스 로그

타임스탬프는 각 로그와 다음 로그 사이에 10초 차이가 있다는 점에 주의해 주십시오.다만, 모두 동시에 기동해, 각각 10초간 sleep 하고 나서, 모두 E-메일을 병렬로 송신할 필요가 있습니다.

제 질문은 다음과 같습니다.word press cron이 병렬이 아닌 순차적으로 스케줄링된 작업을 실행하는 이유는 무엇입니까?이 문제를 어떻게 극복해야 할까요?

어떤 도움이라도 감사합니다.

앞서 설명한 바와 같이 cron 플러그인을 설치하면 cron 관리에 도움이 됩니다.

" 잠금"을 합니다.defined('DOING_CRON') 인데를 합니다.$lock = get_transient('doing_cron')spawn_cron메서드가 호출됩니다.

자, 여러분들도 보시면wp-includes/cron.phpWordpress crons는 기본적으로 동시에 실행되지 않으며 60초마다 한 번 이상 실행되지 않습니다.

// don't run if another process is currently running it or more than once every 60 sec.
    if ( $lock + WP_CRON_LOCK_TIMEOUT > $gmt_time )
        return;

한 번에 한 두 개만 이메일을 보낼 수 있다면 이 문제를 해결하기 어려울 것입니다.이 문제를 해결하는 더 쉬운 방법은 WordPress에 필요한 전자 메일을 자주 보낼 수 있는 SMTP 전자 메일 서버를 사용하는 것입니다.현재 호스팅 공급자에 새 이메일 계정을 추가하는 것만으로도 충분할 수 있습니다.수동으로 설정하는 방법을 모르는 경우는, 플러그 인으로 설정할 수 있습니다.

php는 위에서 아래로 실행되므로 다음과 같이 wordpress schedule event 함수를 사용하여 이벤트를 스케줄 할 때:

if (! wp_next_scheduled ( 'my_hourly_event' )) {
    wp_schedule_event(time(), 'hourly', 'my_hourly_event');
}


add_action('my_hourly_event', 'do_this_hourly');

function do_this_hourly() {
    // do something every hour
}

함수 this능 。do_this_hourly()스케줄에 따라서 실행되지만, 그 함수에 기입하는 코드는 1개씩만 실행됩니다.

  1. 예를 들면, 5명에게 메일을 송신하고, 1명씩 루프로 메일을 송신합니다.
  2. 있는 됩니다.「 」 에는 접속되어 .이러한 타임스탬프는timestamp및 그mail sent time이 타임스탬프는 로그용으로 작성한 것으로, 확인할 수 있습니다.

e-mail 전송 및 삽입 쿼리 처리에 걸리는 서버에 따라 10초 정도 차이가 있을 수 있습니다.

각 쿼리는 실행되며 타임 스탬프는 해당 시점(서버 시간)에 따라 삽입됩니다.

언급URL : https://stackoverflow.com/questions/40544078/are-wordpress-cron-jobs-executed-sequentially-or-in-parallel

반응형