Friday, February 25, 2011

iis配置php无法上传文件,终于解决了一年多的困惑啊

延续《Windows Server 2003中iis配置php》一文
   服务器上使用Apache2+PHP正常运行,换成IIS+PHP,先后出现了php.ini的环境变量无法读取,php中验证码无法显示的问题,如今又有人反应无法上传图片的问题。
   从IIS替换Apache2的过程仅仅是开启IIS,关闭Apache2,其它的没什么变化,但是却发生了如此多的差异,看样子IIS支持PHP还是有很多要进行修改的。
分析:
   根据上面的描述,我怀疑问题出在IIS的权限配置上,IUSR_MACHINE的帐户对upload没有写入的权限,于是进行权限修改,IIS下的权限,NTFS下的权限都进行修改,但是终究都没用,查找网络上的资料也没有相应的,对上传页面进行测试,流程为:
   swf文件调用save.php上传文件---->swf文件对上传的文件进行重命名--->名字返回给save.php--->显示出最后的名字。
   现在的问题一直停留在swf对文件重命名的这里,一直没有到显示出最后的名字,并且swf文件不参与上传过程,那就只能在save.php文件中进行问题查找了,在该文件中进行测试,最后显示的名字所使用的变量为fileName,于是插入下面的语句进行测试:
   echo "fileName=2008*****.gif";
   这句话的作用就是使得fileName有值,save.php能正常显示,先把原来的语句一句一句的进行屏蔽测试,都正常的返回了,但是当测试到:
    if (!@move_uploaded_file($f["tmp_name"], $dest_dir.'/'.$fileName)) header("HTTP/1.0 404 Not Found");
   这句话的时候问题出现了,不能上传,查找上下文,一直没发现tmp_name的变量,不过看意思是先把文件上传到一个临时文件,再挪动到目的位置,那这个tmp位置在哪里呢?是不是这个位置不可写,才导致了无法上传文件?
   查找网上资料,发现php.ini下面有2个地方关于上传的配置:
file_uploads = On                          这里设置是否允许HTTP上传,默认应该为ON的
   ;upload_tmp_dir=                          这里设置上传文件存放的临时位置
网上对于这2个地方的相关资料有:
I try to set up file uploading under IIS 7 and PHP 5.
First problem was to set 2 variables in php.ini
file_uploads = On           //这里是说php.ini文件这个地方设置成On
upload_tmp_dir = "C:\Inetpub\wwwroot\uploads"    //这个路径就是自己设置的上传文件临时存储路径
For some reasons such directory name works, 
but "upload_tmp" won't work.
The second problem was to set correct user rigths for upload folders where you try to save your file. I set my upload folder rights for the "WORKGROUP/users" for the full access. You may experiment by yourselves if you not need execute access, for example.
    我的php.ini中upload_tmp_dir是被注释的,没有启用,更没有设置,可是为什么Apache2却可以正常上传呢?难道问题真的出在这里?
解决:
   新建一个文件夹做临时上传目录,按照上面的英文说明修改php.ini中相应的那2项,把临时上传目录upload_tmp_dir设置成刚才建立的文件夹,把该文件夹的权限赋予“IUSR_计算机名”用户可写,重新启动IIS,上传试试,问题真的就这样解决了。
最终的分析答案:
   上面的内容写于09年,但是现在2010年7月我新增一台服务器,又出现了这个问题,同时再次按照上面的解决方法实施,在操作的过程中大概是由于哪里出了错,竟然没有成功,不得不抽出点时间来研究具体原因,找到了最终产生这个问题的原因如下。
    无法上传文件,不代表所有文件都无法上传,因为我的一个网站,flash调用fwrite()传头像之类的成功了,但是调用@move_uploaded_file($f["tmp_name"], $dest_dir.'/'.$fileName)这样的函数传照片的时候仍旧无法上传。
   经过我的分析,原因是由于fwrite()是传的二进制文件,而move_uploaded_file()传的是文本文件,而windows操作系统是区分这2种文件的 [参考php手册fwrite()函数的说明],这也就是说这2种不同的文件在php环境下上传时所存储的临时上传目录是不同的,由于在配置IIS环境下的PHP的时候,设置的临时目录为E:\tmp,设置该目录的iusr用户可写,二进制文件即可上传,所以我怀疑该目录就是二进制文件上传临时文件的存储位置,那么move_uploaded_file()传的文本文件的临时文件存储位置在哪里呢?其实就是在上面的那段英文里面,upload_tmp_dir设置的路径就是了,但是我的几台服务器中,每台服务器的这个设置的值都是被注释掉的“no value”,为什么有的服务器可以上传,而有的服务器不可以上传呢?这也就回到了以前我提出的问题,为什么Apache2可以上传而iis不可以上传呢?
    这次我再次分析upload.php文件,分析其中造成该故障的代码具体内容如下:

