我对Windows Server 2008 R2上的PHP有一个非常恼人的问题。 IIS和Apache在同一台机器上运行(Apache嵌入了另一个产品,而且我没有选择它。)
IIS配置为能够使用多个版本的PHP,并且没有安装Windows安装程序的PHP版本(因此路径中不存在php.exe)。
Apache使用一个特定版本的PHP(5.2.5线程安全 - 再次我不能改变这个,因为第三方应用程序具有针对此版本编译的PHP扩展)。
如果我在我的Apache站点中检查phpinfo()它没有MySQL的条目,即使在php.ini中启用了php_mysql.dll并且它存在于\ ext目录中。如果我(暂时)将这个版本的PHP(相同目录,相同的php.ini)添加到IIS并使用phpinfo()设置测试站点,它会正确列出MySQL。我知道这不仅仅是phpinfo的一个奇怪的问题,因为我在Apache中运行了一个基于MySQL的PHP站点,它失败了Call to undefined function mysql_connect()
有人建议我将libmysql.dll从PHP目录复制到C:\ Windows \ System32,但这并没有什么区别。由于服务器上有多个版本的PHP,我认为可能是加载了错误版本的libmysql.dll,但PATH不包含任何包含libmysql.dll的目录。
IIS和Apache正在查看完全相同的PHP安装,php.ini和ext目录,但只有IIS可以加载MySQL扩展。 Apache位于默认的System帐户上,因为它看起来像System可以访问所有DLL。
Apache日志没有说明任何DLL无法加载。我在事件日志中记录了PHP错误,但没有报告这些扩展。
在谷歌搜索问题后,我在Windows服务器上发现了PHP中其他突然发生的问题,但通常的解决方案 - 重建php.ini,重启IIS,重启服务器 - 没有帮助。
非常感谢任何有关下一步观看的建议!
答案 0 :(得分:3)
我知道这可能不会最终回答你的问题,但是,您是否尝试过配置Apache以通过FastCGI(mod_fcgid)执行PHP并使用与IIS相同的二进制文件?
我知道您正在使用mod_php,但通过FastCGI调用它将从Web服务器进程中抽象PHP。如果扩展在通过FastCGI调用的PHP下正常加载,则没有理由它不能在不同的Web服务器上工作。
另外,我个人认为这是一个更好的主意,因为PHP仅在请求* .php文件时被调用。这样,Apache就不会为每个请求在内存中加载PHP,例如,这将为您提供更好的服务静态文件的性能。
<强>更新强>
为此,您需要从http://httpd.apache.org/mod_fcgid/下载mod_fcgid,以这种方式在Apache配置中加载模块,
LoadModule fcgid_module modules/mod_fcgid.so
然后,只需指定在请求PHP页面时要调用的二进制文件:
AddHandler fcgid-script .php
FcgidWrapper "c:/php/php-cgi.exe" .php
然后,PHP FastCGI包装器将执行扩展名为.php的文件。请务必在IIS使用时指定相同的php-cgi.exe二进制文件。
以前在IIS中可用的所有扩展现在都应该在Apache中可用,因为后面的PHP安装在两种环境中都是相同的。
让我更新。
答案 1 :(得分:1)
1.-检查phpinfo中的php.ini路径。
2.-将php文件夹添加到Windows路径
http://www.computerhope.com/issues/ch000549.htm
3.-将指令PHPINIDir添加到apache conf
http://php.net/manual/en/install.windows.apache2.php
4.-在相应的php.ini中取消注释mysql扩展
5.-重装apache
6.-检查phpinfo中的mysql扩展
请不要将任何文件复制到system32
答案 2 :(得分:1)
对于您运行的不同版本的PHP,通常需要不同的库dll。最好将它们保存在自己的目录中。
有一些不同的东西可能导致模块无法加载,包括PHP版本,无论您运行的是线程安全版本还是非线程安全版本,以及二进制文件是否编译为VC6或VC9†。通常,如果你遇到任何模块加载错误,最简单的调试方法是从命令行运行php.exe
,因为它会吐出任何启动错误(同时确保在php.ini中启用这些错误并且你正在加载当你这样做时,正确的php.ini文件。)
†IIRC VC6 / VC9与编译的Visual Studio PHP版本有关。
答案 3 :(得分:1)
最终,这个问题归结为缺少PATH参考。虽然IIS似乎不需要PHP或PHP模块存在于路径中,但似乎Apache(或者我的PHP版本?)可以。我很幸运,因为我只需要在IIS之外运行一个版本的PHP,因为我不知道如果我有多个Apache实例在路径中引用不同版本的PHP和多个PHP目录会发生什么 - 大概总会失败。
到目前为止,似乎在路径中添加Apache的PHP版本并没有影响到PHP的IIS版本,但是如果突然发生的话,我会大声宣誓。