【发布时间】:2018-02-03 20:37:55
【问题描述】:
当 Laravel 从不同来源生成文件/文件夹权限时,我遇到了问题。这可能有点啰嗦,但请耐心等待。
场景
1) 通过php artisan test:command 触发的名为TestCommand.php 的artisan 命令具有以下代码:
public function handle(){
\Log::info("Test Command Executed from Command Line");
}
2)TestController.php中的一个Contoller函数,在访问http://localhost/test时触发,代码如下:
public function test(){
\Log::info("Test Command Executed from Web View");
}
这两个功能在单独触发时都能正常工作,但一旦触发,另一个将无法工作,因为storage/logs 中生成的日志文件现在具有不正确的权限、用户和/或团体。
情况1
如果我运行php artisan test:command,我会得到以下日志文件:
-rw-r--r-- | 1 | tim | wheel | 76B | 25 Aug 14:03 | laravel-2017-08-25.log
导航到http://localhost/test 会返回以下错误:
此页面无法正常工作
localhost 当前无法处理此请求。
HTTP 错误 500
没有显示 Laravel 堆栈跟踪(“糟糕,出了点问题”),因为只有在写入 Laravel 日志后才会出现这种情况。
情况2
如果我先导航到http://localhost/test,我会得到这个日志文件:
-rw-r--r-- | 1 | _www | wheel | 72B | 25 Aug 14:06 | laravel-2017-08-25.log
运行php artisan test:command 会返回以下内容:
PHP 致命错误:未捕获的异常 'UnexpectedValueException' 带有消息“无法打开流或文件“.../storage/logs/laravel-2017-08-25.log”:无法打开流:权限被拒绝' 在 .../vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php:97 堆栈跟踪:...
结论
请注意,用户现在是_www 而不是tim,考虑到storage/logs 中文件的生成源,这是可以预期的。追溯,这可以通过运行很容易地修复:
sudo chmod -R 777 storage/logs
但这不是一个好的解决方案,原因有很多:
- 777 对于生产网络服务器来说是个坏主意,而且 755 似乎不适用于我的配置。
- 任何时候创建新文件(每天用于日志,任何时间用于
storage/framework/*中的文件等)都需要再次运行此命令。 - 我无法直接访问该命令每天必须运行 x 次的网络服务器,这意味着我必须让其他人执行此操作。
鉴于这一切,我如何统一文件以允许任一来源创建文件,然后根据需要修改文件?
Webserver 是 apache,开发环境是 Mac,生产环境是 linux
更新
我认为一个好的解决方案是将tim 和_www 放在同一个组中,并使用
storage/logs 分配给该组
chgrp -R <user_group> storage
但接下来的问题是,默认情况下,Laravel 中任何生成的文件夹的权限都是644,这不允许group 进行写访问,只能读取。
如果可能的话,会考虑修改这个。
【问题讨论】:
标签: php laravel permissions webserver