問題発生!!
会社の仕事でアプリケーションの速度を改善するためにDBからマスターテーブルのModelを取得してCacheに格納する方法を利用しました。ウェブの速度はかなりよくなりCacheを使ってよかったと思いましたが、問題が発生!!OTZ
ユーザーの構成
- バッチ実行ユーザー:ec2-user
- ウェブ(Apache)ユーザー:apache
- ec2-userのサブグループにapacheを入れている
作ったCacheを同じくバッチで使用するとパーミッションエラーが出ますね。読み込みは問題ないですが(?)、作成されるディレクトリがウェブで作成したものだと「755」で、バッチ実行ユーザーで新しくファイルを作れないエラーが発生しました。
解決方法
ログファイル
詳しく:https://qiita.com/FattyRabbit/items/fff02397647d54458871
'single' => [
'driver' => 'single',
'path' => storage_path('logs/laravel.log'),
'level' => 'debug',
'permission' => 0664,
],
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel.log'),
'level' => 'debug',
'days' => 14,
'permission' => 0664,
],
Storageファサードを利用する場合
Laravel は Flysystem という PHPパッケージを使用しているらしいので、見てみましょう!
https://flysystem.thephpleague.com/docs/adapter/local/
$adapter = new Local(
__DIR__.'/path/to/too',
LOCK_EX,
Local::DISALLOW_LINKS,
[
'file' => [
'public' => 0744,
'private' => 0700,
],
'dir' => [
'public' => 0755,
'private' => 0700,
]
]
);
こうらしいです。
vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemManager.phpのcreateLocalDriverメソッドにpermissionsが突っ込まれるようなので「config/filesystems.php」を修正しました。
'local' => [
'driver' => 'local',
'root' => storage_path('app'),
'permissions' => [
'file' => [
'public' => 0764,
'private' => 0700,
],
'dir' => [
'public' => 0775,
'private' => 0700,
]
]
],
それ以外(手っ取り早くやる場合)
AppServiceProvide.phpとかにumaskを書くちょっと気に喰わない方法ではありますね。
public function boot()
{
umask(0002);
}
こんな感じです。先頭で話はCacheの問題はこちらの方法で解決はしました。残念!!!!!!
cacheは「Illuminate\Cache\CacheManager::createFileDriver」で「FileStore」を利用してますが、設定ファイルのpathのみ渡して、「$this->files->makeDirectory」や「$this->files->put」等を利用しています。makeDirectoryはパーミッションを設定していますが、umaskに影響される様子です。
*** 追加:2019.11.14
Laravelのキャッシュファイルのパーミッション設定