멀티 사이트에서 올바른 방법으로 WP Cron 실행


18

여러 사이트가있는 WordPress Multisite가 있습니다. 나는 설정 DISABLE_WP_CRON에 true제 시가 wp-config.php.

wget 또는 curl을 사용하여 cron 작업을 설정하면 PHP 스크립트를 실행하는 30 초 규칙이 있습니다. 수많은 전자 메일 알림을 보내고 다른 작업을 수행하기에는 너무 작습니다 (원격 SMTP 서버 연결이 느려질 수도 있고 bbPress 또는 그 밖의 다른 전자 메일 알림 일 수도 있습니다).

아마도 이런 식으로 사용할 수 있을까요?

php -q wp-cron.php

그러나 멀티 사이트의 한 사이트에만 cron을 실행합니다 (각 사이트는 다른 MySQL 테이블에 자체 cron 작업이 있습니다).

추신 : wpmudev.org 포럼 에서 컬을 사용하는 이상한 "솔루션"을 발견했습니다.

다른 PS WP CLI에는 멋진 wp cron명령이 있지만 수동으로 cron 작업을 수동으로 실행할 수 있습니다 (예, --urlattr 을 사용할 수 있음 ). 예를 들면 다음과 같습니다.

wp cron event list --url=multisite.com
wp cron event list --url=subdomain.multisite.com

WP-CLI핵심 코드를 살펴 보셨습니까 ?
— 카이저

예. 나는 현재 소스 코드를 파고 이해하려고 노력하고 있습니다 :) 모든 작업 (이벤트)을 실행하는 명령이 존재하지 않을 수도 있습니다.
— Kolya Korobochkin

에 wp/ WP-CLI 가 PATH있습니까? 그렇다면 cron에서 실행되는 bash 파일에서 트리거하지 않습니까?
— 카이저

대단해! 그러나 wp cli에서 모든 cron 작업을 실행하는 방법은 무엇입니까? 이에 대한 명령이 표시되지 않습니다.
— Kolya Korobochkin 2014

질문의 끝에서 보여준 그대로?
— 카이저

답변:


13

가장 좋은 방법은 WP-CLI를 사용하는 것이라고 생각하지만이 작업을 수행하려면 bash 스크립트를 작성해야합니다. 당신을 위해해야 ​​할 것이 하나 있습니다 :

