Magento2 Cron(クロン)の設定方法

By |2018-03-21T12:17:16+09:002018年3月16日|Categories: Magentoの設定, SiteGroundについて|Tags: , , |

1. Cronとは

前回のMagento2日本語化の記事では、Composerを使ったインストール方法を紹介いたしました。Composerは、Magentoの初心者にとってとっつきにくい、分かったような分からないような躓きの要因の一つですが、Magento2では、このComposerと並んで、もう一つ、Cron(クロン)というものも、なかなか面倒な存在です。

例えば、Magento2を苦労してようやっとインストールした直後、管理画面にアクセスすると、以下の画像のようなメッセージで迎えられることがあります。

Magento2 Indexer Invalid エラー Cronが動いていない

One or more indexers are invalid. Make sure your Magento cron job is running.「一つ以上のIndexが無効です。MagentoのCronが動いているか確認してください」という意味で、まだCronが設定されていないことを伝えています。「invalid」という不穏な響きの言葉のせいで、インストール直後の喜びが台無しになります。(というか、なりました。私は。)

Cron(クロン)というのは、UNIX系のコンピュータで、時間ごとにスケジュールを決めて動作するプログラムのことです。ギリシャ語のChronos(時間)を語源にしているようです。
Magento2では、多くの機能をCronに依存するシステム構成になっており、Cronがないと作動しない重要な機能としては、以下のものがあります。

  • Magento2からのメール送信(注文確認や発送完了メールなど)
  • Reindexing – 商品やカテゴリなど変更データのアップデート/フロントへの反映
  • 商品価格ルールの変更
  • ニュースレターの配信
  • ユーザーへの通知(価格変更や在庫数のお知らせメール)
  • 為替レートの自動更新
  • Googleサイトマップxmlの生成

このリストをざっと見るだけでも、Cronが設定されていないと、Magento2がECプラットフォームとしてはきちんと機能してくれないことが分かります。

Magento1.9系においても、Cronの設定は必要でしたが、ここまで大きな役割を持つことはありませんでした。Indexについても、Magento1では、管理画面からクリックするだけで手動でReindexを行うことができました。ところが、Magento2においては、Cronが動いていないとindexerも動かないので、新規で商品やカテゴリを登録すると、キャッシュのクリアだけではデータが更新されず、フロントに反映されないという事態にぶつかります。

冒頭のindexerのエラーメッセージはこの状態へのアラームなのですが、とりあえずindexエラーを解消するだけであれば、SSHアクセスでMagento2のルートへ移動し、reindexコマンドを実行することで解決できます。

cd [magento-root-path]
php bin/magento  indexer:reindex

上記でindexerが動き、管理画面 System>Index Managementの赤いエラーバーも緑色に変化します。

しかし、Cronが動くようにならないとMagento2のシステムは不完全なままなので、本番環境への移行前には、必ずCronを設定し、Cronがきちんと動いていることを確認する必要があります。

実は、Magentoのための海外サーバーで紹介しているSiteGroundでは、1クリックでMagentoをインストールすると、Magento2のためのCronコマンドが自動でサーバー側に設定されます。バージョンやプランによりそのままでは使えないのですが、基本コマンドは設定されるので、インストールの後に、PHPバイナリーやスケジュールの修正を、cPaneからl編集することになります。
SiteGroundをご利用されている方は、次項の、cPanelでのCron設定方法を参照してください。

Cronの設定については、cPanelのある環境か、または、VPSやクラウドなどcPanelのない環境かによって、大きく二つの方法があります。
以下、順にそれぞれの方法についてご説明いたします。

2. cPanelでのCronの設定方法

cPanelとは、サーバー管理上の様々な操作を、画面上から直観的に行うことができるコントロールパネル(管理画面)のことで、海外サーバーで多く採用されています。
先述したように、Magentoサーバーで紹介しているSiteGroundにもcPanelが標準インストールされていて、1クリックでのMagentoインストール時に、サーバー側に自動でCronコマンドも設定されます。

設定されたCronの内容を確認したり修正編集したりするには、cPanelの「Cron Jobs」アイコンをクリックします。

cPanel の Cron Jobs アイコン

Magento2をcPanel(Softaculous)からインストールした後に、Cron Jobsの画面に入ると、以下のように、Magento2のCronが設定されているのを確認できます。

cPanel の Cron 設定

画像上部のAdd a New Cron Jobは、新しいCronを設定する際に入力する欄で、下部のCurrent Cron Jobsに、現在設定されているCronの一覧が表示されます。

