Konfigurieren eines benutzerdefinierten Cron-Auftrags

Dieses Schritt-für-Schritt-Tutorial zeigt, wie Sie einen benutzerdefinierten Cron-Auftrag und optional eine Cron-Gruppe in einem Beispielmodul erstellen. Sie können ein Modul verwenden, das Sie bereits haben, oder Sie können ein Beispielmodul aus unserem magento2-samples Repository verwenden.

Das Ausführen des Cron-Vorgangs führt dazu, dass der cron_schedule-Tabelle eine Zeile mit dem Namen des Cron-Vorgangs custom_cron hinzugefügt wird.

Wir zeigen Ihnen auch, wie Sie optional eine Cron-Gruppe erstellen, mit der Sie benutzerdefinierte Cron-Aufträge mit anderen Einstellungen als den Standardeinstellungen der Commerce-Anwendung ausführen können.

In diesem Tutorial gehen wir von Folgendem aus:

  • Die Commerce-Anwendung wird in /var/www/html/magento2 installiert
  • Benutzername und Kennwort für die Commerce-Datenbank sind beide magento
  • Sie führen alle Aktionen als Dateisystemeigentümer“

Schritt 1: Abrufen eines Beispielmoduls

Um einen benutzerdefinierten Cron-Auftrag einzurichten, benötigen Sie ein Beispielmodul. Wir empfehlen das Modul magento-module-minimal.

Wenn Sie bereits über ein Beispielmodul verfügen, können Sie es verwenden. Überspringen Sie diesen Schritt und den nächsten Schritt und fahren Sie mit Schritt 3: Erstellen einer Klasse zum Ausführen von Cron fort.

So rufen Sie ein Beispielmodul:

  1. Melden Sie sich bei Ihrem Commerce-Server als oder wechseln Sie zum Dateisystembesitzer.

  2. Wechseln Sie in einen Ordner, der sich nicht im Stammverzeichnis der Commerce-Anwendung befindet (z. B. den Basisordner).

  3. Klonen Sie das magento2-samples Repository.

    code language-bash
    git clone git@github.com:magento/magento2-samples.git
    

    Wenn der Befehl mit der Permission denied (publickey). fehlschlägt, müssen Sie Ihren öffentlichen SSH-Schlüssel zu GitHub.com hinzufügen.

  4. Erstellen Sie ein Verzeichnis, in das der Beispiel-Code kopiert werden soll:

    code language-bash
    mkdir -p /var/www/html/magento2/app/code/Magento/SampleMinimal
    
  5. Kopieren Sie den Beispiel-Modul-Code:

    code language-bash
    cp -r ~/magento2-samples/sample-module-minimal/* /var/www/html/magento2/app/code/Magento/SampleMinimal
    
  6. Überprüfen Sie, ob die Dateien ordnungsgemäß kopiert wurden:

    code language-bash
    ls -al /var/www/html/magento2/app/code/Magento/SampleMinimal
    

    Sie sollten das folgende Ergebnis sehen:

    code language-none
    drwxrwsr-x.   4 magento_user apache  4096 Oct 30 13:19 .
    drwxrwsr-x. 121 magento_user apache  4096 Oct 30 13:19 ..
    -rw-rw-r--.   1 magento_user apache   372 Oct 30 13:19 composer.json
    drwxrwsr-x.   2 magento_user apache  4096 Oct 30 13:19 etc
    -rw-rw-r--.   1 magento_user apache 10376 Oct 30 13:19 LICENSE_AFL.txt
    -rw-rw-r--.   1 magento_user apache 10364 Oct 30 13:19 LICENSE.txt
    -rw-rw-r--.   1 magento_user apache  1157 Oct 30 13:19 README.md
    -rw-rw-r--.   1 magento_user apache   270 Oct 30 13:19 registration.php
    drwxrwsr-x.   3 magento_user apache  4096 Oct 30 13:19 Test
    
  7. Aktualisieren Sie die Commerce-Datenbank und das -Schema:

    code language-bash
    bin/magento setup:upgrade
    
  8. Cache leeren:

    code language-bash
    bin/magento cache:clean
    

Schritt 2: Überprüfen des Beispielmoduls

Bevor Sie fortfahren, überprüfen Sie, ob das Beispielmodul registriert und aktiviert ist.

  1. Führen Sie den folgenden Befehl aus:

    code language-bash
    bin/magento module:status Magento_SampleMinimal
    
  2. Stellen Sie sicher, dass das Modul aktiviert ist.

    code language-none
    Module is enabled
    
TIP
Wenn die Ausgabe anzeigt, dass die Module does not exist, überprüfen Sie Schritt 1 sorgfältig. Stellen Sie sicher, dass sich Ihr Code im richtigen Verzeichnis befindet. Wichtig sind Rechtschreibung und Groß-/Kleinschreibung. Wenn etwas anders ist, wird das Modul nicht geladen. Vergessen Sie auch nicht, magento setup:upgrade auszuführen.

Schritt 3: Erstellen Sie eine Klasse, um Cron auszuführen

Dieser Schritt zeigt eine einfache Klasse zum Erstellen eines Cron-Auftrags. Die Klasse schreibt nur eine Zeile in die cron_schedule, die bestätigt, dass sie erfolgreich eingerichtet wurde.

So erstellen Sie eine Klasse:

  1. Erstellen Sie ein Verzeichnis für die Klasse und wechseln Sie in dieses Verzeichnis:

    code language-bash
    mkdir /var/www/html/magento2/app/code/Magento/SampleMinimal/Cron && cd /var/www/html/magento2/app/code/Magento/SampleMinimal/Cron
    
  2. Eine Datei mit dem Namen Test.php in diesem Verzeichnis mit folgendem Inhalt wurde erstellt:

    code language-php
    <?php
    namespace Magento\SampleMinimal\Cron;
    
    use Psr\Log\LoggerInterface;
    
    class Test {
        protected $logger;
    
        public function __construct(LoggerInterface $logger) {
            $this->logger = $logger;
        }
    
       /**
        * Write to system.log
        *
        * @return void
        */
        public function execute() {
            $this->logger->info('Cron Works');
        }
    }
    

