Configurare un processo cron personalizzato

Questa esercitazione dettagliata mostra come creare un processo cron personalizzato e facoltativamente un gruppo cron in un modulo di esempio. Puoi utilizzare un modulo che già disponi oppure un modulo di esempio dal nostro archivio magento2-samples.

L'esecuzione del processo cron comporta l'aggiunta di una riga alla tabella cron_schedule con il nome del processo cron, custom_cron.

Viene inoltre illustrato come creare facoltativamente un gruppo cron, che è possibile utilizzare per eseguire processi cron personalizzati con impostazioni diverse dai valori predefiniti dell'applicazione Commerce.

In questo tutorial, si presuppone quanto segue:

  • Applicazione Commerce installata in /var/www/html/magento2
  • Il nome utente e la password del database Commerce sono entrambi magento
  • Tutte le azioni vengono eseguite come proprietario del file system

Passaggio 1: ottenere un modulo di esempio

Per impostare un processo cron personalizzato, è necessario un modulo di esempio. È consigliabile utilizzare il modulo magento-module-minimal.

Se disponi già di un modulo di esempio, puoi utilizzarlo; salta questo passaggio e quello successivo e continua con il Passaggio 3: Creare una classe per eseguire cron.

Per ottenere un modulo di esempio:

  1. Accedi al server Commerce come proprietario del file system o passa a tale proprietario.

  2. Passare a una directory non presente nella directory principale dell'applicazione Commerce, ad esempio la home directory.

  3. Clonare l'archivio magento2-samples.

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

    Se il comando non riesce e viene restituito l'errore Permission denied (publickey)., è necessario aggiungere la chiave pubblica SSH a GitHub.com.

  4. Creare una directory in cui copiare il codice di esempio:

    code language-bash
    mkdir -p /var/www/html/magento2/app/code/Magento/SampleMinimal
    
  5. Copia il codice del modulo di esempio:

    code language-bash
    cp -r ~/magento2-samples/sample-module-minimal/* /var/www/html/magento2/app/code/Magento/SampleMinimal
    
  6. Verifica i file copiati correttamente:

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

    Dovresti visualizzare il seguente risultato:

    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. Aggiornare il database e lo schema di Commerce:

    code language-bash
    bin/magento setup:upgrade
    
  8. Pulisci la cache:

    code language-bash
    bin/magento cache:clean
    

Passaggio 2: verificare il modulo di esempio

Prima di continuare, verifica che il modulo di esempio sia registrato e abilitato.

  1. Esegui il comando seguente:

    code language-bash
    bin/magento module:status Magento_SampleMinimal
    
  2. Assicurati che il modulo sia abilitato.

    code language-none
    Module is enabled
    
TIP
Se l'output indica che Module does not exist, rivedere con attenzione Passaggio 1. Verifica che il codice si trovi nella directory corretta. L’ortografia e la distinzione tra maiuscole e minuscole sono importanti; se qualcosa è diverso, il modulo non viene caricato. Inoltre, non dimenticare di eseguire magento setup:upgrade.

Passaggio 3: creare una classe per eseguire cron

Questo passaggio mostra una classe semplice per creare un processo cron. La classe scrive solo una riga nella tabella cron_schedule che conferma la corretta configurazione.

Per creare una classe:

  1. Creare una directory per la classe e passare a tale directory:

    code language-bash
    mkdir /var/www/html/magento2/app/code/Magento/SampleMinimal/Cron && cd /var/www/html/magento2/app/code/Magento/SampleMinimal/Cron
    
  2. È stato creato un file denominato Test.php nella directory con il contenuto seguente:

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

Passaggio 4: creare crontab.xml

Il file crontab.xml imposta una pianificazione per eseguire il codice cron personalizzato.

Creare crontab.xml come segue nella directory /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>

crontab.xml precedente esegue la classe Magento/SampleMinimal/Cron/Test.php una volta al minuto, causando l'aggiunta di una riga alla tabella cron_schedule.

Per poter configurare la pianificazione cron dall’amministratore, utilizza il percorso di configurazione del campo di configurazione del sistema.

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

Dove system/config/path è un percorso di configurazione di sistema definito in etc/adminhtml/system.xml di un modulo.

Passaggio 5: compilazione e pulizia della cache

Compila il codice con questo comando:

bin/magento setup:di:compile

E pulisci la cache con questo comando:

bin/magento cache:clean

Passaggio 6: verificare il processo cron

Questo passaggio mostra come verificare il processo cron personalizzato utilizzando una query SQL nella tabella di database cron_schedule.

Per verificare cron:

  1. Esegui processi Commerce cron:

    code language-bash
    bin/magento cron:run
    
  2. Immettere il comando magento cron:run due o tre volte.

    La prima volta che si immette il comando, vengono messi in coda i processi, quindi vengono eseguiti i processi cron. Immettere il comando almeno due volte.

  3. Eseguire la query SQL SELECT * from cron_schedule WHERE job_code like '%custom%' come segue:

    1. Immetti mysql -u magento -p

    2. Al prompt mysql>, immettere use magento;

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

      Il risultato deve essere simile al seguente:

      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. (Facoltativo) Verificare che i messaggi vengano scritti nel registro di sistema di Commerce:

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

    Dovresti visualizzare una o più voci come le seguenti:

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

    Questi messaggi provengono dal metodo execute in Test.php:

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

Se il comando SQL e il log di sistema non contengono voci, eseguire il comando magento cron:run altre volte e attendere. L'aggiornamento del database può richiedere del tempo.

Passaggio 7 (facoltativo): configurare un gruppo cron personalizzato

Questo passaggio mostra come impostare facoltativamente un gruppo cron personalizzato. È necessario impostare un gruppo cron personalizzato se si desidera che il processo cron personalizzato venga eseguito con una pianificazione diversa rispetto agli altri processi cron (in genere, una volta al minuto) o se si desidera che vengano eseguiti più processi cron personalizzati con impostazioni diverse.

Per impostare un gruppo cron personalizzato:

  1. Apri crontab.xml in un editor di testo.

  2. Cambia <group id="default"> in <group id="custom_crongroup">

  3. Esci dall’editor di testo.

  4. Crea /var/www/html/magento2/app/code/Magento/SampleMinimal/etc/cron_groups.xml con il seguente contenuto:

    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>
    

Per una descrizione del significato delle opzioni, vedere Personalizzazione del riferimento crons.

Passaggio 8: verificare il gruppo cron personalizzato

Questo passaggio facoltativo mostra come verificare il gruppo cron personalizzato utilizzando l'amministratore.

Per verificare il gruppo cron personalizzato:

  1. Esegui processi cron Commerce per il gruppo personalizzato:

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

    Esegui il comando almeno due volte.

  2. Pulisci la cache:

    code language-bash
    php /var/www/html/magento2/bin/magento cache:clean
    
  3. Accedi all’amministratore come amministratore.

  4. Fai clic su Archivi > Impostazioni > Configurazione > Avanzate > Sistema.

  5. Nel riquadro destro espandere Cron.

    Il gruppo cron viene visualizzato come segue:

    Gruppo cron personalizzato

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