Magento2は、一般に3つのCronを設定します。基本的な設定コマンドについては、公式ドキュメントConfigure and run cronの案内によると、以下のようになります。

* * * * * [path to php binary] [magento install dir]/bin/magento cron:run | grep -v “Ran jobs by schedule” >> [magento install dir]/var/log/magento.cron.log
* * * * * [path to php binary] [magento install dir]/update/cron.php >> [magento install dir]/var/log/update.cron.log
* * * * * [path to php binary] [magento install dir]/bin/magento setup:cron:run >> [magento install dir]/var/log/setup.cron.log

また、同案内の2.2バージョン以降の説明では、以下のような実例をあげています。

* * * * * /usr/bin/php /var/www/html/magento2/bin/magento cron:run 2>&1 | grep -v Ran jobs by schedule >> /var/www/html/magento2/var/log/magento.cron.log
* * * * * /usr/bin/php /var/www/html/magento2/update/cron.php >> /var/www/html/magento2/var/log/update.cron.log
* * * * * /usr/bin/php /var/www/html/magento2/bin/magento setup:cron:run >> /var/www/html/magento2/var/log/setup.cron.log

冒頭に並んだ五つのアスタリスク * の部分は、時間帯ごとのスケジュールを意味していて、順に、

Minute(0 – 59)・Hour(0 – 23)・Day of Month(1 – 31)・Month(1 – 12)・Day of Week(0 -6)

のタームを表示しています。
Day of Weekの数値は、0から6まで曜日順に振り、0が日曜日を指します。

また、アスタリスクの * は、毎分、毎時間、毎日、のように、そのタームでの連続実行の意味になり、上記のように * が五つ並んでいると、スケジュールは「毎分」として設定されます。
スケジュールの配列は、カンマ(,)により併記するルールもあり、例示を見たほうが分かりやすいと思います。

* * * * *   毎分(1分間に1回)実行する
*/5 * * * *  5分間に1回実行する
0,30 * * * *   0分と30分に(1時間に2回)実行する
0 0 * * *     0時0分に(1日に1回)実行する
30 15 * * *     15時30分に(1日に1回)実行する
0 0,12 * * *    0時0分と12時0分に(1日に2回)実行する
0 0 1 * *         毎月1日の0時0分に(1カ月に1回)実行する
0 0 1 1 *         毎年1月1日の0時0分に(1年間に1回)実行する
0 0 * * 0        毎週日曜日の0時0分に(1週間に1回)実行する
15,45 12 * * 4     毎週木曜日の12時15分と12時45分に(1週間に2回)実行する
0,15,30,45 * * * * 毎時間の0分、15分、30分、45分に(1時間に4回)実行する

ぱっと見ると難しそうなのですが、タームの順をおさえれば書き方のルールはシンプルです。また、cPanelからの操作では、いくつかの一般的なスケジュールは、プルダウンの選択肢から選んで設定することもできます。

cPanelからのCronスケジュールの追加

Magento2のCronでよく使われるスケジュールは、* * * * *(毎分)や、*/5 * * * *(5分に1回)などになります。
もちろん、プルダウンからだけでなく、*/15 * * * *(15分に1回)など、手動で任意の数値を入力することもできます。
また、スケジュールやコマンドの修正は、Current Cron Jobs(設定済みCronリスト)の右側にある edit をクリックすると、手動で入力、変更することができます。

気をつけておくことは、Cronタスクは、サーバーへの負荷がかなり大きく、サーバー会社によっては、短いインターバルでのCron設定ができないケースや、あるいは、まったくCronの設定ができないサーバーもあります。
注文メールの送信などにも関わるCronタスクなので、安定した運営を重視するなら、毎分(* * * * *)でCron設定のできるサービスへの移転を検討してみてもいいかもしれません。

2-1. PHPバイナリーを確認する

次に、Cronコマンドで注意するのは、PHPバイナリーです。PHPバイナリーというのは、Magento2をインストールしたサーバーでの、PHPファイルの配置された場所を示しています。
スケジュールの数値の後に、半角空けて、PHPバイナリーのパスを記入します。2.2の公式ドキュメントでは、例として、/usr/bin/php が使われています。これは、一般的なApacheサーバーでのパスになるのですが、あくまでも例なので、これをそっくりそのまま記述しても、Cronがきちんと動作してくれるとは限りません。
先ずは、自分の環境で、PHPバイナリーがどこにあるのかを確認しなければなりません。

PHPバイナリーを確認する方法はいくつかありますが、最も確実なのは、PuTTYなどでSSHアクセスをして、Magentoのルートから、以下のコマンドを実行します。

which php

