Configuración de un trabajo cron personalizado

Este tutorial paso a paso muestra cómo crear un trabajo cron personalizado y, opcionalmente, un grupo cron en un módulo de muestra. Puede usar un módulo que ya tiene o puede usar un módulo de ejemplo de nuestro repositorio magento2-samples.

La ejecución del trabajo cron hace que se agregue una fila a la tabla cron_schedule con el nombre del trabajo cron custom_cron.

También le mostramos cómo crear opcionalmente un grupo cron, que puede utilizar para ejecutar trabajos cron personalizados con configuraciones distintas a los valores predeterminados de la aplicación Commerce.

En este tutorial, suponemos lo siguiente:

  • La aplicación Commerce está instalada en /var/www/html/magento2
  • Su nombre de usuario y contraseña de la base de datos de Commerce son magento
  • Realiza todas las acciones como propietario del sistema de archivos

Paso 1: Obtener un módulo de muestra

Para configurar un trabajo cron personalizado, necesita un módulo de ejemplo. Sugerimos el módulo magento-module-minimal.

Si ya tiene un módulo de ejemplo, puede utilizarlo; omita este paso y el siguiente y continúe con el Paso 3: Crear una clase para ejecutar cron.

Para obtener un módulo de ejemplo:

  1. Inicie sesión en el servidor de Commerce como propietario del sistema de archivos o cambie a él.

  2. Cambie a un directorio que no esté en la raíz de la aplicación de Commerce (por ejemplo, el directorio principal).

  3. Clonar el repositorio magento2-samples.

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

    Si el comando falla con el error Permission denied (publickey)., debe agregar su clave pública SSH a GitHub.com.

  4. Cree un directorio en el que copiar el código de ejemplo:

    code language-bash
    mkdir -p /var/www/html/magento2/app/code/Magento/SampleMinimal
    
  5. Copie el código del módulo de ejemplo:

    code language-bash
    cp -r ~/magento2-samples/sample-module-minimal/* /var/www/html/magento2/app/code/Magento/SampleMinimal
    
  6. Compruebe que los archivos se han copiado correctamente:

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

    Debería ver el siguiente resultado:

    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. Actualice la base de datos y el esquema de Commerce:

    code language-bash
    bin/magento setup:upgrade
    
  8. Limpie la caché:

    code language-bash
    bin/magento cache:clean
    

Paso 2: Verificar el módulo de ejemplo

Antes de continuar, compruebe que el módulo de ejemplo esté registrado y habilitado.

  1. Ejecute el siguiente comando:

    code language-bash
    bin/magento module:status Magento_SampleMinimal
    
  2. Asegúrese de que el módulo esté activado.

    code language-none
    Module is enabled
    
TIP
Si el resultado indica que Module does not exist, revise el paso 1 con cuidado. Asegúrese de que el código esté en el directorio correcto. La ortografía y el caso son importantes; si algo es diferente, el módulo no se cargará. Además, no olvide ejecutar magento setup:upgrade.

Paso 3: Crear una clase para ejecutar cron

Este paso muestra una clase simple para crear un trabajo cron. La clase solo escribe una fila en la tabla cron_schedule que confirma que se ha configurado correctamente.

Para crear una clase:

  1. Cree un directorio para la clase y cambie a ese directorio:

    code language-bash
    mkdir /var/www/html/magento2/app/code/Magento/SampleMinimal/Cron && cd /var/www/html/magento2/app/code/Magento/SampleMinimal/Cron
    
  2. Se creó un archivo con el nombre Test.php en ese directorio con el siguiente contenido:

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

Paso 4: Crear crontab.xml

El archivo crontab.xml establece una programación para ejecutar el código personalizado cron.

Cree crontab.xml como se indica a continuación en el directorio /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>

El crontab.xml anterior ejecuta la clase Magento/SampleMinimal/Cron/Test.php una vez por minuto, lo que da como resultado que se agregue una fila a la tabla cron_schedule.

Para que la programación de cron se pueda configurar desde el administrador, utilice la ruta de configuración del campo de configuración 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>

Donde, system/config/path es una ruta de acceso de configuración del sistema definida en etc/adminhtml/system.xml de un módulo.

Paso 5: Compilar y limpiar la caché

Compile el código con este comando:

bin/magento setup:di:compile

Y limpie la caché con este comando:

bin/magento cache:clean

Paso 6: Verificar el trabajo de cron

Este paso muestra cómo comprobar correctamente el trabajo cron personalizado mediante una consulta SQL en la tabla de base de datos cron_schedule.

Para verificar cron:

  1. Ejecutar trabajos cron de Commerce:

    code language-bash
    bin/magento cron:run
    
  2. Escriba el comando magento cron:run dos o tres veces.

    La primera vez que se introduce el comando, se ponen en cola los trabajos; posteriormente, se ejecutan los trabajos cron. Debe escribir el comando al menos dos veces.

  3. Ejecute la consulta SQL SELECT * from cron_schedule WHERE job_code like '%custom%' de la siguiente manera:

    1. Ingresar mysql -u magento -p

    2. En el mysql>, escriba use magento;

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

      El resultado debe ser similar al siguiente:

      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. (Opcional) Compruebe que los mensajes se escriben en el registro del sistema de Commerce:

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

    Debería ver una o más entradas como la siguiente:

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

    Estos mensajes provienen del método execute en Test.php:

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

Si el comando SQL y el registro del sistema no contienen ninguna entrada, ejecute el comando magento cron:run varias veces más y espere. La base de datos puede tardar algún tiempo en actualizarse.

Paso 7 (opcional): Configurar un grupo cron personalizado

Este paso muestra cómo configurar opcionalmente un grupo cron personalizado. Debe configurar un grupo cron personalizado si desea que el trabajo cron personalizado se ejecute en una programación diferente a otras tareas cron (normalmente, una vez por minuto) o si desea que varios trabajos cron personalizados se ejecuten con configuraciones diferentes.

Para configurar un grupo cron personalizado:

  1. Abra crontab.xml en un editor de texto.

  2. Cambiar <group id="default"> a <group id="custom_crongroup">

  3. Salga del editor de texto.

  4. Crear /var/www/html/magento2/app/code/Magento/SampleMinimal/etc/cron_groups.xml con el siguiente contenido:

    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>
    

Para obtener una descripción del significado de las opciones, consulte Personalización de la referencia de crons.

Paso 8: Verificar su grupo personalizado de cron

Este paso opcional muestra cómo comprobar el grupo cron personalizado mediante el administrador.

Para verificar su grupo cron personalizado:

  1. Ejecute trabajos cron de Commerce para su grupo personalizado:

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

    Ejecute el comando al menos dos veces.

  2. Limpie la caché:

    code language-bash
    php /var/www/html/magento2/bin/magento cache:clean
    
  3. Inicie sesión en el administrador como administrador.

  4. Haga clic en Tiendas > Configuración > Configuración > Avanzado > Sistema.

  5. En el panel derecho, expanda Cron.

    El grupo de cron se muestra de la siguiente manera:

    Su grupo cron personalizado

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