// 检查是否有文件上传
    if (! $_FILES['upload'.$num]['name'] == ""){
      if ($_FILES['upload'.$num]['size'] < $max_size) {  
   1、 echo "文件上传路径:".$location.$_FILES['upload'.$num]['name'];
    2、echo "文件临时文件名:".$_FILES['upload'.$num]['tmp_name'];
    3、    move_uploaded_file($_FILES['upload'.$num]['tmp_name'],$location.$_FILES['upload'.$num]['name']) or $event = "Failure";
    } else {
     $event = "File too large!";
    }

   其中正常代码中第2句是不存在的,为了测试方便我加上来的,它的主要目的就是测试我的php.ini没有设置upload_dir_tmp的值的时候,上传的文件临时保存在哪里的,经过这个测试发现原来在不配置php.ini的upload_dir_tmp的值的时候,默认的存储位置是在C:\windows\temp目录,并且临时文件是以.tmp为后缀存储的,该文件马上就会被删除,所以你想通过操作系统的文件修改搜索功能是无法找到的,也就无法找到upload_dir_tmp的默认路径是哪里。
   既然找到了upload_dir_tmp的默认路径了,那么修改c:\windows\temp的访问权限,赋予IUSR_用户可写,重启动IIS Admin服务,上传文件,终于成功了。这就是为什么我的多台服务器upload_dir_tmp的值都为空的时候有的可传,有的不可传的原因。
   现在已经修改了IIS使用环境变量方式精简配置php的那篇文章了,因为当时没有注意这个位置的权限设置,造成了如今的问题,不过最终解决也是好的。

Monday, February 21, 2011

你还在用IE6浏览器吗?(转)

2001年10月,一个伟大的公司推出了一个伟大的产品的 一个版本。可能连这个公司都不知道他会存在这么长的时间。RT,它就是 Internet explorer 6(以下简称IE6)。的确IE6的成功标志着一个时代,一个信息时代的成长。回首这十年,个人计算机发生了巨大的变化,每人一台PC成为了可能。从当年 的拨号到宽带;从win98到win7 ;从调制解调器到无线wifi;从右键“目标另存为”到迅雷;从博客到微博,从在线音乐到在线高清视频……许多,许多……
可是,我们的网络环境发生了巨大的变化,但是那个蓝色的E 没变,2001年是大多数人的操作系统是win98,好点的能用上win2000,2011年我们至少都用上了win xp,许多人也用上了win7.并且许多XP的用户还是10年前的那个图标……
为什么我们还在用IE6?
1.Ghost盗版的盛行 罪恶指数:★★★★★
可能连比尔盖茨都想不到自己的windows系统会 如此。XP可以 全自动无人值守安装,采用万能GHOST技术,安装系统过程只需5-8分钟,适合新旧各种机型。集成最新微软更新补丁,防黑屏,通过微软正版验证,支持在线更新、  支持用第三方程序在线 更新。
盗版在中国的盛行让许多游戏公司都望而却步,这符合中国的国情,属于中国的特色。在版权意识上我们第一次消除了阶级,无论金领、白领还是蓝领都知道5块 钱就能买张盘。就这样windows XP在中国的市场居高不下,而且现在Ghost部署技术十分成熟。即便是有正版的用户也不喜欢等半小时安装个系统。人们也不喜欢去用新的系统,或许人们的 电脑也不支持太好的系统。所以他们宁愿用这XP.
在Ghost XP里面,IE6是默认安装的。而且根据封装系统的描述,屏蔽了 IE7和IE8的自动推送功能。也就不提示用户进行升级,这样一般用户是不会主动去下载浏览器的。也就是用IE6直到下一次重装。就这样不停的循环,用了10年。
2.在线支付网站的强力支持 罪恶指数:★★★★☆
从08年到现在 以C2C模式的电子商务在中国火了起来,随之是 网上银行的大力兴起。有许多浏览器的朋友在网上银行上发现,许多接口都只能用IE浏览器,chrome Firefox 根本无法完成交易。所以一些用户按过一次浏览器就再也不装了。再结合1 中的原因,用户很正常就坚持用IE6。
3.作用与反作用 罪恶指数:★★★☆☆
由于IE6的用户数量庞大,许多网站开发者就选择了以大众为准。他们竭力去使用户在自己网站上得到最大化的体验。许多开发者都竭尽全力去把在IE6下的 页面做好。甚至一些开发者的口号很响,Only IE 6。单纯在IE6下做,许多页面根本不是W3C 标准。因为IE6 有自己的一套解析渲染体系,我们现在看IE6解析的代码,许多都是与世界标准W3C有巨大脱节。同样,在开发者的错误导向下,许多用户没有觉得自己的浏览 器没有什么不好的。在这样的相互错觉下,IE6占稳了。这种作用与反作用,至今依然存在,也很普遍。迫使开发者趋向用户,用户趋向IE6。
4.其他浏览器的推广不力 罪恶指数:★★★☆☆
现在中国用户的电脑上浏览器能多一些,他们大多数是安装其他软件带来的。如360浏览器,搜狐浏览器。但就目前来看,搜狐浏览器依然是IE6内核。而 google chrome,firefox安装量很少,因为他们推广的速度缓慢,使得一些用户依然是用非IE浏览器,但 是IE内核的浏览器。虽然不是IE6的浏览器,但还是换汤不换药。渲染出的效果和IE6相当。
5.门户网站很难做出 艰难的决定  罪恶指数:★★★☆☆
用户和开发者是相互作用的关系。我们的门户网站 新浪,腾讯,网易,搜狐,还有一些视频网站,社交网站比如微博。就应该主动去做个决定,就是对IE6用户进行提示,或者根本就不允许访问。这样,开发者不 再用为IE6而苦恼、不再专门为IE6写一些不合逻辑的代码。google 已经开始放弃IE6了,youtube也提示无法为IE6用户提供正常的服务。Myspace.com apple.qq.com gougou.com等网站也提示用户进行升级。
6.IE 7&8的不给力 罪恶指数:★★☆☆☆
IE 7&8,上市以来似乎并没有得到大众的认可,刚上市几天就爆出漏洞。而且IE 7&8 在最开始的时候问题较多, 这样给一些中间用户带来了巨大的影响,许多人的感觉就是:新功能没感觉出来,反而感觉不如IE6呢。IE 7&8给用户带来的不像是chrome那样,一种全新的浏览体验,依然是原来的FF核。 还有重要的是,IE 这个软件和他的操作系统联系比较紧密。安装IE7 必须通过windows的 正版软件验证。由于中国的盗版严重,开始安装IE7的用户,可能受到阻碍了。后来尽管一些牛人推出了对应的补丁,但一些人还是选择了放弃IE6的升级,依 然IE6。而且,IE 7&8的界面和IE6的界面相差很大,渐渐地把用户的期待耗尽。甚至一些人的电脑运行速度不行,费力用上IE 7&8 就又装回IE6。
IE 7&8的不给力
IE6到底哪不好?
ie6在用户的心中的完美的,因为我们看到的都是规整的页面,可是用户不知道背后开发者做出了多少努力。IE6有如下缺点:
1.安全问题:
IE6 Bug,这个是让许多用户都很无奈的,网页卡死,然后就病毒泛滥。08年左右网马爆发,很大程度上是IE6造成的。就目前来说,IE6仍至少有142个漏洞,其中有22个尚未发布修补程序。就这样,我们电脑的安全受到很大的威胁。
2.HTML5:
当今的主流正向html5+Css3靠拢,一种全新的浏览体验。目前 Google Chrome,Firefox ,Opera ,Safari,以及IE9都支持html5.html5使代码精简,用简单的label就能实现视频(video),音乐(audio)。就能实现视频 播放和音乐播放。
3.不支持透明PNG :
在IE6的浏览器透明的PNG不是透明的,而背景是白色的。这样做出来的页面很难看,而要实现透明的PNG需要用JavaScript中的滤镜来实现这一功能。这给开发者带来许多麻烦,但用户不知道其中的奥秘。
4.解析本身不符合W3C标准
不支持!important ,float 造成双倍Margin,还有……
你还用IE6吗?
通过以上描述,笔者想问:你还用IE6吗?怎样在中国消灭IE6浏览器?去换个浏览器,体验体验全新的浏览模式,可以有一下解决方法供你参考。
1.Google Chrome Frame
这个程序可以让你不更换界面的情况下,使用chrome.据专业测评,使用google chrome frame,可以让你浏览速度提升8倍以上。全面提示浏览体验。
2.安装chrome等,保留IE6
你可以平时用chrome,在使用网银的时候使用IE6.这样并存的方式还是值得推广的。
3.双核浏览器
腾讯TT,360均推出了双核的浏览器。这里的双核和电脑不同,浏览器的两核是不同的。IE是trident,chrome是webkit,双核浏览器可以实现自动切换。省去了手动切换的麻烦。
4.直接IE9
IE9已经支持html5,这足以让广大用户欣慰的。如果你是IE控,那就升级IE9吧。
来源:卓非博客投稿,原文链接

本文地址:http://www.williamlong.info/archives/2525.html

Tuesday, February 8, 2011

Google搜索技巧整理(转)


Google初级应用技巧:

1. 用空格表示关键词之间的“与”操作。
2.Google用减号“-”表示逻辑“非”操作。“A ?B”表示搜索包含A但没有B的网页。
3.Google用大写的“OR”表示逻辑“或”操作。搜索“A OR B”,意思就是说,搜索的网页中,要么有A,要么有B,要么同时有A和B。
杂项语法:
1.很多搜索引擎支持通配符号,如“*”代表一连串字符,“?”代表单个字符等。Google对通配符支持有限。它目前只可以用“*”来替代单个字符,而且包含“*”必须用“”引起来。比如,“”以*治国“”,表示搜索第一个为“以”,末两个为“治国”的四字短语,中间的“*”可以为任何字符。
2.Google对英文字符大小写不敏感,“GOD”和“god”搜索的结果是一样的。
3.用短语做关键字,必须加英文引号
4.如果要对忽略的关键字进行强制搜索,则需要在该关键字前加上明文的“+”号(注意:大部分常用英文符号(如问号,句号,逗号等)无法成为搜索关键字,加强制也不行。)
进阶搜索:
1.“site”表示搜索结果局限于某个具体网站或者网站频道,如“www.sina.com.cn”、“edu.sina.com.cn”,或者是某个域名,如“com.cn”、“com”等等。如果是要排除某网站或者域名范围内的页面,只需用“-网站/域名”。
2.“filetype:”是Google开发的非常强大实用的一个搜索语法。也就是说,Google不仅能搜索一般的文字页面,还能对某些二进制文档进行检索。目前,Google已经能检索微软的Office文档如.xls、.ppt、.doc,.rtf,WordPerfect文档,Lotus1-2-3文档,Adobe的.pdf文档,ShockWave的.swf文档(Flash动画)等
3.“inurl”语法返回的网页链接中包含第一个关键字,后面的关键字则出现在链接中或者网页文档中。有很多网站把某一类具有相同属性的资源名称显示在目录名称或者网页名称中,比如“MP3”、“GALLARY”等,于是,就可以用INURL语法找到这些相关资源链接,然后,用第二个关键词确定是否有某项具体资料。INURL语法和基本搜索语法的最大区别在于,前者通常能提供非常精确的专题资料。
4.“allinurl”语法返回的网页的链接中包含所有作用关键字。这个查询的关键字只集中于网页的链接字符串。
5.“intitle”和“allintitle”的用法类似于上面的inurl和allinurl,只是后者对URL进行查询,而前者对网页的标题栏进行查询。网页标题,就是HTML标记语言title中之间的部分。网页设计的一个原则就是要把主页的关键内容用简洁的语言表示在网页标题中。因此,只查询标题栏,通常也可以找到高相关率的专题页面。
6.所谓“锚”,就是在同一个网页中快速切换链接点。与URL和title类似,Google提供了两种对anchor的检索,“inanchor”和“allincnchor”。
7.如果你拥有一个个人网站,估计很想知道有多少人对你的网站作了链接。而“link”语法就能让你迅速达到这个目的。
示例:搜索所有含指向华军软件园“www.newhua.com”链接的网页。
搜索:“link:www.newhua.com”
8.“related”用来搜索结构内容方面相似的网页。例:搜索所有与中文新浪网主页相似的页面(如网易首页,搜狐首页,中华网首页等),“related:www.sina.com.cn/index.shtml”。