当Laravel的文件/文件夹权限来自不同来源时,我遇到了问题。这可能有点啰嗦,但请耐心等待。
方案
1)通过artisan
触发的名为TestCommand.php
的{{1}}命令具有以下代码:
php artisan test:command
2)访问public function handle(){
\Log::info("Test Command Executed from Command Line");
}
时触发的TestController.php
中的控制器功能,其中包含以下代码:
http://localhost/test
当单独触发时,两个函数都能正常工作,但是一触发一个,另一个不起作用,,因为public function test(){
\Log::info("Test Command Executed from Web View");
}
中生成的日志文件现在具有不正确的权限,用户和/或小组。
情况1
如果我运行storage/logs
,我会收到以下日志文件:
php artisan test:command
导航到-rw-r--r-- | 1 | tim | wheel | 76B | 25 Aug 14:03 | laravel-2017-08-25.log
会返回以下错误:
此页面无效
localhost目前无法处理此请求。
HTTP ERROR 500
没有Laravel堆栈跟踪(" Woops,出错了"),因为只有在写入Laravel日志后才会发生。
情况2
如果我先导航到http://localhost/test
,我会收到此日志文件:
http://localhost/test
运行-rw-r--r-- | 1 | _www | wheel | 72B | 25 Aug 14:06 | laravel-2017-08-25.log
会返回以下内容:
PHP致命错误:未捕获的异常' UnexpectedValueException'消息'流或文件" ... / storage / logs / laravel-2017-08-25.log"无法打开:未能打开流:权限被拒绝'在... / vendor / monolog / monolog / src / Monolog / Handler / StreamHandler.php:97 堆栈跟踪:......
结论
请注意,用户现在是php artisan test:command
而不是_www
,这是tim
中文件的生成源所期望的。追溯性地,通过运行可以很容易地解决这个问题:
storage/logs
但由于多种原因,这不是一个好的解决方案:
sudo chmod -R 777 storage/logs
中的文件等),此命令都需要再次运行。鉴于这一切,如何统一文件以允许任何一个源创建文件,然后根据需要修改文件?
Webserver是apache,dev环境是Mac,生产是linux
更新
我认为一个好的解决方案是让storage/framework/*
和tim
在同一个群组中,然后使用
_www
分配给该群组
storage/logs
但是接下来的问题是,默认情况下,Laravel中任何生成的文件夹的权限都是chgrp -R <user_group> storage
,它不允许644
进行写访问,只能读取。
如果可能的话,会考虑修改它。
答案 0 :(得分:0)
找到解决这个问题的方法;的ACL!
在Mac上,chmod +a ...
有一个选项,它会将默认目录权限添加到您指定的任何文件夹中。在我的情况下,我想使用允许tim
和_www
完全访问storage
下文件/文件夹的ACL,因为它们都会不断地访问/写入文件/文件夹:
chmod -R +a 'tim allow read,write,delete,add_file,add_subdirectory,file_inherit,directory_inherit' storage
chmod -R +a '_www allow read,write,delete,add_file,add_subdirectory,file_inherit,directory_inherit' storage
以递归方式应用此选项可以在存储目录中的Laravel生成的任何文件夹上设置ACL,最重要的是storage/framework/cache
。
在Linux上,ACL看起来略有不同,但想法是一样的:
chmod g+s storage
setfacl -R -d -m u::rwx storage
setfacl -R -d -m g::rx storage
setfacl -R -d -m o::rx storage
这会有效地将存储(和所有子文件夹)的文件权限设置为755
,这似乎是我的配置需要允许正确写入的内容。