[实践OK]PHP在经Nginx上传模块上传后的移动文件之rename函数问题的备查。

jackxiang 2013-4-16 17:21 | |
背景:PHP 5.1.6,我这儿有一个需求用Nginx上传模块上传,但是发现用rename有些问题,于是修改为了:copy又可以了。
打听了一下:说是那个移动到的目标的磁盘是挂载的。

Download:
http://www.grid.net.ru/nginx/download/nginx_upload_module-2.2.0.tar.gz
configure and make :


在 PHP 4.3.3 之前,linux系统下rename()是无法跨分区操作的。
有人出现:
而如果在不同的分区,就会失败。不过从其它分区rename()至/tmp/临时目录可以成功,但是再rename()回来就直接提示失败。


网上也没有找到比较合适的解释与解决方案。
其中虽然有效但是感觉不太完美的是将rename()函数替换为 system("mv ".$src." ".$Dest)

这个我编写了PHP的测试脚本验证过,利用PHP内置的chmod()函数将对应的目录的权限设置为0777后,再执行rename(),错误依旧。chown()没有测试。
并且ls -al 察看对应路径的属性,已经被成功修改了。
应该可以确认是有chmod()的权限的。

实践如下:


后来,经实际测试rename不行,于是改用copy函数,并删除掉源,估计和该环境是挂载的目标磁盘有关,后发现是权限问题加上:755权限可以,究竟是什么问题无法得知:

修改为:

Ps:nginx和php都是ww权限在运行。
再试:

再加上:


move_upload_file无法移动文件。

打开错误:


问题根本原因想到想不到滴:
我都说这个rename函数怎么好像有问题哩,原来是这样:
这个rename的目标目录有一个另外的转码的程序在看护是一个daemon,一发现我这边有一个文件上传后rename过去就给转走了,于是给我测试造成一种rename函数有问题有时有(当时这个程序没有取走),有时无(一上传到这个目录刚好被这个程序给取走了),于是觉得这个rename不靠谱,实际上就是这个视频转码的程序。
有一个思路上的问题:
视频转码,我思想上是要是视频文件才转,后来才发现不用是视频文件的后缀,只要在上传时插入数据库后,所有放到那边的文件都给移走了,如果转失败也是在转码那边删除,造成这个目录不可能有一个文件存在,就是.exe的.dll的也会移走,问题得到了解决。

害我找了一上午看这个问题,不过收获到的非PHP的知识,更多的是一种排查问题的思路,EOF。


后记:
Rango  下午 02:37:50
有nginx么?
可以用nginx的上传模块
那个比较强
回忆未来-向东-Jàck  下午 02:38:51
是么,我也用,你有那个的生产环境的配置么?
我感觉那个好像上传时是一点一点的写,它是先把上传的文件内容放内存缓冲么?
Rango  下午 02:39:15
是的。
先到缓存,缓存满了,就写文件
这样效率非常高
文件上传完了,再通知PHp

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/6259/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2014-11-15 10:53
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]