WP_PATH="/path/to/wp"
for SITE_URL in = $(wp site list --fields=domain,path,archived,deleted --format=csv --path="$WP_PATH" | grep ",0,0$" | awk -F ',' '{print $1 $2}')
do
    for EVENT_HOOK in $(wp cron event list --format=csv --fields=hook,next_run_relative --url="$SITE_URL" --path="$WP_PATH" | grep \"now\"$ | awk -F ',' '{print $1}')
    do
        wp cron event run "$EVENT_HOOK" --url="$SITE_URL" --path="$WP_PATH"
    done
done

그런 다음이 스크립트를 crontab에 추가하고 원하는 경우 1 분마다 실행해야합니다


흠 당신의 의견에 감사하지만 나는 이것이 해키 (더러운) 해결책이라고 생각합니다. 필요한 모든 작업을 실행하는 wpcli 용 PHP 애드온을 작성하는 것이 좋습니다. WP 함수와 코드를 이해하려면 더 많은 시간이 필요합니다.
— Kolya Korobochkin

4
@KolyaKorobochkin 동의하지 않습니다. WP CLI가 명령 행과 bash 스크립트에서 사용되도록 만들어 졌기 때문에 전혀 문제가되지 않습니다.
— DiverseAndRemote.com

1
wp cron event run --due-now --url="$SITE_URL" --path="$WP_PATH- run문서 에 따르면 --due-now깃발을 사용해야합니다 . 이렇게하면 조회 및 개별 이벤트 호출이 줄어 듭니다. wp-cli.org/commands/cron/event/run을 참조하십시오 . 어느 쪽이든, 나는 @OmarJackman과 함께 있습니다. 그는 WordPress 명령 줄 도구를 사용하기 위해 명령 줄을 사용하고 있습니다. 깨끗한 Bash 예제를위한 props. crontab 항목을 표시하여이 답변을 마무리 할 수 ​​있습니다.
— jgraup

미래 독자들의 이익을 위해 스크립트는 다음과 같이 보입니다 :WP_PATH="/path/to/wp"; for SITE_URL in $(wp site list --fields=domain,path,archived,deleted --format=csv --path="$WP_PATH" | grep ",0,0$" | awk -F ',' '{print $1 $2}'); do wp cron event run --due-now --url="$SITE_URL" --path="$WP_PATH"; done
— puzzlement

10

상수를 추가 한 후 wp-config.php

defined('DISABLE_WP_CRON') or define('DISABLE_WP_CRON', true);

WP-CLI

config.yml설정이 올바르게되어 있다고 가정하면을 --path호출 할 때 플래그를 생략 할 수 있습니다 cron run.


wp cron event run --due-now

[<hook>…] 실행할 하나 이상의 후크.

[--due-now] 기한 내에 모든 후크를 실행하십시오.

[--all] 모든 후크를 실행하십시오.


적법한 모든 cron 태스크 를 순서대로 실행 하려면 다음 을 수행하십시오 .

function run_crons_due_now_in_order { for SITE_URL in $(wp site list --fields=url --format=csv | tail -n +2 | sort); do wp cron event run --due-now --url="$SITE_URL" && echo -e "\t+ Finished crons for $SITE_URL"; done; echo "Done"; }; run_crons_due_now_in_order;

동시에 실행하기를 원한다면 (비 사이트 특정 cron을 먼저 실행) :

function run_all_crons_due_now { for SITE_URL in $(wp site list --fields=url --format=csv | tail -n +2 | sort); do wp cron event run --due-now --url="$SITE_URL" && echo -e "\t+ Finished crons for $SITE_URL" & done; wait $(jobs -p); echo "Done"; }; run_all_crons_due_now;

실행 파일에 옵션을 넣기를 원할 것입니다

chmod +x run_all_wp_cron_events_due_now.sh

crontab 작업 추가

crontab -e

아마 매분마다 실행

* * * * * run_all_wp_cron_events_due_now.sh > /dev/null

당신이 실행하려면 사용자 정의 명령 크론에서를, 당신의 전체 경로를 지정해야 할 수 있습니다 WP-CLI 작업을합니다.

* * * * * cd /home/username/public_html; /usr/local/bin/php /home/username/wp-cli.phar your-custom-cron-commands run >/dev/null 2>&1

PHP

여기에서 WordPress를로드해야하는 유일한 이유는 사전 정의 된 목록을 사용하지 않고 데이터베이스에서 URL을 수집하기 위해서입니다. 우리는 단지 그 URL들을 핑 (ping) 할 것이며 응답이 무엇인지는 신경 쓰지 않습니다.

custom-cron.php

<?php

// Load WP
require_once( dirname( __FILE__ ) . '/wp-load.php' );

// Check Version
global $wp_version;
$gt_4_6 = version_compare( $wp_version, '4.6.0', '>=' );

// Get Blogs
$args  = array( 'archived' => 0, 'deleted' => 0, 'public' => 1 );
$blogs = $gt_4_6 ? get_sites( $args ) : @wp_get_sites( $args ); // >= 4.6

// Run Cron on each blog
echo "Running Crons: " . PHP_EOL;
$agent = 'WordPress/' . $wp_version . '; ' . home_url();
$time  = time();

foreach ( $blogs as $blog ) {
    $domain  = $gt_4_6 ? $blog->domain : $blog['domain'];
    $path    = $gt_4_6 ? $blog->path : $blog['path'];
    $command = "http://" . $domain . ( $path ? $path : '/' ) . 'wp-cron.php?doing_wp_cron=' . $time . '&ver=' . $wp_version;

    $ch = curl_init( $command );
    $rc = curl_setopt( $ch, CURLOPT_RETURNTRANSFER, false );
    $rc = curl_exec( $ch );
    curl_close( $ch );

    print_r( $rc );
    print_r( "\t✔ " . $command . PHP_EOL );
}

그리고 custom-cron.phpcrontab에서 단일 통화를 추가하십시오 .

* * * * * wget -q -O - http://your-site.com/custom-cron.php?doing_wp_cron

1

배쉬가 적은 더 쉬운 1 개의 강선 :

wp site list --field=url | xargs -i -n1 wp cron event run --due-now --url="{}"

수동으로 실행하거나 스크립트에 넣고 다른 답변과 같이 cron에서 호출 할 수 있습니다.


0

이것은 내 솔루션입니다.

global $multisite_hosts;
$multisite_hosts = Array('xxxx.dev.xxx.oondeo.es','x2.dev.xxx.oondeo.es','x3.dev.xxx.oondeo.es');

function run_cron(){
  global $multisite_hosts;
  $host=array_pop($multisite_hosts);
  if (!$host)
    return;
  register_shutdown_function('shutdown');
  if (!isset($_SERVER['HTTP_HOST'])) {
       $_SERVER['HTTP_HOST'] = $host;  // replace with primary host
  }

  require './wp-cron.php';
}

function shutdown()
{
  run_cron();
}
run_cron();

우리는 이것을 crontab에서 호출합니다.


-5

"wp-cron.php를 올바른 방법으로 실행하라"는 말의 의미를 가장 먼저 알려 주어야한다고 생각합니다. Wordpress에 따르면 wp-cron을 비활성화하고 실행하고 싶다는 것은 말이되지 않습니다 ... Linux 관점에서 wget-ing 또는 / bin / php-ing wp-cron.php는 정확하지만 보안상의 이유로 특정 호스트가 PHP 호출 수를 제한하고있는 것 같습니다. -그 부분은 당신의 설명에서 완전히 명확하지 않습니다.

또 다른 질문 : 얼마나 많은 이메일이 "톤"입니까? 너무 많은 이메일을 빨리 보내려고 시도해서는 안되는 데는 여러 가지 이유가 있습니다.

목표를 다시 생각해야 할 수도 있습니다.

(응답 대신 의견을 말하지만 wpstack에 대한 평판이 충분하지 않습니다.)


3
WordPress cron을 실행하는 방법에는 여러 가지가 있습니다. 기본 제공 메커니즘은 페이지보기에 의해 트리거되며 DISABLE_WP_CRON보다 안정적인 시스템 크론 방법을 설정할 때이 방법을 사용하지 않도록 설정 하는 것이 일반적 입니다.
— Marcus Downing

문제는 그 이유 가 무엇 인지 / 이유가 의미가있는 경우가 아니라 다중 사이트 설치에서 wp-cron.php를 올바르게 호출 하는 방법 입니다. 나를 위해 아주 분명하다;)
— Philipp

1
나는 당신이 당신이 매우 오래되고 이미 숨겨진 대답에 대해 언급하고 있음을 깨닫기를 바랍니다.
— Jorge Orpinel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.