Schritt 4: crontab.xml erstellen

Die crontab.xml-Datei legt einen Zeitplan für die Ausführung Ihres benutzerdefinierten Cron-Codes fest.

Erstellen Sie crontab.xml wie folgt im /var/www/html/magento2/app/code/Magento/SampleMinimal/etc:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Cron:etc/crontab.xsd">
    <group id="default">
        <job name="custom_cronjob" instance="Magento\SampleMinimal\Cron\Test" method="execute">
            <schedule>* * * * *</schedule>
        </job>
    </group>
</config>

Im vorherigen crontab.xml wird die Magento/SampleMinimal/Cron/Test.php-Klasse einmal pro Minute ausgeführt, sodass der cron_schedule-Tabelle eine Zeile hinzugefügt wird.

Um den Cron-Zeitplan über den Administrator konfigurierbar zu machen, verwenden Sie den Konfigurationspfad Ihres Systemkonfigurationsfelds.

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Cron:etc/crontab.xsd">
    <group id="default">
        <job name="custom_cronjob" instance="Magento\SampleMinimal\Cron\Test" method="execute">
            <config_path>system/config/path</config_path>
        </job>
    </group>
</config>

Dabei ist system/config/path ein Systemkonfigurationspfad, der etc/adminhtml/system.xml eines Moduls definiert ist.

Schritt 5: Kompilieren und Cache leeren

Kompilieren Sie den Code mit diesem Befehl:

bin/magento setup:di:compile

Bereinigen Sie den Cache mit diesem Befehl:

bin/magento cache:clean

Schritt 6: Cron-Auftrag überprüfen

Dieser Schritt zeigt, wie Sie den benutzerdefinierten Cron-Auftrag mithilfe einer SQL-Abfrage in der cron_schedule Datenbanktabelle erfolgreich überprüfen.

