Ubuntu 16.04下move_uploaded_file()与unlink()权限拒绝问题求助
解决Ubuntu 16.04下PHP move_uploaded_file()和unlink()权限拒绝问题
这是典型的文件系统权限不匹配导致的问题——Ubuntu上PHP进程默认以www-data用户运行,而你的crashCourseFiles目录要么不属于这个用户,要么权限设置不足以让PHP完成读写、删除操作。我给你一套一步步的排查和解决方法:
1. 确认PHP运行的用户身份
首先得搞清楚PHP进程到底用哪个用户在跑,毕竟权限是跟用户绑定的:
- 可以在你的PHP脚本里临时加一行代码输出当前用户:
echo posix_getpwuid(posix_geteuid())['name']; - 或者用终端命令查看:
通常Ubuntu 16.04下,不管是Apache还是Nginx搭配PHP-FPM,默认用户都是ps aux | grep phpwww-data。
2. 检查目标目录的权限与所有者
接下来看看crashCourseFiles目录的当前状态,终端执行:
ls -ld crashCourseFiles/
输出会类似这样:
drwxr-xr-x 2 root root 4096 Mar 7 17:20 crashCourseFiles/
如果所有者是root(或者其他非www-data的用户),那PHP进程自然没权限操作里面的文件。
3. 修改目录的所有者为PHP运行用户
把目录及其所有子文件/子目录的所有者改成PHP对应的用户(这里假设是www-data):
sudo chown -R www-data:www-data crashCourseFiles/
-R参数是递归修改,确保目录里所有内容的权限都同步更新。
4. 设置安全合理的目录权限
目录需要有读写执行权限才能让PHP创建、删除、移动文件,执行:
sudo chmod -R 755 crashCourseFiles/
这个权限表示:所有者(www-data)有读写执行权限,组和其他用户有读和执行权限,既满足PHP操作需求,又不会太开放(别用777,那会带来严重安全风险)。
额外排查点
- 如果你用的是Nginx+PHP-FPM,记得检查PHP-FPM的配置文件(通常在
/etc/php/7.0/fpm/pool.d/www.conf),确认user和group项都是www-data,如果不是的话修改后重启PHP-FPM:sudo service php7.0-fpm restart - 如果
crashCourseFiles不在网站根目录下,还要检查PHP的open_basedir配置有没有限制访问这个目录,你可以在php.ini里查看或修改这个参数。
内容的提问来源于stack exchange,提问作者Gagan Tej
相关产品推荐
相关产品推荐

