Devo desativar o WP_CRON e acionar o wp-cron.php do servidor a cada poucos minutos?

12

Parece que o WordPress dispara desnecessariamente o WP CRON em cada carregamento de página. Penso que, em vez de executá-lo em todas as visitas, por que não agendá-lo para ser executado a cada 5 minutos via servidor? Eu poderia simplesmente acionar o wp-cron.php a cada cinco minutos e alcançar o resultado desejado?

Existe alguma desvantagem nisso?

TheBigK
fonte

Respostas:

15

Não há desvantagem para executar o WP CRON usando os trabalhos cron do servidor. De fato, esta é a prática recomendada.

De acordo com o documento oficial de desenvolvimento do plugin WordPress :

O WP-Cron não é executado continuamente, o que pode ser um problema se houver tarefas críticas que devem ser executadas dentro do prazo. Existe uma solução fácil para isso. Basta configurar o agendador de tarefas do seu sistema para executar nos intervalos que você deseja (ou no horário específico necessário).

Para fazer isso, você precisa primeiro desativar o comportamento padrão do cron em wp-config.php:

define('DISABLE_WP_CRON', true);

Em seguida, programe wp-cron.phpdo seu servidor. Para Linux, isso significa:

crontab -e

No entanto, em vez de executá-lo na linha de comando (CLI), execute-o como uma solicitação HTTP. Para isso você pode usar wget:

*/5 * * * * wget -q -O - https://your-domain.com/wp-cron.php?doing_wp_cron

O WordPress carrega todos os arquivos principais necessários, plugins etc. wp-cron.phpcom o seguinte CÓDIGO:

if ( !defined('ABSPATH') ) {
    /** Set up WordPress environment */
    require_once( dirname( __FILE__ ) . '/wp-load.php' );
}

Portanto, não se preocupe, pois o WordPress não carrega recursos importantes.

Fayaz
fonte
11
A documentação do WordPress.org vinculada a você menciona wget http://YOUR_SITE_URL/wp-cron.phpsem a adição de ?doing_wp_cron Então, um é melhor que o outro? O que a adição ?doing_wp_cronfaz que a não versão não faz?
Garconis
Provavelmente, apenas para que seus logs mostrem a string de consulta para que você saiba como ela foi chamada com certeza.
Slbox 12/04/19
11
Eu não concordo com isso. Primeiro de tudo, não é verdade que é "recomendado". Em segundo lugar, esse método paralisa todos os plugins que usam o método recomendado real de agendamento de eventos. Eu acho que esse é um péssimo conselho. Quase ninguém deve desligar o cron, a menos que você tenha um motivo MUITO específico para fazê-lo. A única razão pela qual consigo pensar é se você está dividindo o WordPress por uma CDN ou algo assim. Esta não é uma prática normal.
John Dee
11
@ JohnDee: esse método não desabilita o cron, desabilita o método WP Cron que verifica e tenta executar trabalhos cron em cada carregamento da página. define('DISABLE_WP_CRON', true);desativa apenas essa parte do processo cron e, em seguida, chama o script cron com código como: */5 * * * * wget -q -O - https://your-domain.com/wp-cron.php?doing_wp_cronno servidor garante que os trabalhos cron sejam executados. Qualquer plug-in de programação nem saberá a diferença.
Fayaz
11
O link da documentação do WordPress.org sobre este assunto foi alterado para developer.wordpress.org/plugins/cron/…
aldemarcalazans
2

Existem algumas desvantagens: primeiro, ao usar o wp-cron.php como um cli, coisas como as variáveis ​​$ _SERVER não estão definidas. As pessoas superam essa limitação usando uma solicitação curl no wp-cron.php.

Em segundo lugar, porque o próprio WP não é carregado com o wp-cron.php; se você usar um plug-in de correspondência SMTP, ele não será carregado ao chamar o wp-cron. Novamente, o uso de uma chamada de curvatura substitui esse problema. A ondulação parece ser o método mais usado.

Contudo; Prefiro usar o wp-cli depois de definir as configurações de correio no postfix e (para nginx) o php-fpm config corretamente e definir um crontab como

*/5    *   *   *   *  wp cron event list --skip-plugins --skip-themes --path="/var/www/vhosts/example.com/httpdocs/wp" --fields=hook,next_run_relative --format=csv | awk -F, '$2=="now" {print $1}' | xargs -r wp --path="/var/www/vhosts/example.com/httpdocs/wp" cron event run $1

