Magento 2 einen bestimmten Cron ohne Cron ausführen: CLI-Befehl ausführen?


14

Um es kurz zu machen: xdebug stoppt nicht zuverlässig an den Haltepunkten in meinen Cron-Dateien, wenn das typische verwendet wird:

php bin/magento cron:run

Xdebug ist alles richtig eingerichtet und manchmal funktioniert es, aber in 85% der Fälle funktioniert es nicht und bleibt einfach in der CLI hängen, bis ich das Abhören von Verbindungen in phpstorm ausschalte.

Gibt es eine Möglichkeit, nur eine Cron-Datei auszuführen? Ich musste den Inhalt meiner Cron-Datei tatsächlich kopieren und in einen separaten Konsolenbefehl einfügen, um sie ordnungsgemäß in xdebug zu testen, was nicht ideal ist.

In Magento 1.x habe ich den AOE-Scheduler verwendet, um Cron-Jobs mit Xdebug zu testen, indem ich zum Administrator gegangen bin, den gewünschten angekreuzt und aus der Dropdown-Liste ausgeführt habe, und es hat funktioniert.

Ich suche nach etwas wie:

php bin/magento modulename:cronjob

das sollte immer den cron laufen lassen, auch wenn es nicht terminiert ist.

Antworten:


16

Denke einfach! Die Cron-Klasse ist eine "normale" Klasse. Wir können einen Spielplatz verwenden, um unsere Cron zu testen: Wie kann ich Magento 2 in einem test.php-Skript booten? . Der Objektmanager erstellt unser Cron-Objekt. Und dann können wir unseren Cron testen, indem wir die URL direkt im Browser aufrufen.

** Hinweis: Wenn Sie Nginx verwenden, können Sie diese Dateien in den Pub / Ordner kopieren und den erforderlichen Pfad für die Test.php-Datei anpassen 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;

 }

Bildbeschreibung hier eingeben


1
Danke, das hat bei mir geklappt, aber mit ein wenig Nacharbeit. Da ich Nginx verwende, wird das Stammverzeichnis nicht überprüft, daher musste ich die Dateien Test.php und TestApp.php im Pub-Verzeichnis ablegen. Danach habe ich den Pfad angepasst, den Test.php benötigt, um: require '../app/bootstrap.php'; auch auf der TestApp.php muss es das geben: return $this->_response; oder es wird einen Fehler auslösen, den Sie auf Ihrem phpstorm-Screenshot haben, aber nicht den tatsächlichen Code. Ich werde versuchen, Ihre Antwort damit zu bearbeiten.
Kevin Chavez

@ KevinJavitz Gern geschehen!
Khoa TruongDinh

17

Eine Option zum Einsparen der Entwicklungszeit wäre die Verwendung von N98MageRun für Magento 2.

Das hat die wunderbaren Befehle sys:cron:listund sys:cron:run.

Mit diesen Befehlen können Sie den spezifischen Jobcode für Ihren Cron finden und dann nur diesen Cron über die Befehlszeile auslösen.

Es kann einfach über installiert werden composer require-dev n98/magerun2und ich würde empfehlen, dass es eine Go-to-Dev-Installation ist, wenn Sie mit Magento 2 arbeiten


OMG Wao beste Weg Cronjob nur durch einen Befehl ausgeführt werden soll
Learner

4

Sie können mit zwei Dateien erreichen:

Erstelle einen Ordner und eine Klasse im Stammverzeichnis des Projekts wie:

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

Erstellen Sie eine weitere Klassendatei:

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

Um cron auszuführen, gehe zu cli mit dem Projekt-Root-Pfad und führe den folgenden Befehl aus:

php crons/cronprocess.php

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.