配置自定义cron作业

此分步教程将演示如何在示例模块中创建自定义cron作业和(可选)cron组。 您可以使用已有的模块,也可以使用我们magento2-samples存储库中的示例模块。

运行cron作业会导致向cron_schedule表中添加一个名为cron作业custom_cron的行。

我们还将向您说明如何选择创建一个cron组,以便您能够使用该组通过Commerce应用程序默认值以外的设置运行自定义cron作业。

在本教程中,我们假定:

  • Commerce应用程序安装在/var/www/html/magento2
  • 您的Commerce数据库用户名和密码均为magento
  • 您以文件系统所有者的身份执行所有操作

步骤1:获取示例模块

要设置自定义cron作业,您需要一个示例模块。 我们建议magento-module-minimal模块。

如果您已经有一个示例模块,则可以使用该模块;跳过此步骤和下一步,继续步骤3:创建类以运行cron。

获取示例模块

  1. 文件系统所有者的身份登录或切换到Commerce服务器。

  2. 更改为不在Commerce应用程序根目录中的目录(例如,主目录)。

  3. 克隆magento2-samples存储库

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

    如果命令失败,出现错误Permission denied (publickey).,您必须将SSH公钥添加到GitHub.com

  4. 创建要将示例代码复制到其中的目录:

    code language-bash
    mkdir -p /var/www/html/magento2/app/code/Magento/SampleMinimal
    
  5. 复制示例模块代码:

    code language-bash
    cp -r ~/magento2-samples/sample-module-minimal/* /var/www/html/magento2/app/code/Magento/SampleMinimal
    
  6. 验证是否正确复制了文件:

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

    您应会看到以下结果:

    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. 更新Commerce数据库和架构:

    code language-bash
    bin/magento setup:upgrade
    
  8. 清理缓存:

    code language-bash
    bin/magento cache:clean
    

第2步:验证示例模块

在继续之前,请验证是否已注册并启用示例模块。

  1. 运行以下命令:

    code language-bash
    bin/magento module:status Magento_SampleMinimal
    
  2. 确保模块已启用。

    code language-none
    Module is enabled
    
TIP
如果输出指示Module does not exist,请仔细查看步骤1。 确保代码位于正确的目录中。 拼写和大小写很重要;如果有任何不同,则不会加载模块。 另外,不要忘记运行magento setup:upgrade

步骤3:创建一个类以运行cron

此步骤显示用于创建cron作业的简单类。 该类仅向cron_schedule表中写入一行,以确认已成功设置该类。

要创建类:

  1. 为类创建一个目录并转到该目录:

    code language-bash
    mkdir /var/www/html/magento2/app/code/Magento/SampleMinimal/Cron && cd /var/www/html/magento2/app/code/Magento/SampleMinimal/Cron
    
  2. 在该目录中创建了一个名为Test.php的文件,其内容如下:

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

步骤4:创建crontab.xml

crontab.xml文件设置运行自定义cron代码的计划。

按如下方式在/var/www/html/magento2/app/code/Magento/SampleMinimal/etc目录中创建crontab.xml

<?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每分钟运行一次Magento/SampleMinimal/Cron/Test.php类,从而在cron_schedule表中添加了一行。

要使管理员能够配置cron计划,请使用系统配置字段的配置路径。

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

其中,system/config/path是在模块的etc/adminhtml/system.xml中定义的系统配置路径。

步骤5:编译和缓存清理

使用以下命令编译代码:

bin/magento setup:di:compile

并使用以下命令清除缓存:

bin/magento cache:clean

步骤6:验证cron作业

此步骤显示如何使用cron_schedule数据库表上的SQL查询成功验证自定义cron作业。

验证cron:

  1. 运行Commerce cron作业:

    code language-bash
    bin/magento cron:run
    
  2. 输入magento cron:run命令两或三次。

    第一次输入该命令时,它将作业排入队列;随后,将运行cron作业。 必须输入命令​ 至少 ​两次。

  3. 按如下方式运行SQL查询SELECT * from cron_schedule WHERE job_code like '%custom%'

    1. 输入mysql -u magento -p

    2. mysql>提示下,输入use magento;

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

      结果应类似于以下内容:

      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. (可选)验证消息是否已写入Commerce的系统日志:

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

    您应会看到一个或多个条目,如下所示:

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

    这些消息来自Test.php中的execute方法:

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

如果SQL命令和系统日志不包含任何条目,请再运行几次magento cron:run命令并等待。 更新数据库可能需要一些时间。

步骤7(可选):设置自定义cron组

此步骤说明如何根据需要设置自定义cron组。 如果您希望自定义cron作业以与其他cron作业不同的计划运行(通常每分钟运行一次),或者如果您希望使用不同的设置运行多个自定义cron作业,则应该设置自定义cron组。

要设置自定义cron组,请执行以下操作:

  1. 在文本编辑器中打开crontab.xml

  2. <group id="default">更改为<group id="custom_crongroup">

  3. 退出文本编辑器。

  4. 创建包含以下内容的/var/www/html/magento2/app/code/Magento/SampleMinimal/etc/cron_groups.xml

    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>
    

有关选项含义的说明,请参阅自定义crons引用

步骤8:验证您的自定义cron组

此​ 可选 ​步骤显示如何使用管理员验证您的自定义cron组。

验证您的自定义cron组:

  1. 为自定义组运行Commerce cron作业:

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

    至少运行命令两次。

  2. 清理缓存:

    code language-bash
    php /var/www/html/magento2/bin/magento cache:clean
    
  3. 以管理员身份登录到管理员。

  4. 单击​ 存储 > 设置 > 配置 > 高级 > 系统

  5. 在右窗格中,展开​ Cron

    您的cron组显示如下:

    您的自定义cron组

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