欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

修复一个 PHP 配置故障

程序员文章站 2022-06-09 09:59:15
...

故障现象: 在 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 很多问题是因为权限配置引起的,所以,告诫那些外行系统管理员,请不要随便加上或去除文件夹的的权限,从而引起系统的安全性降低和意外故障。再注意,配置 系统也要做好记录,并及时测试该配置结果对系统的影响,不要哪天发现系统不对劲,还不知道是哪个配置引起的。