Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

問題発生!!

会社の仕事でアプリケーションの速度を改善するために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のキャッシュファイルのパーミッション設定

FattyRabbit
韓国から1999年日本にきて色んなプロジェクトに参加しております。アンドロイドの画像編集・本作成プロジェクトで開発レーダー・メインエンジニアとして仕事して個人的にもアプリを開発・公開しています、仕事のほとんどウェブプロジェックトです。 Java、PHP、Spring Boot、Struts、Laravel、Google、Twitter、Facebook、Api
https://fatty-rabbit.tistory.com/
wiz_inc
Wizは、最新のIoTやICTサービスをお客様に届ける「ITの総合商社」です
http://012grp.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away