Magento 2 запустить определенный Cron без cron: запустить команду CLI?

14

Короче говоря, xdebug не будет надежно останавливаться на точках останова в моих файлах cron при использовании:

php bin/magento cron:run

Xdebug настроен правильно, и иногда он будет работать, но в 85% случаев он не будет работать и просто зависнет в CLI, пока я не отключу прослушивание соединений в phpstorm.

Есть ли способ как-то запустить только один файл cron? Мне пришлось скопировать и вставить содержимое моего файла cron в отдельную консольную команду, чтобы проверить его в xdebug, что не идеально.

В Magento 1.x я использовал планировщик AOE для тестирования заданий cron с помощью Xdebug, зайдя к администратору, установив флажок, который мне нужен, и выбрав run из выпадающего списка, и он работал нормально.

Я ищу использовать что-то вроде:

php bin/magento modulename:cronjob

который должен всегда запускать cron, даже если это не запланировано.

Кевин Чавес
источник

Ответы:

16

Думай просто! Класс Cron - это «нормальный» класс. Мы можем использовать игровую площадку для тестирования нашего Cron: как я могу загрузить Magento 2 в сценарии test.php? , Менеджер объектов создаст наш объект Cron. И затем мы можем проверить наш Cron, вызвав URL прямо в браузере.

** Обратите внимание, что при использовании Nginx вы можете поместить эти файлы в папку pub / и настроить требуемый путь для файла 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;

 }

введите описание изображения здесь

Хоа ТруонгДинь
источник
1
Спасибо, это сработало для меня, но с небольшой настройкой. Поскольку я использую Nginx, он не проверяет корневой каталог, поэтому мне пришлось поместить Test.php и TestApp.php в каталог pub. После этого я скорректировал путь к Test.php с требованием: require '../app/bootstrap.php'; также в TestApp.php должен быть: return $this->_response; или он выдаст ошибку, которая у вас есть на скриншоте phpstorm, но не фактический код. Я постараюсь изменить ваш ответ с этим.
Кевин Чавес
@KevinJavitz, пожалуйста!
Khoa TruongDinh
18

По возможности сэкономить во время разработки можно было бы использовать N98MageRun для Magento 2.

Это имеет прекрасные команды sys:cron:listи sys:cron:run.

Используя эти команды, вы сможете найти конкретный код задания для вашего cron, а затем запустить только этот cron из командной строки.

Его можно легко установить с помощью, composer require-dev n98/magerun2и я бы порекомендовал сделать это при установке dev при работе с Magento 2

Дэвид Мэннерс
источник
OMG Wao лучший способ запустить cronjob с помощью одной команды
ученик
4

Вы можете добиться с помощью двух файлов:

создать папку и класс в корне проекта, как:

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

Создайте другой файл класса:

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);

Для запуска cron перейдите в cli с корневым путем проекта и выполните команду ниже:

php crons/cronprocess.php
Прамод Хараде
источник