首页 > 解决方案 > CakePHP 3.6 缓存文件引擎的默认目录权限

问题描述

Cake\Cache\Engine\FileEngine在我的 CakePHP 3.6 应用程序中使用缓存。我想定义缓存目录权限。我曾尝试在缓存配置中使用“掩码”,但它只影响缓存正在创建的文件,而不影响目录。

看起来缓存目录权限总是设置为drwxr-xr-x,这对我来说是个问题,因为在这种情况下,只有所有者才能删除这些目录中的文件。我还需要一个可按组写入的目录,而不仅仅是所有者。

问题:是否可以定义 CakePHP 创建缓存目录的文件权限?

我目前的配置:

'_cake_model_' => [
    'className' => 'Cake\Cache\Engine\FileEngine',
    'prefix' => 'myapp_cake_model_',
    'path' => CACHE . 'models/',
    'serialize' => true,
    'duration' => '+1 years',
    'url' => env('CACHE_CAKEMODEL_URL', null),
    'mask' => 0666,
],

/tmp/缓存列表:

drwxr-xr-x 2 www-data   www-data   4096 Feb  7 12:15 models/
-rw-rw-rw- 1 www-data   www-data 396020 Feb  7 12:07 myapp_cake_routes_route_collection
drwxr-xr-x 2 www-data   www-data   4096 Feb  7 12:05 persistent/

注意:我知道我可以手动chmod创建目录,但是在删除它们后会使用默认权限重新创建它们,所以这不是最好的解决方法。

标签: cachingcakephp-3.0file-permissions

解决方案


缓存引擎775用于创建文件夹:

但是,这不是最终模式,mkdir()将在此应用您当前的 umask,这可能是022. IIRCmkdir()将有效地执行此操作以计算实际模式:

mode & ~umask & 0777

这将导致755,即rwxr-xr-x

在其他地方,CakePHP 会暂时取消设置当前的 umask 以避免这种情况,不确定为什么引擎也不umask()在这里使用(也许可能的多线程问题在这里会更普遍,IDK),你可能想在GitHub 上打开一个问题为了澄清。

作为(临时)解决方法,您可以例如创建一个自定义/扩展缓存引擎,该引擎覆盖FileEngine::_setKey()并从那里FileEngine::_active()应用。chmod()或者也许在缓存引擎尝试创建文件夹之前自己创建文件夹,例如在您的引导程序中......


推荐阅读