エックスサーバーでcronを設定してLaravelプロジェクトを自動処理するとき
「そのようなファイルやディレクトリはありません」
「 ディレクトリではありません」
というエラーが出たときは、エックスサーバーのCron設定のコマンドに下記の問題があるかもしれません。
- 必要なスペースが入っていない
- Cron設定の「コマンド」にPHPのバージョンが入っていない
- PHPについて書く場所が間違えている
コマンドの部分が正しく入っているか、チェックしてみてください。
わたしも、このエラーに悩みました。
Cron設定コマンドはネット上に色々な書き方が紹介されていますが、残念ながら、このトラブルを解決できる方法が見つけられず。
わたしは公式マニュアルを参考に、下記のようにコマンドを作成したところ、トラブルを解決できました。
Laravelのcronコマンド例)
1 |
cd /home/test/test && /usr/bin/php7.3 artisan schedule:run >> /dev/null 2>&1 |
プロジェクトのパスとPHPのバージョンの調べ方は、下記記事にて解説しています。
Cron設定のコマンドについて解説
なぜこのようなコマンドになるのか、解説していきます。
Laravelの公式マニュアルには、Cron設定について、下記のように書かれています。
スケジューラを使用するには、サーバに以下のCronエントリを追加するだけです。
1 * * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
*参考:https://readouble.com/laravel/8.x/ja/scheduling.html
Laravelのコマンドの最初の*****部分は、時間設定。
エックスサーバーでは時間設定は別途入力するので、この部分はコマンドに入れません。
ただ注意点として、エックスサーバーでは、PHPのバージョンを入れる必要があります。
エックスサーバーのCronに関するマニュアルには、下記のように書かれています。
PHPやPerlなどのスクリプトをCronで実行する際、 コマンドパスもあわせて記述してください。(略)
(例)abc.phpをPHP 7.2 で実行する場合
/usr/bin/php7.2 /home/サーバーID/独自ドメイン名/public_html/abc.php
*参考:https://www.xserver.ne.jp/manual/man_program_cron.php
そこで、Laravelマニュアルに書かれたコマンドに、PHPのバージョン情報を入れます。
すると今回ご紹介したようなCron設定コマンドになるわけです。
Laravelのcronコマンド例)
1 |
cd /home/test/test && /usr/bin/php7.3 artisan schedule:run >> /dev/null 2>&1 |
Cron設定のコマンドについて、さらにつっこんで解説
ここから先は、Cronコマンドの >> 以下の部分について、解説していきます。
下記の赤い部分ですね。気になる方だけ、お読みください。
まず【>>】 は、記録対象のファイルに追加していく、という意味。
そのあとに続く【 /dev/null】 は、特殊な動作をするファイル名で、具体的には、画面出力(表示)が全て消えます。
そのあとの数字【2>&1】ですが、1は標準出力で、2はエラー出力の意味。
2>&1と入れることでと、エラー出力も標準出力と一緒の出力先にするという意味になります。
総合すると、赤色の部分は、すべての出力(表示)を捨てる、という意味になります。
つまり、コマンドのたびに画面出力が出ないように、赤色部分の処理が入っているわけです。
・・・と解説しましたが、実はわたしは最初、この赤色の部分の意味についてはよく理解できませんでした。
そこで、熟練プログラマの旦那に聞いてみたところ、上記の答えがあっさり返ってきたのです。
ちなみに、この知識って、常識な感じ?
うーん。そんなことないよ。
まあ、UNIXが分かる人とかは、知っているかも。
そうかぁ。
Cronコマンド、1行だけですが、なかなか奥深いですね。