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


18

여러 사이트가있는 WordPress Multisite가 있습니다. 나는 설정 DISABLE_WP_CRONtrue제 시가 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-CLIPATH있습니까? 그렇다면 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.