文件上传或写入文件无权限:mkdir:permission denied or file_put_content:permission denied.
2019/10/16
补充:在 ThinkPHP 5.1 完全开发手册中发现,文档提示:在mac或者linux环境下面,注意需要设置runtime目录权限为777。
测试发现,linux 环境下,当 tp 的 runtime 目录内不存在文件或文件夹时,可通过 chmod 777 runtime
或者 chown www:www runtime
指令修改文件夹权限或者所属直接解决问题。后续脚本在 runtime 目录下生成的文件夹,会自动归属于创建者,也就是 www
用户,所以不会再有不允许创建文件夹或者写入文件的问题。
建议:
如果项目刚运行,文件夹里面没有内容,就出现这种权限问题,直接用以上方法修改文件夹权限即可。
如果项目运行了很多,里面的存放了许多内容,并且这些内容具有一定的价值,而在项目转移到新服务器后出现这种权限问题,又不愿意删除里面的内容,可以考虑遍历文件夹添加权限,如:chmod 777 -R runtime
,或者 chown www:www -R runtime
,管用。
2019/10/16
在 linux 服务器上测试 tp 5.1 框架,调试模式下 runtime 目录需要写入缓存、日志和临时文件等内容,所以需要有创建文件夹和写入的权限。
按照官方文档说明,修改文件夹权限 chmod 755 -R runtime
(这等于没改,因为 composer 创建的项目下目录都有 755 权限)。但页面依然报错:“mkdir:permission denied.”。项目创建 cache 、log、temp 等文件夹需要权限,当然可以自己把这些文件夹创建好,但这并不是让人满意的答案。
文件权限问题解决方案就两个,一个是操作权限,就是把权限修改成 755 通用版;另一个是修改文件所属用户和用户组,即 chown xxx:xxx -R runtime
。后一个修改用户和用户组的方案,其中的用户和用户组根据服务器( nginx | apache | iis )运行用户和用户组进行修改。因为拥有服务器运行权限的用户也是执行服务器端脚本代码的执行者,如果执行者没有权限创建文件或文件夹,就把文件或文件夹上一级的目录所有者修改成执行者,这样就有权限操作了。我的服务器脚本执行者是 www
,所以具体操作就是 chown www:www -R runtime
,解决。
后面一个错误 “file_put_content:permission denied.” 是在尝试自建相关目录后,再次访问出现的。问题是同一个问题,执行者对手动创建的目录没有写入文件的权限。因为手动创建的目录默认用户和用户组为 root,所以执行 chown www-data:www-data -R runtime
即可(-R 表示遍历文件夹)。
tip:www 是我服务器上的脚本执行者,其他服务器上有可能是 www-data 或者其他,可以通过 ps aux | grep php-fpm
获取。
项目在一段时间的软磨硬泡中,终于部署上去了,但是一些基本的权限问题,还是要测试一下的。
结果就出来问题了。
图片异步上传报错,提示mkdir:permission denied.
之前解决这个问题一般就两个步骤:一个是修改上传目录权限,chmod 775 upload
,另一个就是修改目录所属的用户和用户组。
在新项目中有了新的问题。这两步都做了,也没有解决,还是报相同的错误。
检查了一下上传文件夹upload,发现它是一个软链,软链到了其他目录下面去了。
这就让我想到,之前server中root项用带有软链的地址,也是出了问题,访问403 access forbidden。
当时是直接换成了nginx的配置的root目录下才修复的,所以这次可能还是这个原因。
于是修改/root/www/data
为/usr/share/nginx/html/data
,好了!