根本矛盾是php进程用户(_www)与当前用户不一致,需用chown -r $user:_www + chmod -r 775 + chmod g+s确保组继承,再验证sudo -u _www touch storage/test.txt。

Mac 下 Laravel 5.8 的 storage 权限问题,不是 chmod 777 就能解决的——根本矛盾在于 PHP 进程用户(通常是 _www)和你的当前用户(如 yourname)不一致,且 macOS 默认禁用 Web 服务器对非 public 目录的写入。
为什么 Mac 上 Laravel 5.8 总报 Permission denied
本地开发时,你用 php artisan serve 启动,PHP 是以当前用户身份运行的,storage/ 和 bootstrap/cache/ 只要你自己有写权限就 OK;但一旦你切到 Nginx(比如 Valet、MAMP 或手动配的 Nginx),PHP-FPM 就会降权跑在 _www 用户下。这时候即使目录属主是你自己,_www 也进不去。
常见错误现象:file_put_contents(/path/to/storage/logs/laravel.log): failed to open stream: Permission denied,或页面空白、队列卡住、缓存清不掉。
- macOS 的 Nginx/Apache 默认用户是
_www,不是www-data或nginx - Laravel 5.8 没有自动检测系统用户的机制,
storage_path()返回路径后,它只管写,不管权限是否真有效 - Valet 用户常忽略:Valet 启动的 Nginx + PHP-FPM 实际用的是
_www组,不是你终端里的用户组
正确设置 storage 和 bootstrap/cache 权限(Mac + Valet/Nginx)
核心是让 _www 用户既能读又能写,同时保留你自己的管理权——靠组继承 + g+s,而不是暴力 777。
- 确认 Web 服务用户:
ps aux | grep php-fpm | head -1,通常看到_www;或查/usr/local/etc/php/*/php-fpm.d/www.conf里的user = _www和group = _www - 把项目目录加进
_www组:sudo chown -R $USER:_www /path/to/your/laravel/project - 设目录权限并开启组继承:
sudo chmod -R 775 storage bootstrap/cache,再补一句sudo chmod g+s storage bootstrap/cache(关键!否则新建子目录会丢组写权限) - 验证是否生效:
sudo -u _www touch storage/test.txt && sudo -u _www rm storage/test.txt;如果报错,说明_www还没真正获得组权限
local 磁盘配置必须配合权限才生效
Laravel 5.8 的 config/filesystems.php 里默认 local 磁盘 root 是 storage_path('app'),这没问题;但如果你改过,比如硬编码成 /Users/yourname/Sites/myapp/storage/app,那必须确保 _www 对这个绝对路径有权限——而 macOS 对用户家目录默认禁止其他用户访问。
- ✅ 正确:
'root' => storage_path('app')(动态生成,路径由 Laravel 解析) - ❌ 错误:
'root' => '/Users/yourname/storage/app'(_www无法进入/Users/yourname) - 检查真实路径权限:
ls -ld $(php -r "echo storage_path('app');"),输出应含drwxrwxr-x且组为_www - 如果用 Valet,别忘了
valet park或valet link后还要重载:执行valet restart
容易被忽略的 macOS 特殊点
macOS 不像 Linux 那样默认开 SELinux,但它有更隐蔽的限制:比如全盘加密(FileVault)启用时,某些挂载点权限会被重置;又或者 Homebrew 安装的 PHP-FPM 如果用了 --with-openssl 但证书路径不对,也会间接导致文件操作失败。
- 如果你在 Docker for Mac 里跑 Laravel,宿主机的
storage/目录映射进容器后,得额外给容器内用户(如www-data)赋权,不能只改 Mac 本机权限 - MacPorts 或自编译 PHP 的用户要注意:
php-fpm的 user/group 可能不是_www,得查对应配置文件 - 哪怕一切权限看着都对,也建议执行一次
php artisan config:clear && php artisan cache:clear——Laravel 5.8 的 config 缓存会固化旧的路径判断逻辑











