初Qiitaです。足りない、誤りがある箇所についてはコメントから指摘いただけますと嬉しいです。
環境:MacOS Catalina, PHP 7.4.11, Laravel 7.28.3
■やりたかったこと
Laravelのタスクスケジュールの設定を行い自動実行できるようにしたかった。
■問題
php artisan schedule:run
をすると問題なく動くが、スケジュールを実行するとZipArchiveが見つからないと以下のエラーが出てしまう。
local.ERROR: Class 'ZipArchive' not found {"exception":"[object] (Error(code: 0): Class 'ZipArchive'
■解決方法
使用したいphpの場所を
which php
で取得してcrontabで明示的に以下のような感じで書く。
* * * * * cd /var/www/ && /usr/bin/php7 /var/www/artisan schedule:run >> /var/www/storage/logs/cron.log 2>&1
こちらの記事を参照すると分かりやすいです。
https://stackoverrun.com/ja/q/12644861
■問題の原因
Localで使用しているbrewでインストールしたphpとcronが使用するPHPは違うものらしい。(ここが曖昧なので詳しい方教えていただけると嬉しいです。)
そのため php -m
をしてlocalのphpにzipがインストールされていることを確認しても、cronが使用するphpにはzipがインストールされていないためClass 'ZipArchive' not found
となってしまった。
以下余談です。
当該エラーでググると多くの記事で「zipをインストールしろ。そしてモジュールを確認しろ」と書いてあり、それはやったのに何故エラーが出るのか。とずっと悩み続けてしまいました。
このエラーで相当な時間を費やして最終的に会社の先輩に解決してもらったのですが、私のようにcronに全然詳しくない・初めて使う。という場合にはいきなり全部組み込むんじゃなくて
- echoを試す
- php -vを試す
- php artisanを試す
みたいに段階的に発展させると大きなつまずきが減りますよ。とのことでした。
精進します。