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


14

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

php bin/magento cron:run

У Xdebug все налаштовано належним чином, а іноді він буде працювати, але 85% часу він не буде, а просто зависає в CLI, поки я не відключу прослуховування з'єднань у phpstorm.

Чи є спосіб запустити лише один файл cron? Мені довелося фактично скопіювати та вставити вміст мого файлу cron в окрему команду консолі, щоб перевірити її належним чином у xdebug, що не ідеально.

У Magento 1.x я використовував AOE Scheduler для тестування завдань Cron з Xdebug, перейшовши до адміністратора, встановивши прапорець, який я хотів, і вибрав запустити з випадаючого меню, і він працював чудово.

Я хочу використовувати щось на кшталт:

php bin/magento modulename:cronjob

який завжди повинен запускати крон, навіть якщо він не запланований.

Відповіді:


16

Думайте просто! Клас Cron - це "нормальний" клас. Ми можемо використовувати ігровий майданчик для тестування нашого Cron: Як я можу завантажувати Magento 2 у сценарії test.php? . Менеджер об'єктів створить наш Cron Object. Тоді ми можемо перевірити наш Cron, зателефонувавши за адресою безпосередньо в браузер.

** Зверніть увагу, якщо за допомогою Nginx ви можете помістити ці файли в папку / папку і відрегулювати потрібний шлях для файлу 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 в паб-каталог. Після цього я відкоригував шлях на 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і я б рекомендував, щоб це працювало з Magento 2


OMG Wao - найкращий спосіб запустити роботу за допомогою команд
Learner

4

Ви можете досягти, використовуючи два файли:

створити папку та клас у корені проекту, як:

крони / 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;
    }
}
?>

Створіть ще один файл класу:

крони / 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.