Apache没有';不加载PHP MySQL扩展,但IIS加载

Apache没有';不加载PHP MySQL扩展,但IIS加载,apache,windows-server-2008-r2,php,Apache,Windows Server 2008 R2,Php,我在WindowsServer2008R2上遇到了一个非常恼人的PHP问题。IIS和Apache在同一台机器上运行(Apache嵌入了另一个产品,我没有选择) IIS被配置为能够使用多个版本的PHP,并且上面的PHP版本都没有随Windows installer一起安装(因此路径中不存在PHP.exe) Apache使用一个特定版本的PHP(5.2.5线程安全-同样,我不能改变这一点,因为第三方应用程序有针对该版本编译的PHP扩展) 如果我在Apache站点中检查phpinfo(),它没有MyS

我在WindowsServer2008R2上遇到了一个非常恼人的PHP问题。IIS和Apache在同一台机器上运行(Apache嵌入了另一个产品,我没有选择)

IIS被配置为能够使用多个版本的PHP,并且上面的PHP版本都没有随Windows installer一起安装(因此路径中不存在PHP.exe)

Apache使用一个特定版本的PHP(5.2.5线程安全-同样,我不能改变这一点,因为第三方应用程序有针对该版本编译的PHP扩展)

如果我在Apache站点中检查phpinfo(),它没有MySQL条目,即使php.ini中启用了php_MySQL.dll,并且它存在于\ext目录中。如果我(临时)将这个版本的PHP(相同的目录,相同的PHP.ini)添加到IIS中,并使用phpinfo()设置一个测试站点,它将正确地列出MySQL。我知道这不仅仅是phpinfo的一个奇怪问题,因为我有一个基于MySQL的PHP站点在Apache中运行,并且调用未定义的函数MySQL\u connect()

有人建议我将libmysql.dll从PHP目录复制到C:\Windows\System32,但这没有什么区别。由于服务器上有多个版本的PHP,我想可能加载了错误版本的libmysql.dll,但路径中不包含任何包含libmysql.dll的目录

IIS和Apache正在查看完全相同的PHP安装、PHP.ini和ext目录,但只有IIS可以加载MySQL扩展。Apache是默认的系统帐户,因为看起来系统可以访问所有DLL

Apache日志中没有提到任何无法加载的DLL。我将PHP错误记录在事件日志中,但没有关于这些扩展的任何报告

在谷歌搜索了这个问题之后,我在Windows服务器上发现了PHP中突然出现的其他问题,但通常的解决方案——重建PHP.ini、重新启动IIS、重新启动服务器——都没有帮助


任何关于下一步的建议都将不胜感激

我知道这可能最终无法回答您的问题,但是,您是否尝试过通过FastCGI(mod_fcgid)配置Apache以执行PHP,并使用与IIS相同的二进制文件

我知道您正在使用mod_php,但通过FastCGI调用它将从web服务器进程中抽象php。如果扩展在通过FastCGI调用的PHP下加载良好,那么它就没有理由不能在不同的web服务器上工作

此外,我个人认为这样做更好,因为只有在请求*.PHP文件时才调用PHP。通过这种方式,Apache不会为每个请求在内存中加载PHP,例如,这将为您提供更好的静态文件服务性能

更新

为此,您需要从下载mod_fcgid,以这种方式在Apache配置中加载模块

LoadModule fcgid_module modules/mod_fcgid.so  
然后,只需指定在请求PHP页面时要调用的二进制文件:

AddHandler fcgid-script .php  
FcgidWrapper "c:/php/php-cgi.exe" .php  
然后,扩展名为.php的文件现在将由php FastCGI包装器执行。只需确保指定与IIS使用的php-cgi.exe二进制文件相同

以前在IIS中可用的所有扩展现在都应该在Apache中可用,因为后面的PHP安装在这两种环境中是相同的


让我随时更新。

1.-检查phpinfo中的php.ini路径

2.-将php文件夹添加到windows路径

3.-将指令PHPINIDir添加到apache conf

4.-在各自的php.ini中取消注释mysql扩展

5.重新加载apache

6.-检查phpinfo中的mysql扩展


请不要将任何文件复制到system32中,因为您运行的不同版本的PHP通常需要不同的库DLL。最好将它们保存在自己的目录中

有几种不同的情况可能导致模块无法加载,包括PHP版本,无论您运行的是线程安全版本还是非线程安全版本,以及二进制文件是否编译为VC6或VC9†。如果您遇到任何模块加载错误,通常最简单的调试方法是从命令行运行
php.exe
,因为它会抛出任何启动错误(同时确保在php.ini中启用了这些错误,并且在这样做时加载了正确的php.ini文件)


†IIRC VC6/VC9与编译Visual Studio PHP的版本有关。

最终,这个问题归结为缺少路径参考。虽然IIS似乎不需要PHP或PHP模块存在于路径中,但Apache(或者我的PHP版本?)似乎需要。我很幸运,因为我只需要在IIS之外运行一个版本的PHP,因为我不知道如果我有多个Apache实例引用不同版本的PHP,并且路径中有多个PHP目录,会发生什么情况——可能一个总是会失败


到目前为止,将Apache版本的PHP添加到路径中似乎没有影响PHP的IIS版本,但如果突然发生影响,我会大声发誓。

您是否检查了c:\%PHP\U 5.2.5\U install\U path$\中的DLL是否复制到c:\Windows\System32?例如“libmysql.dll”或“libmhash.dll”。我知道这是Apache+PHP需要的,但不确定IIS是否需要+PHP@JScoobyCed这听起来很有希望,但我也在IIS中使用PHP5.3.10,目前连接到MySQL没有问题。是否存在将5.2.5 dll复制到System32会对5.3.10产生负面影响的风险?如果System32中已经存在5.3.10 dll,则存在影响PHP 5.3.10的风险。不幸的是,复制libmysql.dll并没有解决此问题,但我确实发现服务器上的其他地方有多个同名文件。例如,MySQL工作台有一个。MySQL工作台在路径上,所以这个DLL可能是由PHP5.2.5加载的?C:\Windows\System32是路径上的第一个条目,MySQL workbench快结束了,所以我希望复制到System32的DLL会优先—也许会