Magento 2 ejecuta un Cron específico sin cron: ¿ejecuta el comando CLI?

14

Para resumir, xdebug no se detendrá de manera confiable en los puntos de interrupción en mis archivos cron cuando se usa el típico:

php bin/magento cron:run

Xdebug está configurado correctamente y, a veces, funcionará, pero el 85% del tiempo no lo hará, y simplemente cuelga en la CLI hasta que apague la escucha de conexiones en phpstorm.

¿Hay alguna manera de ejecutar solo un archivo cron de alguna manera? Tuve que copiar y pegar el contenido de mi archivo cron en un comando de consola separado para probarlo correctamente en xdebug, lo que no es ideal.

En Magento 1.x solía usar el AOE Scheduler para probar trabajos cron con Xdebug yendo al administrador, marcando la casilla que quería y eligiendo ejecutar en el menú desplegable y funcionó bien.

Estoy buscando usar algo como:

php bin/magento modulename:cronjob

que siempre debe ejecutar el cron, incluso si no está programado.

Kevin Chavez
fuente

Respuestas:

16

Piensa simple! La clase Cron es una clase "normal". Podemos usar un Playground para probar nuestro Cron: ¿Cómo puedo arrancar Magento 2 en un script test.php? . El Administrador de Objetos creará nuestro Objeto Cron. Y luego, podemos probar nuestro Cron llamando a la url directamente en el navegador.

** Tenga en cuenta que si usa Nginx puede colocar estos archivos en la carpeta pub / y ajustar la ruta requerida para el archivo 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;

 }

ingrese la descripción de la imagen aquí

Khoa TruongDinh
fuente
1
Gracias, esto funcionó para mí pero con un pequeño ajuste. Como estoy usando Nginx, no comprueba el directorio raíz, así que tuve que poner Test.php y TestApp.php en el directorio pub. Después de eso, ajusté la ruta en Test.php para: require '../app/bootstrap.php'; también en TestApp.php debe haber: return $this->_response; o arrojará un error que tienes en tu captura de pantalla de phpstorm pero no el código real. Trataré de editar tu respuesta con esto.
Kevin Chavez el
@KevinJavitz de nada!
Khoa TruongDinh
18

La opción para ahorrar en el tiempo de desarrollo sería usar N98MageRun para Magento 2.

Esto tiene los maravillosos comandos sys:cron:listy sys:cron:run.

Usando estos comandos, podrá encontrar el código de trabajo específico para su cron y luego activar solo ese cron desde la línea de comandos.

Se puede instalar fácilmente a través de composer require-dev n98/magerun2y recomendaría que sea una instalación de desarrollo cuando se trabaja con Magento 2

David modales
fuente
OMG Wao es la mejor manera de ejecutar cronjob con solo un comando
alumno el
4

Puedes lograrlo usando dos archivos:

crear carpeta y clase en la raíz del proyecto 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;
    }
}
?>

Crea otro archivo de clase:

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 ejecutar cron, vaya a cli con la ruta raíz del proyecto y ejecute el siguiente comando:

php crons/cronprocess.php
Pramod Kharade
fuente