Laravelに限らずキャッシュとは便利なものです
でも今回はそのキャッシュに悩まされました
▼ こういう感じのエラーに遭遇
1 2 3 |
[2022-02-11 04:49:59] local.ERROR: Unable to create lockable file: /var/www/html /laravel/storage/framework/cache/data/b4/d2/b4d2766db9d068cd3f55173a5bcb2ca0ca23 475d. |
この発生原因はLaravelというよりサーバーにあります
解決策が分かったのでシェアしておきます
Cache系のトラブルに遭遇した経緯
こういうコードがありました
▼ キャッシュ期間1日でキャッシュするコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$seconds = 60*60*24; /// <= 1日 $key = 'something'; $something = Cache::remember( $key, $seconds, function(){ $something = []; /// DBからデータなどを取ってくる /// そして$somethingに代入 return $something; } ); |
Laravelのキャッシュ系メソッドの1つである Cache::remember() を使ってた時です。他にも Cache::put() とか Cache::forever() とかもありますね。
そこで冒頭のエラーが出たというわけです。
▼ 発生したエラーの詳細
1 2 |
[2022-02-11 04:49:59] local.ERROR: Unable to create lockable file: /path/to/laravel/storage/framework/cache/data/b4/d2/b4d2766db9d068cd3f55173a5bcb2ca0ca23475d. Please ensure you have permission to create files in this location. {"exception":"[object] (Exception(code: 0): Unable to create lockable file: /path/to/laravel/storage/framework/cache/data/b4/d2/b4d2766db9d068cd3f55173a5bcb2ca0ca23475d. Please ensure you have permission to create files in this location. at /path/to/laravel/vendor/laravel/framework/src/Illuminate/Filesystem/Lockabl eFile.php:73) |
こういうエラーが定期的に起きてます。
原因としては少し意外なところにありました。
原因はキャッシュファイルの所有権にあった
原因はパーミッションでした。
Laravelを動かしてたのはAWS内のことです。
そして次の2つのユーザーがありました
- ec2-user:ec2-user
- apache:apache
そしてキャッシュファイルの権限を調べたんです
▼ ls -al してみたら…
1 2 3 4 5 6 7 8 9 10 11 |
$ cd /path/to/laravel $ ls -al ./storage/framework/cache/data total 4 drwxrwxrwx 16 ec2-user ec2-user 164 Feb 11 04:51 . drwxrwxrwx 3 ec2-user ec2-user 36 Dec 30 03:41 .. drwxr-xr-x 3 apache apache 16 Feb 11 04:46 07 drwxr-xr-x 3 apache apache 16 Feb 11 04:41 29 drwxr-xr-x 3 apache apache 16 Feb 11 04:46 4b drwxr-xr-x 3 apache apache 16 Feb 11 04:46 68 drwxr-xr-x 3 apache apache 16 Feb 11 04:46 90 -rwxrwxrwx 1 ec2-user ec2-user 14 Dec 30 03:41 .gitignore |
所有者が ec2-user:ec2-user のやつと apache:apache であるキャッシュディレクトリが混在しちゃってます。これがエラーの原因らしい
エラーが発生してたPHPスクリプトはCronに登録しており、 ec2-user:ec2-user ユーザーとしてCronジョブを定期実行してました。
ところがキャッシュディレクトリは apache:apache として生成され、所有者が違うとのことでエラーが出ていたみたいです。
最終的には再帰的にchownをして所有者変更した
そこで次のchownを実行しました
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ cd ./storage/framework/cache/data $ sudo chown -R ec2-user:ec2-user $ ls -al total 4 drwxrwxrwx 16 ec2-user ec2-user 164 Feb 11 04:51 . drwxrwxrwx 3 ec2-user ec2-user 36 Dec 30 03:41 .. drwxr-xr-x 3 ec2-user ec2-user 16 Feb 11 04:46 07 drwxr-xr-x 3 ec2-user ec2-user 16 Feb 11 04:41 29 drwxr-xr-x 3 ec2-user ec2-user 16 Feb 11 04:46 4b drwxr-xr-x 3 ec2-user ec2-user 16 Feb 11 04:46 68 drwxr-xr-x 3 ec2-user ec2-user 16 Feb 11 04:46 90 -rwxrwxrwx 1 ec2-user ec2-user 14 Dec 30 03:41 .gitignore |
これでキャッシュエラーは解決
以上、LaravelのCacheエラーが出た話でした。ではまた
もし他のCache系トラブルがあれば教えてください。
コメント欄から情報シェアいただくとありがたいです。