そうすると、例えば、/usr/bin/php もしくは、/usr/local/bin/php などのように、PHPバイナリーのパスを端的に返答してくれます。通常は、これをそのままCronコマンドに記述します。

しかし、このサイトでも紹介している海外MagentoサーバーのSiteGroundのように、サーバーアカウント内で、ディレクトリによりデフォルトとは違うPHPバージョンを適用させている場合は、そのバージョンでのPHPバイナリーを記述する必要があります。

今回、上記画像のケースは、PHP7.1バージョンを適用させたディレクトリに、Magento2.2.3を1クリックインストールしています。実は、アカウントのデフォルトではPHP5.6バージョンなのですが、Magento2.2以降、PHP5.6のサポートが外れたので、インストール前に、あらかじめ該当ディレクトリにPHP7.1を適用させているのです。
そこで、PHP7.1のバイナリーのパスを確認するために、PuTTYで、次のようにコマンドを打ちます。

which php71

そすると、(このSiteGroundサーバーの環境では)、/usr/local/bin/php71 と、回答があります。これが、Cronに入れるべき正しいPHPバイナリーになります。

Cron PHPバイナリーの変更

SiteGroundのcPanelから1クリックでMagentoインストールをすると、上の三つのCronが自動設定されているので、右側の edit をクリックして、各Cronのスケジュールと、PHPバイナリ(コマンドの冒頭部分)を修正します。

先ず、スケジュールに関して言うと、はじめの段階で、

9,27,40,52 * * * *
8,16,40,49 * * * *
8,24,30,59 * * * *

Minuteのタームにランダムな数値が設定されています。
これは、cPanelからのインストール時に、三つのCronに任意の実行時間(1時間に4回ずつ)を与えています。例えば、一番上のCronは、各時間の9分、27分、40分、52分と、1時間に4回ずつ実行するという意味です。
三つのCronで分の時間がずれているのは、サーバーへの負荷を少しでも分散するためなのかもしれませんが、いずれにせよ、1時間に4回ずつというルールの下で、ランダムに設定されていると考えていいでしょう。
このスケジュール数値を、以下のように、Minute に並んでいる数字を削除し、かわりにアスタリスク * を入力して、毎分実行のスケジュールに変更します。

* * * * *
* * * * *
* * * * *

そして、次に、PHPバイナリーの変更です。
1クリックインストールでは、三つのCronそれぞれに、php というバイナリーが設定されています。しかし、先述したように、今回の事例では実際のPHPバイナリーは、/usr/local/bin/php71 なので、以下のようにコマンド冒頭のバイナリーを変更し、三つのCronを変更します。

* * * * * /usr/local/bin/php71 /home/アカウント名/public_html/dekirumonn.com/demo/update/cron.php >> /home/アカウント名/public_html/dekirumonn.com/demo/var/log/update.cron.log
* * * * * /usr/local/bin/php71 /home/アカウント名/public_html/dekirumonn.com/demo/bin/magento setup:cron:run >> /home/アカウント名/public_html/dekirumonn.com/demo/var/log/setup.cron.log
* * * * * /usr/local/bin/php71 /home/アカウント名/public_html/dekirumonn.com/demo/bin/magento cron:run | grep -v “Ran jobs by schedule” >> /home/アカウント名/public_html/dekirumonn.com/demo/var/log/magento.cron.log

もし、Magento2を、SiteGroundサーバーアカウントの公開フォルダ直下にインストールしているなら、Magento2のルートパスの部分は以下のようになります。

* * * * * /usr/local/bin/php71 /home/アカウント名/public_html/update/cron.php >> /home/アカウント名/public_html/var/log/update.cron.log
* * * * * /usr/local/bin/php71 /home/アカウント名/public_html/bin/magento setup:cron:run >> /home/アカウント名/public_html/var/log/setup.cron.log
* * * * * /usr/local/bin/php71 /home/アカウント名/public_html/bin/magento cron:run | grep -v “Ran jobs by schedule” >> /home/アカウント名/public_html/var/log/magento.cron.log

さらに、もしSiteGroundにおけるMagentoルートのPHPバージョンが7.1ではなく、PHP7.0の場合には、以下のようにPHPバイナリーを変更します。

* * * * * /usr/local/bin/php70 /home/アカウント名/public_html/update/cron.php >> /home/アカウント名/public_html/var/log/update.cron.log
* * * * * /usr/local/bin/php70 /home/アカウント名/public_html/bin/magento setup:cron:run >> /home/アカウント名/public_html/var/log/setup.cron.log
* * * * * /usr/local/bin/php70 /home/アカウント名/public_html/bin/magento cron:run | grep -v “Ran jobs by schedule” >> /home/アカウント名/public_html/var/log/magento.cron.log

