레벨 캐시 파일 권한 설정

16714 단어 LaravelCachepermission
이전에 아래 보도에서 캐시 파일의 권한 설정을 사용한 결과'umask'를 사용하여 더 좋은 방법이 있는지 조사했습니다.
Laravel 파일 권한 문제

다른 거는요?


만약 파일 디렉터리의 생성이umask의 영향을 받는다면, 로그 설정 파일의 권한은 어떻게 됩니까?알아봤어.도착한 것은 다음과 같은 방법이다.
Monolog\Handler\StreamHandler.php

   /**
     * {@inheritdoc}
     */
    protected function write(array $record): void
    {
        if (!is_resource($this->stream)) {
            if (null === $this->url || '' === $this->url) {
                throw new \LogicException('Missing stream url, the stream can not be opened. This may be caused by a premature call to close().');
            }
            $this->createDir();
            $this->errorMessage = null;
            set_error_handler([$this, 'customErrorHandler']);
            $this->stream = fopen($this->url, 'a');
            if ($this->filePermission !== null) {
                @chmod($this->url, $this->filePermission);
            }
            restore_error_handler();
            if (!is_resource($this->stream)) {
                $this->stream = null;

                throw new \UnexpectedValueException(sprintf('The stream or file "%s" could not be opened: '.$this->errorMessage, $this->url));
            }
        }

        if ($this->useLocking) {
            // ignoring errors here, there's not much we can do about them
            flock($this->stream, LOCK_EX);
        }

        $this->streamWrite($this->stream, $record);

        if ($this->useLocking) {
            flock($this->stream, LOCK_UN);
        }
    }
결과chmod 또는~~.그럼 나도 할 거야.

사용자 정의 캐시 드라이버 만들기


프로파일


우선, 설정 파일을 추가 기록합시다!permissions가 추가되었습니다.
config/cache.php
        'file' => [
            'driver' => 'local',
            'path' => storage_path('framework/cache/data'),
            'permissions' => [
                'dir' => 0775,
                'file' => 0664,
            ],
        ],
여기driver도'file'→'로컬'로 바꿉니다.

스토리지 생성


그리고 드라이버를 만드는 상점입니다.
pp\Extensions\CacheLocalFileStore.php
<?php
namespace App\Extensions;

use Illuminate\Cache\FileStore;
use Illuminate\Filesystem\Filesystem;
use League\Flysystem\Cached\CachedAdapter;

class CacheLocalFileStore extends FileStore
{

    /**
     * The file cache permissions.
     *
     * @var array
     */
    protected $permissions;

    /**
     * Create a new file cache store instance.
     *
     * @param Filesystem $files
     * @param $config
     */
    public function __construct(Filesystem $files, $config)
    {
        $this->files = $files;
        $this->directory = $config['path'];
        $this->permissions = $config['permissions'];
    }

    /**
     * Store an item in the cache for a given number of seconds.
     *
     * @param  string  $key
     * @param  mixed   $value
     * @param  int  $seconds
     * @return bool
     */
    public function put($key, $value, $seconds)
    {
        $this->ensureCacheDirectoryExists($path = $this->path($key));

        $result = $this->files->put(
            $path, $this->expiration($seconds).serialize($value), true
        );
        @chmod($path, $this->permissions['file']);

        return $result !== false && $result > 0;
    }

    /**
     * Create the file cache directory if necessary.
     *
     * @param  string  $path
     * @return void
     */
    protected function ensureCacheDirectoryExists($path)
    {
        $concatPath = $this->directory;
        $dir = trim(str_replace($concatPath, '', dirname($path)), '/');
        $dirNames = explode('/', $dir);
        foreach ($dirNames as $direName) {
            $concatPath .= '/'. $direName;
            if (! $this->files->exists($concatPath)) {
                $this->files->makeDirectory($concatPath, 0777, true, true);
                @chmod($concatPath, $this->permissions['dir']);
            }
        }
    }
}
기존 FileStore를 상속하고 사용했습니다.ensure Cache Directory Exists에서 foreach 부분을 사용하는 이유는 만든 path가'/8/50'같은 디렉터리 구조이기 때문에chmod는 부모의 단층에서도 사용할 수 있는 용법이 생각나지 않기 때문이다.

공급업체 생성


등록할 공급업체를 만듭니다.
<?php

namespace App\Providers;

use App\Extensions\CacheLocalFileStore;
use App\Extensions\MongoStore;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\ServiceProvider;

class CacheServiceProvider extends ServiceProvider
{
    /**
     * コンテナ結合の登録
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * 全アプリケーションサービスの初期起動
     *
     * @return void
     */
    public function boot()
    {
        Cache::extend('local', function ($app) {
            return Cache::repository(new CacheLocalFileStore($app['files'], config('cache.stores.file')));
        });
    }
}
구성 파일의 드라이버 "로컬"을 사용하여 등록합니다.config/app.등록 php.

좋은 웹페이지 즐겨찾기