Cron überprüfen:

  1. Commerce Cron-Aufträge ausführen:

    code language-bash
    bin/magento cron:run
    
  2. Geben Sie den magento cron:run-Befehl zwei- oder dreimal ein.

    Wenn Sie den Befehl zum ersten Mal eingeben, werden Aufträge in die Warteschlange gestellt. Anschließend werden die Cron-Aufträge ausgeführt. Sie müssen den Befehl mindestens zweimal eingeben.

  3. Führen Sie die SQL-Abfrage SELECT * from cron_schedule WHERE job_code like '%custom%' wie folgt aus:

    1. mysql -u magento -p eingeben

    2. Geben Sie an der mysql> Eingabeaufforderung use magento;

    3. SELECT * from cron_schedule WHERE job_code like '%custom%'; eingeben

      Das Ergebnis sollte in etwa wie folgt aussehen:

      code language-none
      +-------------+----------------+---------+----------+---------------------+---------------------+---------------------+---------------------+
      | schedule_id | job_code       | status  | messages | created_at        | scheduled_at        | executed_at         | finished_at     |
      +-------------+----------------+---------+----------+---------------------+---------------------+---------------------+---------------------+
      |        3670 | custom_cronjob | success | NULL     | 2016-11-02 09:38:03 | 2016-11-02 09:38:00 | 2016-11-02 09:39:03 | 2016-11-02 09:39:03 |
      |        3715 | custom_cronjob | success | NULL     | 2016-11-02 09:53:03 | 2016-11-02 09:53:00 | 2016-11-02 09:54:04 | 2016-11-02 09:54:04 |
      |        3758 | custom_cronjob | success | NULL     | 2016-11-02 10:09:03 | 2016-11-02 10:09:00 | 2016-11-02 10:10:03 | 2016-11-02 10:10:03 |
      |        3797 | custom_cronjob | success | NULL     | 2016-11-02 10:24:03 | 2016-11-02 10:24:00 | 2016-11-02 10:25:03 | 2016-11-02 10:25:03 |
      +-------------+----------------+---------+----------+---------------------+---------------------+---------------------+---------------------+
      
  4. (Optional) Überprüfen Sie, ob Meldungen in das Systemprotokoll von Commerce geschrieben werden:

    code language-bash
    cat /var/www/html/magento2/var/log/system.log
    

    Es sollte mindestens ein Eintrag wie der folgende angezeigt werden:

    code language-none
    [2016-11-02 22:17:03] main.INFO: Cron Works [] []
    

    Diese Nachrichten stammen von der execute-Methode in Test.php:

    code language-php
    public function execute() {
         $this->logger->info('Cron Works');
    

Wenn der SQL-Befehl und das Systemprotokoll keine Einträge enthalten, führen Sie den magento cron:run-Befehl noch einige Male aus und warten Sie. Es kann einige Zeit dauern, bis die Datenbank aktualisiert wird.

Schritt 7 (optional): Eine benutzerdefinierte Cron-Gruppe einrichten

Dieser Schritt zeigt, wie Sie optional eine benutzerdefinierte Cron-Gruppe einrichten. Sie sollten eine benutzerdefinierte Cron-Gruppe einrichten, wenn Sie möchten, dass Ihr benutzerdefinierter Cron-Auftrag nach einem anderen Zeitplan ausgeführt wird als andere Cron-Aufträge (in der Regel einmal pro Minute) oder wenn Sie möchten, dass mehrere benutzerdefinierte Cron-Aufträge mit unterschiedlichen Einstellungen ausgeführt werden.

So richten Sie eine benutzerdefinierte Cron-Gruppe ein:

  1. Öffnen Sie crontab.xml in einem Texteditor.

  2. <group id="default"> in <group id="custom_crongroup"> ändern

  3. Beenden Sie den Texteditor.

  4. Erstellen Sie /var/www/html/magento2/app/code/Magento/SampleMinimal/etc/cron_groups.xml mit folgendem Inhalt:

    code language-xml
    <?xml version="1.0"?>
    <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Cron:etc/cron_groups.xsd">
        <group id="custom_crongroup">
            <schedule_generate_every>1</schedule_generate_every>
            <schedule_ahead_for>4</schedule_ahead_for>
            <schedule_lifetime>2</schedule_lifetime>
            <history_cleanup_every>10</history_cleanup_every>
            <history_success_lifetime>60</history_success_lifetime>
            <history_failure_lifetime>600</history_failure_lifetime>
            <use_separate_process>1</use_separate_process>
        </group>
    </config>
    

Eine Beschreibung der Bedeutung der Optionen finden Sie unter Anpassen der Cron-Referenz.

Schritt 8: Überprüfen Sie Ihre benutzerdefinierte Cron-Gruppe

Dieser optionale Schritt zeigt, wie Sie Ihre benutzerdefinierte Cron-Gruppe mit dem Administrator überprüfen können.

So überprüfen Sie Ihre benutzerdefinierte Cron-Gruppe:

  1. Ausführen von Commerce-Cron-Aufträgen für Ihre benutzerdefinierte Gruppe:

    code language-bash
    php /var/www/html/magento2/bin/magento cron:run --group="custom_crongroup"
    

    Führen Sie den Befehl mindestens zweimal aus.

  2. Cache leeren:

    code language-bash
    php /var/www/html/magento2/bin/magento cache:clean
    
  3. Melden Sie sich bei Admin als Admin an.

  4. Klicken Sie auf Stores > Einstellungen > Konfiguration > Erweitert > System.

  5. Erweitern Sie im rechten Bereich Cron.

    Ihre Cron-Gruppe wird wie folgt angezeigt:

    Ihre benutzerdefinierte Cron-Gruppe

recommendation-more-help
386822bd-e32c-40a8-81c2-ed90ad1e198c