(Liste todos os crons com campos específicos no formato csv - hook sendo o nome do cron, o parente da próxima execução é o tempo. Retire os que mostrarem 'now' como a próxima execução (que estão vencendo agora) usando AWK, passe essa lista para xargs para chame wp cron event run $HOOKcada cron.) O uso do wp-cli carrega o WordPress corretamente (eu escolho pular plugins ao listar os crons, pois os erros de código e os avisos php estragam a saída com script; mas não os ignoram ao executar o cron com xargs, como o cron pode precisar que os plugins sejam carregados)

Espero que isso lhe dê algumas dicas sobre o que procurar.

TechnicalChaos
fonte
2
Que tal configurar: / 15 * * * wget -q -O - seudominio.com/wp-cron.php?doing_wp_cron conforme sugerido por TomMcFarlin - tommcfarlin.com/wordpress-cron-jobs . Parece fazer bem o trabalho. Gostaria de receber seu comentário.
TheBigK 20/01
Sim, como eu mencionei, as pessoas optam por usar curl (wget ou qualquer outra chamada http) para acionar os crons, e não há nada de errado com esse método. Eu estava apenas aconselhando os problemas de chamar o arquivo wp-cron php diretamente, que não incluía os arquivos necessários, e aconselhando outro método alternativo se você quisesse apimentar um pouco.
TechnicalChaos
0

Há muitos motivos para não desativar o wp-cron. De fato, é quase impossível encontrar um caso de uso para fazer isso. Ele não torna o site lento, e é usado para coisas que você talvez não saiba.

Muitos plugins usam o WP-Cron para agendar as coisas. Eles podem ficar confusos se você desligar o agendador.

Há uma proliferação de tutoriais sobre esse assunto porque é confuso e porque não faz muito para o seu site quando você o desabilita. O que ele fará é causar uma dor de cabeça ao desenvolvedor que precisa resolver o misterioso problema que ele cria em seis meses.

Além disso, o WP Heartbeat é acionado a cada 15 segundos na área administrativa, resolvendo esse problema para 99% das pessoas que acham que o têm.

John Dee
fonte
2
Esta é uma resposta terrível - eles não estão desativando o WP Cron. Eles estão apenas desativando a chamada do WP Cron no carregamento da página e transferindo-a para o daemon cron do sistema. Sheesh.
Barry Chapman
De qualquer forma, o principal motivo para deixá-lo em paz é que muitos plugins agora estão usando o cron para executar tarefas em segundo plano estendidas. Você pode atrapalhar algo que a pessoa NEXT está fazendo, porque espera que o sistema funcione de maneira padrão. Boa sorte!
John Dee
se um plug-in é codificado de uma maneira que quebra totalmente se o wp cron estiver desativado, significa que foi programado por um incompetente e é melhor desinstalá-lo imediatamente.
Magnetic_dud
Bem, os dois comentários aqui provam meu argumento. Você tem um desenvolvedor dizendo "isso não desabilita o cron, mas o embaralha para o OS cron" - o que é uma quebra no WordPress, que é neutro no SO. Então outro desenvolvedor diz "ei, é responsabilidade do desenvolvedor do plugin planejar a aniquilação do wp cron." Ok Então, se você deseja a funcionalidade cron, deve planejar a eliminação do sistema cron? Para quê? O sistema cron de backup? Esse comentário não faz sentido [obviamente].
John Dee
De qualquer forma, o estado atual é "TOTAL CONFUSION". Esse é o estado atual. A única solução, de um POV de estrutura, é dizer às pessoas: HÁ UMA RAZÃO QUE O SISTEMA WP-CRON EXISTE. NÃO DESLIGUE. A outra opção é 10.000 diferentes, várias opiniões. Qual é o que temos agora.
John Dee
0

Ainda estou para encontrar uma desvantagem real na transferência do wp-cron para o serviço externo. Faz isso há muitos anos.

Especialmente no mundo de hoje, onde você pode executar aplicativos como microsserviços.

Eu uso contêineres Docker separados para cada componente do WordPress - php, web, db, crontab, redis e assim por diante). Tendo o crontab como contêiner separado, chamando o wp-cron via http usando a rede local, sendo executado somente quando necessário.

Isso reduz o estresse nos nós de back-end e melhora a segurança por ter uma superfície de ataque menor.

Se o desenvolvedor não conseguir descobrir como fazer as coisas sem precisar chamar o wp-cron em cada carregamento da página, isso significa apenas inexperiência em seu nome. "Deixar sozinho", porque você não entende como as coisas funcionam não é um bom motivo para mantê-lo.

Radoslav Stefanov
fonte