出现的问题描述:
今天在实现一个在用户注册时上传头像图片文件的PHP脚本时,出现了问题:PHP脚本在前面已经确定
浏览器端上传文件没有错误。
上传的文件是合法的。
上传的文件是图像文件。
已经在服务器端生成了唯一的文件名。
代码
接下来我们应该做的就是把文件从临时位置移动到固定位置,于是乎我就写了以下脚本:
//把文件从临时位置移动到固定位置@move_uploaded_file($_FILES[$image_fieldname][‘tmp_name‘], $upload_filename) or handle_error("存储图片文件出错", "移动文件出错" . "{$upload_filename}");
代码handle_error()函数是我自己定义的错误处理函数,当move_uploaded_file函数执行出错时,就会跳转到错误页,当我执行执行上面的脚本时,脚本跳转到了错误页,很明显是出错了,首先我排查了一下我的函数参数是否出现了错误:
$_FILES[$image_fieldname][‘tmp_name‘]$upload_filename //是我自己组合的文件路径,保证没错
根据PHP 手册,我传入函数的上述两个参数都是能保证没有问题的,这么怎么回事呢,页面中都没有报错(在函数的前面我使用了PHP的“@”运算符,所以页面才不会报错)
@运算符
注:在代码中要慎用PHP的 @ 运算符,
@运算符可以屏蔽掉所有可能来自用户输入无效的问题或者SQL查询包含了一个不正确的列、甚至是一个不规范URL 错误都可以避免了,代码甚至可以不检查由用户、自己或带那产生的错误,简而言之,@运算符可以屏蔽掉代码的错误信息,一个流行网站经常使用@,因为它们根本不能崩溃或者停止,但是在这种情形下要使用其他解决错误的方案。
寻找error log文件
当时我并没有意识到@运算符对出错信息的屏蔽,我就想去找apache的error log 错误日志文件看看,由于我在搭建PHP开发环境的时候使用的是xampp这样的开发套件,所以error_log文件跟网上大部分文章说的不一样,最终我在
(我的主机是 ubuntu)
/opt/lampp/logs
路径下找到了php_error_log文件,当然这个路径下还存放着apache的error_log文件,在php_error_log文件中我看到了出错问题:权限不够,我终于找到了出错的地方:我们存放图片的目的目录对执行PHP的用户来说是没有权限的,执行PHP脚本的用户和我写脚本代码、创建图片文件夹的用户不是同一个用户
其实我们本不用这么麻烦,我们只要将函数前面的@运算符去掉,然后去掉错误处理函数handle_error()函数,然后我们 就可以在web页面看到出错信息了。
修改目标文件夹权限
不管怎么样,我们还是找到了问题的根源,这是一件很值得高兴的事情,既然文件夹所属用户和权限不对,那么我们只要修改这些问题即可:
修改图片固定存放文件夹的所属用户,将其修改为运行apache执行PHP脚本的用户。
将文件夹的权限改为755
那么运行apache的用户是谁呢,我们利用PHP脚本获取:
echo exec(‘whoami‘); //获得执行该文件的用户名,从而修改图片文件夹的权限
这样我得到了执行脚本的用户为:daemon,你们得到的很可能跟我的不一样。
下面我们来修改文件夹的所属用户:
chown daemon -R ~/web/hello_php/uploads
~/web/hello_php/uploads是我存放图片的目标路径,-R代表递归的给这个目录下的文件夹修改所属用户。
接着修改文件夹权限
chmod 775 -R ~/web/hello_php/uploads
这样我们就大功告成了,
参考阅读:http://www.manongjc.com/article/1494.html