Magento 2 uruchamia określony Cron bez crona: uruchomić komendę CLI?


14

Krótko mówiąc, xdebug nie zatrzyma się niezawodnie na punktach przerwania w moich plikach cron, gdy używasz typowego:

php bin/magento cron:run

Xdebug jest poprawnie skonfigurowany i czasami zadziała, ale 85% czasu nie zadziała i po prostu zawiesi się w CLI, dopóki nie wyłączę nasłuchiwania połączeń w phpstorm.

Czy istnieje sposób na uruchomienie tylko jednego pliku cron? Musiałem faktycznie skopiować i wkleić zawartość mojego pliku cron do osobnego polecenia konsoli, aby poprawnie przetestować go w xdebug, co nie jest idealne.

W Magento 1.x korzystałem z AOE Scheduler do testowania zadań cron z Xdebug, przechodząc do administratora, zaznaczając to, które chciałem, i wybierając z menu rozwijanego uruchamianie i działało dobrze.

Chcę użyć czegoś takiego:

php bin/magento modulename:cronjob

który powinien zawsze uruchamiać crona, nawet jeśli nie jest to zaplanowane.

Odpowiedzi:


16

Myśl prosto! Klasa Cron jest klasą „normalną”. Możemy użyć Playground do przetestowania naszego Crona: Jak mogę uruchomić Magento 2 w skrypcie test.php? . Menedżer obiektów utworzy nasz obiekt Cron. Następnie możemy przetestować naszego Crona, dzwoniąc na adres URL bezpośrednio w przeglądarce.

** Uwaga: jeśli używasz Nginx, możesz umieścić te pliki w folderze pub / folder i dostosować wymaganą ścieżkę pliku Test.php do 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;

 }

wprowadź opis zdjęcia tutaj


1
Dziękuję, to zadziałało dla mnie, ale z drobnymi poprawkami. Ponieważ używam Nginx, nie sprawdza katalogu głównego, więc musiałem umieścić Test.php i TestApp.php w katalogu pub. Następnie dostosowałem ścieżkę wymaganą na Test.php: require '../app/bootstrap.php'; także na TestApp.php musi być: return $this->_response; lub spowoduje wyświetlenie błędu, który masz na zrzucie ekranu phpstorm, ale nie rzeczywistego kodu. Spróbuję w ten sposób edytować twoją odpowiedź.
Kevin Chavez

@KevinJavitz nie ma za co!
Khoa TruongDinh

18

Opcją oszczędzania czasu programowania byłoby użycie N98MageRun dla Magento 2.

Ma to wspaniałe polecenia sys:cron:listi sys:cron:run.

Za pomocą tych poleceń będziesz w stanie znaleźć konkretny kod zadania dla twojego crona, a następnie uruchomić tylko ten cron z linii poleceń.

Można go łatwo zainstalować za pośrednictwem composer require-dev n98/magerun2i zalecałbym, aby przejść do instalacji programistów podczas pracy z Magento 2


OMG Wao najlepszym sposobem, aby uruchomić cronjob za pomocą jednego polecenia
Learner

4

Możesz to osiągnąć za pomocą dwóch plików:

utwórz folder i klasę w katalogu głównym projektu, np .:

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

Utwórz kolejny plik klasy:

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

Aby uruchomić crona, przejdź do cli ze ścieżką katalogu głównego projektu i uruchom poniższe polecenie:

php crons/cronprocess.php

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.