設定自訂cron作業

此逐步教學課程說明如何在範例模組中建立自訂cron工作以及選用的cron群組。 您可以使用您已擁有的模組,或使用我們magento2-samples存放庫的範例模組。

執行cron工作會導致將資料列新增到cron_schedule表格中,且名稱為cron工作custom_cron

我們也會說明如何選擇性地建立cron群組,以便您使用Commerce應用程式預設值以外的設定來執行自訂cron作業。

在本教學課程中,我們假設以下幾點:

  • 已在/var/www/html/magento2中安裝Commerce應用程式
  • 您的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資料表。

若要讓Admin設定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