Magento 2 executa um Cron específico sem cron: executa o comando CLI?

14

Para resumir uma longa história, o xdebug não será confiável nos pontos de interrupção nos meus arquivos cron ao usar o típico:

php bin/magento cron:run

O Xdebug está configurado corretamente e, às vezes, funciona, mas 85% das vezes não funciona e fica travado na CLI até eu desligar a escuta de conexões no phpstorm.

Existe uma maneira de executar apenas um arquivo cron de alguma forma? Eu tive que copiar e colar o conteúdo do meu arquivo cron em um comando do console separado para testá-lo corretamente no xdebug, o que não é o ideal.

No Magento 1.x, eu costumava usar o AOE Scheduler para testar tarefas cron com o Xdebug, acessando o administrador, marcando a caixa que queria e escolhendo executar no menu suspenso e funcionou bem.

Eu estou olhando para usar algo como:

php bin/magento modulename:cronjob

que sempre deve executar o cron, mesmo que não esteja agendado.

Kevin Chavez
fonte

Respostas:

16

Pense simples! A classe Cron é uma classe "normal". Podemos usar um Playground para testar nosso Cron: Como posso inicializar o Magento 2 em um script test.php? . O Gerenciador de Objetos criará nosso Objeto Cron. E então, podemos testar nosso Cron chamando o URL diretamente no navegador.

** Observe que, ao usar o Nginx, você pode colocar esses arquivos na publicação / pasta e ajustar o caminho necessário para o arquivo Test.php require '../app/bootstrap.php';

Test.php

<?php
require __DIR__ . '/app/bootstrap.php';
$bootstrap = \Magento\Framework\App\Bootstrap::create(BP, $_SERVER);
/** @var \Magento\Framework\App\Http $app */
$app = $bootstrap->createApplication('TestApp');
$bootstrap->run($app);

TestApp.php

 public function launch()
 {
        /** @var \Vendor\Module\Cron\Test $cron */
        $cron = \Magento\Framework\App\ObjectManager::getInstance()
            ->create('Vendor\Module\Cron\Test');

        $cron->execute();

        return $this->_response;

 }

insira a descrição da imagem aqui

Khoa TruongDinh
fonte
1
Obrigado, isso funcionou para mim, mas com um pouco de ajustes. Como estou usando o Nginx, ele não verifica o diretório raiz, então tive que colocar o Test.php e o TestApp.php no diretório pub. Depois que eu ajustei o caminho no Test.php, é necessário: require '../app/bootstrap.php'; também no TestApp.php, deve haver o:: return $this->_response; ou ele lançará um erro que você tem na captura de tela do phpstorm, mas não no código real. Vou tentar editar sua resposta com isso.
Kevin Chavez
@KevinJavitz de nada!
precisa saber é o seguinte
17

A opção de economizar no tempo de desenvolvimento seria usar o N98MageRun para Magento 2.

Este tem os comandos maravilhosos sys:cron:liste sys:cron:run.

Usando esses comandos, você poderá encontrar o código de tarefa específico para o seu cron e, em seguida, acionar apenas esse cron na linha de comando.

Ele pode ser facilmente instalado via composer require-dev n98/magerun2e eu recomendaria que fosse uma instalação do dev ao trabalhar com o Magento 2

David Manners
fonte
OMG Wao melhor maneira de executar cronjob por apenas um comando
Learner
4

Você pode conseguir usando dois arquivos:

crie pasta e classe na raiz do projeto, como:

crons / CronprocessApp.php

    <?php
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Framework\App\Filesystem\DirectoryList;
use phpseclib\Net\SFTP;
use phpseclib\Crypt\RSA;

class CronprocessApp
    extends \Magento\Framework\App\Http
    implements \Magento\Framework\AppInterface{

    public function __construct(
    \Magento\Framework\App\State $state,\Magento\Framework\App\Response\Http $response)
    {
        $this->_response = $response;
        //$state->setAreaCode('any area'); // or 'adminhtml', depending on your needs
        $state->setAreaCode('adminhtml'); // or 'adminhtml', depending on your needs
    }
    public function launch()
    {
        /** @var \Vendor\Module\Cron\Test $cron */
        $cron = \Magento\Framework\App\ObjectManager::getInstance()
            ->create('Custom\Preorder\Cron\ChangeVisiblityNonPreorderProduct'); //pass the name of your cron class path 
        $cron->execute();       


        return $this->_response;

    }
    public function catchException(\Magento\Framework\App\Bootstrap $bootstrap, \Exception $exception)
    {
        return false;
    }
}
?>

Crie outro arquivo de classe:

crons / Cronprocess.php

 <?php
require __DIR__ . '/../app/bootstrap.php';
require __DIR__ . '/../crons/cronprocessApp.php';

$bootstrap = \Magento\Framework\App\Bootstrap::create(BP, $_SERVER);
/** @var \Magento\Framework\App\Http $app */
$app = $bootstrap->createApplication('CronprocessApp');
$bootstrap->run($app);

Para executar o cron, vá para cli com o caminho raiz do projeto e execute o comando abaixo:

php crons/cronprocess.php
Pramod Kharade
fonte