Magento 2 exécute un Cron spécifique sans cron: exécuter la commande CLI?

14

Pour faire une longue histoire, xdebug ne s'arrêtera pas de manière fiable sur les points d'arrêt dans mes fichiers cron lors de l'utilisation du typique:

php bin/magento cron:run

Xdebug est tout configuré correctement et parfois cela fonctionnera mais 85% du temps ce ne sera pas le cas et il suffit de se bloquer dans la CLI jusqu'à ce que je désactive l'écoute des connexions dans phpstorm.

Existe-t-il un moyen d'exécuter un seul fichier cron d'une manière ou d'une autre? J'ai dû copier et coller le contenu de mon fichier cron dans une commande de console distincte pour le tester correctement dans xdebug, ce qui n'est pas idéal.

Dans Magento 1.x, j'utilisais le planificateur AOE pour tester les tâches cron avec Xdebug en allant à l'administrateur, en cochant celle que je voulais et en choisissant exécuter dans la liste déroulante et cela a bien fonctionné.

Je cherche à utiliser quelque chose comme:

php bin/magento modulename:cronjob

qui devrait toujours exécuter le cron même s'il n'est pas planifié.

Kevin Chavez
la source

Réponses:

16

Pensez simple! La classe Cron est une classe "normale". Nous pouvons utiliser un Playground pour tester notre Cron: Comment puis-je amorcer Magento 2 dans un script test.php? . Le gestionnaire d'objets créera notre objet Cron. Et puis, nous pouvons tester notre Cron en appelant l'url directement sur le navigateur.

** Notez que si vous utilisez Nginx, vous pouvez placer ces fichiers dans le dossier pub / et ajuster le chemin requis pour le fichier 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;

 }

entrez la description de l'image ici

Khoa TruongDinh
la source
1
Merci, cela a fonctionné pour moi, mais avec quelques ajustements. Puisque j'utilise Nginx, il ne vérifie pas le répertoire racine, j'ai donc dû mettre Test.php et TestApp.php dans le répertoire pub. Après cela, j'ai ajusté le chemin sur Test.php nécessite de: require '../app/bootstrap.php'; également sur TestApp.php, il doit y avoir le: return $this->_response; ou cela générera une erreur que vous avez sur votre capture d'écran de phpstorm mais pas le code réel. Je vais essayer de modifier votre réponse avec cela.
Kevin Chavez
@KevinJavitz vous êtes les bienvenus!
Khoa TruongDinh
18

Une option pour économiser dans le temps de développement serait d'utiliser N98MageRun pour Magento 2.

Cela a les commandes merveilleuses sys:cron:listet sys:cron:run.

À l'aide de ces commandes, vous pourrez trouver le code de travail spécifique pour votre cron, puis déclencher uniquement ce cron à partir de la ligne de commande.

Il peut facilement être installé via composer require-dev n98/magerun2et je recommanderais que ce soit une installation go to dev lorsque vous travaillez avec Magento 2

David Manners
la source
OMG Wao meilleure façon d'exécuter cronjob par une simple commande
Apprenant
4

Vous pouvez réaliser en utilisant deux fichiers:

créer un dossier et une classe à la racine du projet comme:

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;
    }
}
?>

Créez un autre fichier 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);

Pour exécuter cron, accédez à cli avec le chemin racine du projet et exécutez la commande ci-dessous:

php crons/cronprocess.php
Pramod Kharade
la source