LoginSignup
4
4

More than 3 years have passed since last update.

Laravelのファイルパーミッションの問題

Last updated at Posted at 2019-11-13

問題発生!!

会社の仕事でアプリケーションの速度を改善するためにDBからマスターテーブルのModelを取得してCacheに格納する方法を利用しました。ウェブの速度はかなりよくなりCacheを使ってよかったと思いましたが、問題が発生!!OTZ

ユーザーの構成

  • バッチ実行ユーザー:ec2-user
  • ウェブ(Apache)ユーザー:apache
  • ec2-userのサブグループにapacheを入れている

作ったCacheを同じくバッチで使用するとパーミッションエラーが出ますね。読み込みは問題ないですが(?)、作成されるディレクトリがウェブで作成したものだと「755」で、バッチ実行ユーザーで新しくファイルを作れないエラーが発生しました。

解決方法

ログファイル

詳しく:https://qiita.com/FattyRabbit/items/fff02397647d54458871

config/logging.php
        '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」を修正しました。

config/filesystems.php
        'local' => [
            'driver' => 'local',
            'root' => storage_path('app'),
            'permissions' => [
                'file' => [
                    'public' => 0764,
                    'private' => 0700,
                ],
                'dir' => [
                    'public' => 0775,
                    'private' => 0700,
                ]
            ]
        ],

それ以外(手っ取り早くやる場合)

AppServiceProvide.phpとかにumaskを書くちょっと気に喰わない方法ではありますね。

app/Providers/AppServiceProvide.php
    public function boot()
    {
        umask(0002);
    }

こんな感じです。先頭で話はCacheの問題はこちらの方法で解決はしました。残念!!!!!!

cacheは「Illuminate\Cache\CacheManager::createFileDriver」で「FileStore」を利用してますが、設定ファイルのpathのみ渡して、「\$this->files->makeDirectory」や「\$this->files->put」等を利用しています。makeDirectoryはパーミッションを設定していますが、umaskに影響される様子です。
:relaxed::relaxed::relaxed::relaxed:

*** 追加:2019.11.14
Laravelのキャッシュファイルのパーミッション設定

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4