WordPress
Categorias

Assumindo o controle das tarefas agendadas no WordPress (wp-cron)

Se você possui um site ou blog em WordPress, é bem provável que um pequeno arquivo do CMS esteja contribuindo para reduzir o desempenho do servidor. O ótimo sistema da Automattic possui um arquivo chamado “wp-cron.php”, o qual é responsável pela execução de uma série de tarefas.

Tal arquivo faz com que uma série de ações sejam automatizadas. É ele o responsável, por exemplo, pela realização de backups, pelas notificações de novas versões, pelo envio de e-mails, pela publicação automática de posts que foram agendados, etc. Quando você agenda determina publicação para ir ao ar em determinado dia e horário, saiba que o “wp-cron.php” será o responsável por tal evento.

O grande problema é que este arquivo (e suas execuções) pode acabar consumindo recursos do servidor em demasia. Ele pode acabar fazendo com que sites fiquem lentos, pode aumentar o load no servidor, pode, enfim, causar uma série de problemas.

WordPress

Isto porque ele é executado sempre que o site é acessado. Sempre, também, que algo no painel de administração é alterado. Pense nisto, e agora imagine um servidor não lá muito “parrudo”  e/ou mal otimizado. Junte a isto um ou diversos sites com alta visitação na mesma máquina.

É fácil perceber que o “wp-cron.php” pode se transformar em um grande problema (a utilização deste recurso, aliás, pode até mesmo ser desnecessária, dependendo da situação), gastando memória e processamento em excesso, sem necessidade.

Desabilitando o “wp-cron.php” do WordPress

Existe, entretanto, uma solução. Podemos “desligar” o recurso. Podemos desabilitar a execução automática do “wp-cron.php”. Podemos assumir o controle, aqui, e rodar o script quando bem desejarmos. Veja abaixo como fazer:

OBS: é importante lembrar que o arquivo “wp-cron.php” fica dentro da pasta raiz do WordPress.

1) Localize o arquivo “wp-config.php” do WordPress (também na pasta raiz do CMS). Baixe-o para seu computador e abra-o com um editor de textos qualquer, como por exemplo o Notepad ou o PSPad;

2) Com o arquivo aberto, localize a sessão onde são especificados os detalhes do banco de dados em utilização. Algo mais ou menos semelhante ao trecho abaixo:

// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME', 'usuario_nomedobanco');

/** MySQL database username */
define('DB_USER', 'usuario_usuariodobanco');

/** MySQL database password */
define('DB_PASSWORD', 'senhadobd');

/** MySQL hostname */
define('DB_HOST', 'localhost');

/** Database Charset to use in creating database tables. */
define('DB_CHARSET', 'utf8');

/** The Database Collate type. Don't change this if in doubt. */
define('DB_COLLATE', '');

O código que iremos utilizar para desabilitar o “wp-cron.php” deve ser inserido logo após os dados do banco de dados. No exemplo acima, então, logo abaixo de “define(‘DB_COLLATE’, ”);”.

Portanto, agora que você já sabe o ponto correto de inserção, insira o código, o qual segue abaixo:

define('DISABLE_WP_CRON', true);

3) Salve o arquivo “wp-config.php” que acabou de editar e o envie de volta para o servidor, substituindo o que aí se encontra;

Criando uma cronjob para rodar o “wp-cron.php”

O fato de termos desabilitado o wp-cron não significa, entretanto, que ele não é útil, que ele não deve mais ser utilizado. Nós apenas estamos assumindo o controle, para evitar sobrecargas no servidor, lentidões, etc.

Nós desativamos sua execução automática, porém, ele ainda deve ser usado para a execução das tarefas que mencionamos acima. Apenas, com menos frequência. Então, vamos criar uma cronjob, ou seja, vamos realizar um agendamento para que o servidor execute o arquivo de tempos em tempos.

Quanto tempo? Isto depende bastante. Caso seu site não tenha muitos visitantes, caso você poste em seu blog apenas duas ou três vezes por semana, por exemplo, a frequência com que o “wp-cron.php” deve ser “chamado” pode ser bem menor.

Mas vamos aqui considerar um site com uma visitação razoável. Um intervalo de 15 ou 20 minutos, ou até mesmo meia hora, quarenta minutos (ou um pouco mais), entre cada execução, por exemplo, pode ajudar bastante.

O que vamos fazer, ressaltando novamente, é criar uma cronjob para automatizar a execução do wp-cron de acordo com o intervalo de tempo desejado, certamente bastante inferior ao modo automático.

Painéis de controle de hospedagem como o Cpanel, por exemplo, geralmente contam com ferramentas que permitem a criação destas tarefas agendadas de forma bastante simples, incluindo menus dropdown que deixam o usuário informar “horas”, “minutos”, “dias”, “meses”, etc, de forma totalmente visual. Algo bastante intuitivo.

Cpanel - Cronjob

Vamos assumir que desejamos rodar o arquivo a cada 30 minutos. Basta informarmos tal intervalo e o respectivo comando, no campo “command“. Confira o comando:

/usr/local/bin/php /caminho_para_o_wp-cron.php/wp-cron.php

Agora veja um exemplo de como o painel de controle exibirá a cronjob, após sua criação, com a respectiva informação relativa aos 30 minutos:

0,30 * * * * /usr/local/bin/php /home/usuario_site/public_html/wp-cron.php

Lembre-se de alterar “/home/usuario_site/public_html/” de acordo com suas necessidades, com o caminho para a pasta onde o WordPress está instalado, etc. Por exemplo, “/home/codigofonte/public_html/” (no caso de codigofonte.com.br). E assim por diante.

Via SSH: criando uma cronjob para rodar o “wp-cron.php”

Todo o procedimento acima também pode ser realizado através do SSH. É ainda mais simples e rápido. Veja:

1) Logado no servidor via SSH, digite o comando abaixo e tecle <ENTER>:

crontab -e

Isto permitirá que você edite a crontab. Após a abertura, digite o comando, na última linha (lembre-se de sempre realizar as alterações nos caminhos conforme suas necessidades, conforme explicado acima):

0,30 * * * * /usr/local/bin/php /home/usuario_site/public_html/wp-cron.php

Crontab - SSH

Para salvar a crontab, no shell, tecle CTRL+X e confirme com “Y” (Yes).

Você pode também desejar adicionar a tarefa apenas para o usuário da conta em questão. No exemplo acima, realizamos o procedimento após logarmos no servidor como root. Mas também podemos fazer o mesmo para cada um dos usuários, para cada uma das contas/domínios/sites.

Faça login no SSH com os dados do(s) usuário(s) desejado(s). Caso já esteja logado, como root, troque para o usuário, usando o seguinte comando (seguido de um <ENTER>):

su usuario

Lembre-se de alterar “usuário” pela informação correta. Por exemplo:

su codigofonte

Onde “codigofonte” é o usuário da conta em questão

Com a crontab em tela, digite o comando completo, exatamente igual ao que fizemos acima:

0,30 * * * * /usr/local/bin/php /home/usuario_site/public_html/wp-cron.php

Salve, como explicado acima, e pronto.

Após realizar este procedimento no SSH, você pode até mesmo conferir no painel de controle (Cpanel, por exemplo): a tarefa estará lá, criada, corretamente, apenas para o usuário que especificamos acima.

Finalizando

É extremamente importante “domar” o wp-cron, como explicamos acima. Assim, você é capaz de evitar uma série de dores de cabeça, incluindo loads altos. Mais adiante publicaremos um outro artigo, com mais dicas relacionadas a este assunto.