修复一个 PHP 配置故障
故障现象: 在 Windows Server 2003+IIS6.0 环境下,原先配置好的 PHP5.0.4可以正常工作。但在同一台机器上,Apache2.2.8+PHP5.2.5下正常运行的代码,在 IIS 下不能正确执行 exec()函数。比如,exec(cd,$arr,$ret) 语句,其执行结果,$arr 数组的值应该是包
故障现象:
在 Windows Server 2003+IIS6.0 环境下,原先配置好的 PHP5.0.4 可以正常工作。但在同一台机器上,Apache2.2.8+PHP5.2.5下正常运行的代码,在 IIS 下不能正确执行 exec() 函数。比如,exec(’cd’,$arr,$ret) 语句,其执行结果,$arr 数组的值应该是包含该语句的 php 文件做在的 Windows 路径,但结果却是“C:/Windows”文件夹。并且不能正确执行其他外部 exe 程序。
诊断:
IIS 配置里,已经开放 isapi 扩展允许。
Windows/system32/cmd.exe 已经加过 IUSR_… 账户权限。
要执行的外部 exe 程序,已经拷贝到 Windows/system32 文件夹下,也已经加过 IUSR_… 账户权限。
网站所在的文件夹,已经赋予 IUSR_… 账户权限。
怀疑是 PHP 版本过低,或哪里权限不够导致该问题。
(1)升级 PHP5.0.4 到 5.2.5
Windows 的全局 Path 变量配置指向 PHP5.2.5
文件夹。PHP5.2.5 的 php.ini 文件拷贝到 Windows 文件夹下。网站的 .php 映射指向到 PHP5.2.5 文件夹下的
php5isapi.dll。重启 IIS 后,打开网站,弹出一个提示框,提示需要输入用户名和密码,输入 Windows 的
Administrator 账户和密码后,仍不能打开网站。
这时想到,给网站所在文件夹加上 User
账户的读取和执行权限试一下。执行该操作后,不再弹出要求账户和密码的对话框,可以打开网站的下级页面(这一步至关重要)。但不能打开首页,可能是因为首
页调用了数据库连接的原因。这时能打开测试 exec() 函数的 php 页面,结果仍然不正确。
这时怀疑是已经起作用的
PHP5.0.4 的文件和 5.2.5 相冲突。果然,在 Windows/system32 文件夹下发现原 5.0.4 的所有 .dll
文件,包括 PHP5.0.4 文件夹下和 PHP5.0.4/ext 下的 .dll
文件,都被拷贝到了这里!(注意,这不是必须的,是听信某些“教程”的教唆而这么做的。但既然拷贝到了这里,可能已经其作用了。)于是,把 IIS 和
Apache 服务关闭,把 PHP5.2.5 的所有 dll 文件也拷贝到这里(入乡随俗、如法炮制)。再启动机器–启动机器是因为让
Windows 重新加载最新的 .dll 文件。这时,PHP 因该是全套升级到了 5.2.5 版本了。
启动机器后,报错“No input file specified”,看来有门,因为错误信息已经变化了,说明前述的配置在生效了。在网上搜索产生该错误信息的原因,提示“在 IIS 的 ISAPI 模式下出现‘No input file specified’信息,只要把 php.ini 里的 doc_root = ……注释掉就可以了”,照此提示,在 php.ini 里的 doc_root = …… 语句前加个分号,注释掉语句,再重新启动 IIS。全好了!
注意, doc_root = …… 语句在 php.ini 里一般是“doc_root =”,就是值是空的。但因为我的 php.ini 文件是从与 Apache 配合的 PHP 文件夹拷贝过来的,可能在安装 Apache 时,Apache 赋了一个值。其实把该值设为空的,应该和和注释掉的效果相同。这里不是关键的地方,仅仅是一个小插曲而已。
结论:
问题解决了。但不能确定是因为给网站所在文件夹加上了 User 账户的权限,还是因为升级 PHP,而导致问题的解决的。总之,肯定是上述2个操作的某一把问题解决了,但不能确定是哪一个?应该不是因为2个操作同时起作用的吧,感觉不是,没有理由。
还有一个收获,就是,Windows 很多问题是因为权限配置引起的,所以,告诫那些外行系统管理员,请不要随便加上或去除文件夹的的权限,从而引起系统的安全性降低和意外故障。再注意,配置 系统也要做好记录,并及时测试该配置结果对系统的影响,不要哪天发现系统不对劲,还不知道是哪个配置引起的。
推荐阅读
-
一个非常完美的读写ini格式的PHP配置类分享
-
Zend Framework入门之环境配置及第一个Hello World示例(附demo源码下载)_php实例
-
在APACHE中,同一个IP配置两个虚拟主机的例子_PHP教程
-
请教win7上怎么配置IIS使其作为一个php虚拟站点
-
APACHE中如何在同一个IP配置两个虚拟主机_PHP
-
APACHE中如何在同一个IP配置两个虚拟主机_PHP
-
无须修改php.ini等配置文件,修复session
-
一个新人的,关于php配置mysql
-
一个非常完美的读写ini格式的PHP配置类分享,读写ini格式php_PHP教程
-
APACHE中如何在同一个IP配置两个虚拟主机_PHP教程