以上のコマンドは、SiteGroundでのCron設定の例なので、他のサーバーでそのまま使用できるとは限らないので、ご注意ください。
ただ、他のサーバーでも、cPanelのある環境では、上記のように、画面からの直観的な入力だけで、Magento2のCronの設定、設定変更が可能です。

また、cPanelの同じ Cron Jobs 画面の上部 Cron Email にて、メールアドレスを入力すると、Cronの実行でエラーが発生した場合に、そのメールアドレス宛にリアルタイムでエラーメッセージが届きます。

3. コマンドラインでのCron設定

cPanelのない環境では、SSHでサーバーにアクセスして、コマンドによりMagento2のCronの設定をします。
SSHは、WindowsではPuTTY、Macではターミナルなどのツールを使うのが一般的です。SSHアクセスの方法については、お使いのサーバー会社の説明をご参照ください。
以降は、SSHアクセスした後での、コマンドラインによるCronタブ設定の一例です。

Cronタブを編集するには、SSHで以下のコマンドを打つのが一般的です。

crontab -e

しかし、上記では、ルート権限のユーザー(root)で、Cronを作成することになってしまいます。
Magento2のCronは、Magento2のユーザーで作成する必要があります。

通常、VPSやクラウド環境に自分でサーバーを立ちあげる場合は、セキュリティ上の理由でrootとは別のユーザーを作成します。Magento2のインストールディレクトリも、そのドキュメントディレクトリの所有者は、ルート権限のあるユーザー(root)ではなく、別のユーザー(www-dataなど)に変更をします。
このドキュメントディレクトリのユーザーのことを、Magento2の公式案内では、しばしば、Magento file system owner と呼んでいます。

このCronの作成にあたっても、Magento2をインストールしたディレクトリのユーザーにて、コマンドを実行します。
仮に、Magento file system ownewのユーザーが、www-data であった場合は、以下がCron編集のコマンドになります。

sudo -u www-data crontab -e

このコマンドを打つと、画面にCronタブが表示され、PuTTYやターミナルで、直接Cronを入力編集することができるようになります。
以下は、PHPバイナリーが、/usr/bin/php で、Magento2のインストールルートディレクトリが、 /var/www/html/ の場合のコマンド例です。

* * * * * /usr/bin/php /var/www/html/bin/magento cron:run | grep -v Ran jobs by schedule >> /var/www/html/var/log/magento.cron.log
* * * * * /usr/bin/php /var/www/html/update/cron.php >> /var/www/html/var/log/update.cron.log
* * * * * /usr/bin/php /var/www/html/bin/magento setup:cron:run >> /var/www/htmlvar/log/setup.cron.log

PHPバイナリーのパスについては、cPanelでのCron設定でも説明しているように、which php のコマンドで回答を得られます。また、Magento2のルートパスについては、各自のインストール環境により異なりますので、任意に変更してください。

コマンドでのCronの編集

また、Cronの実行でエラーがあった場合に、メールで通知を受け取るには、

MAILTO=”sample@yourdomain.com”

という一行をCrontabに追加します。(” “内のメールアドレスは、任意で変更してください。)

ただし、毎分実行のCronでエラーが頻発すると、大量のメールを受信することになるので、ご注意ください。はじめの設定時に、Cronがきちんと実行されるかどうかを監視するには有効です。

Crontabの入力ができたら、入力内容の保存をし、Crontabの画面を閉じます。PuTTYでは、Ctrl + x ボタンを押し、保存しますかの問いに Y と入力します。

その後、新しいCrontabをリスタートするには、以下のコマンドを実行します。

Ubuntuの場合
sudo /etc/init.d/cron restart

CentOSの場合
sudo /etc/init.d/crond restart

また、保存したCronの内容を確認するには、以下のコマンドを打つと、Cronが表示されます。ユーザー名(www-data)は環境により任意で変更してください。

sudo -u www-data crontab -l

ちなみに、Cron編集作成のコマンドは、 -e でしたが、これは、editのeで、上記のCrontabの内容を確認する(見る)コマンドは、lookのl、なので、-l というふうに理解すると、二つのコマンドを混同することなく覚えられます。

コマンドでのCron設定は、環境によりPHPバイナリーのパスやユーザー名が異なるので、もし分からない場合は、お使いのサーバー会社に問い合わせて聞いてみてもいいかもしれません。

以上で、Magento2のCron設定の説明は終了です。