<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[[实践OK]PHP在经Nginx上传模块上传后的移动文件之rename函数问题的备查。]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[Php/Js/Shell/Go]]></category>
<pubDate>Tue, 16 Apr 2013 09:21:22 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	背景：PHP 5.1.6，我这儿有一个需求用Nginx上传模块上传，但是发现用rename有些问题，于是修改为了：copy又可以了。<br/>打听了一下：说是那个移动到的目标的磁盘是挂载的。<br/><br/>Download:<br/>http://www.grid.net.ru/nginx/download/nginx_upload_module-2.2.0.tar.gz<br/>configure and make :<br/><textarea name="code" class="php" rows="15" cols="100">
./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module&nbsp;&nbsp; --add-module=/data/software/lnmp1.1-full/nginx_http_push_module-0.73 --add-module=/data/software/lnmp1.1-full/ngx_cache_purge-2.1 --add-module=/data/software/lnmp1.1-full/nginx_upload_module-2.2.0
</textarea><br/><br/>在 PHP 4.3.3 之前，linux系统下rename()是无法跨分区操作的。<br/>有人出现：<br/>而如果在不同的分区，就会失败。不过从其它分区rename()至/tmp/临时目录可以成功，但是再rename()回来就直接提示失败。<br/><br/><br/>网上也没有找到比较合适的解释与解决方案。<br/>其中虽然有效但是感觉不太完美的是将rename()函数替换为 system(&quot;mv &quot;.$src.&quot; &quot;.$Dest)<br/><br/>这个我编写了PHP的测试脚本验证过，利用PHP内置的chmod()函数将对应的目录的权限设置为0777后，再执行rename()，错误依旧。chown()没有测试。<br/>并且ls -al 察看对应路径的属性，已经被成功修改了。<br/>应该可以确认是有chmod()的权限的。<br/><br/>实践如下：<br/><textarea name="code" class="php" rows="15" cols="100">
copy($temppath,$orgFileName); //这个可以
system(&quot;mv &quot;.$temppath.&quot; &quot;.$orgFileName); //这个还是不行
</textarea><br/><br/>后来，经实际测试rename不行，于是改用copy函数，并删除掉源，估计和该环境是挂载的目标磁盘有关，后发现是权限问题加上：755权限可以，究竟是什么问题无法得知：<br/><textarea name="code" class="php" rows="15" cols="100">
copy($temppath,$orgFileName);
unlink($temppath);
</textarea><br/>修改为：<br/><textarea name="code" class="php" rows="15" cols="100">
chmod($temppath, 755);&nbsp;&nbsp;
rename($temppath,$orgFileName);
</textarea><br/>Ps：nginx和php都是ww权限在运行。<br/>再试：<br/><textarea name="code" class="php" rows="15" cols="100">

if(file_exists($temppath) )
&#123;
$comandStr = &quot;mv &quot;.$temppath.&quot; &quot;.$orgFileName;
echo $comandStr.&quot;&lt;br&gt;&quot;;
$handle = popen($comandStr, &#039;r&#039;);
echo &quot;&#039;$handle&#039;; &quot; . gettype($handle) . &quot;&#92;n&quot;;
$read = fread($handle, 2096);
echo $read;
pclose($handle);
&#125;else&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo &quot;File is not exist...&quot;;
&#125;
</textarea><br/>再加上：<br/><textarea name="code" class="php" rows="15" cols="100">
ignore_user_abort(true);
set_time_limit(0);
</textarea><br/><br/>move_upload_file无法移动文件。<br/><br/>打开错误：<br/><textarea name="code" class="php" rows="15" cols="100">
ini_set(&#039;display_errors&#039;,&#039;On&#039;);
Error_reporting(E_ALL);
</textarea><br/><br/>问题根本原因想到想不到滴：<br/>我都说这个rename函数怎么好像有问题哩，原来是这样：<br/>这个rename的目标目录有一个另外的转码的程序在看护是一个daemon，一发现我这边有一个文件上传后rename过去就给转走了，于是给我测试造成一种rename函数有问题有时有（当时这个程序没有取走），有时无（一上传到这个目录刚好被这个程序给取走了），于是觉得这个rename不靠谱，实际上就是这个视频转码的程序。<br/>有一个思路上的问题：<br/>视频转码，我思想上是要是视频文件才转，后来才发现不用是视频文件的后缀，只要在上传时插入数据库后，所有放到那边的文件都给移走了，如果转失败也是在转码那边删除，造成这个目录不可能有一个文件存在，就是.exe的.dll的也会移走，问题得到了解决。<br/><br/>害我找了一上午看这个问题，不过收获到的非PHP的知识，更多的是一种排查问题的思路，EOF。<br/><br/><br/>后记：<br/>Rango&nbsp;&nbsp;下午 02:37:50<br/>有nginx么？<br/>可以用nginx的上传模块<br/>那个比较强<br/>回忆未来-向东-Jàck&nbsp;&nbsp;下午 02:38:51<br/>是么，我也用，你有那个的生产环境的配置么？<br/>我感觉那个好像上传时是一点一点的写，它是先把上传的文件内容放内存缓冲么？<br/>Rango&nbsp;&nbsp;下午 02:39:15<br/>是的。<br/>先到缓存，缓存满了，就写文件<br/>这样效率非常高<br/>文件上传完了，再通知PHp<br/>
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] [实践OK]PHP在经Nginx上传模块上传后的移动文件之rename函数问题的备查。]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>