2012-03-27 117 views
5

我对Windows Server 2008 R2上的PHP有一个非常恼人的问题。 IIS和Apache在同一台机器上运行(Apache嵌入了另一个产品,并且这不是我的选择)。Apache不会加载PHP的MySQL扩展,但IIS不会

IIS配置为能够使用PHP的多个版本,并没有在那里的PHP版本中已安装的Windows安装程序(这样的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中运行,它失败了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是​​默认的系统帐户,因为它看起来像系统有权访问所有的DLL。

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

解决这个问题谷歌搜索后,我发现其他突然发生的问题在PHP中的Windows服务器,但通常分辨率上 - 重建php.ini文件,重新启动IIS,重新启动服务器 - 并没有帮助。

任何关于下一步的建议都非常感谢!

+0

您是否检查到c:\%php_5.2.5_install_path $ \中的dll被复制到C:\ Windows \ System32?例如'libmysql.dll'或'libmhash.dll'。我知道这是Apache + PHP所必需的,不确定是否需要IIS + PHP – JScoobyCed 2012-03-27 02:06:01

+0

@JScoobyCed这听起来很有希望,但我也有在IIS中工作的PHP 5.3.10,它目前在连接到MySQL时没有问题。是否存在将5.2.5 DLL复制到System32会对5.3.10产生负面影响的风险? – tomfumb 2012-03-27 16:25:01

+0

如果System32中已经存在5.3.10 DLL,是的,可能会影响PHP 5.3.10 – JScoobyCed 2012-03-28 01:22:36

回答

1

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

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

3

我知道这可能不是最终回答你的问题,但是,你有没有尝试配置Apache执行通过FastCGI的(mod_fcgid)PHP,并使用相同的二进制为IIS呢?

我知道你正在使用mod_php,但通过FastCGI调用它将从Web服务器进程中抽象出PHP。如果扩展在通过FastCGI调用的PHP下正常加载,没有理由不能在其他Web服务器上工作。

另外,我个人beleive,这是一个好主意,因为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的文件现在是e由PHP FastCGI包装器执行。只要确保指定与IIS正在使用的相同的php-cgi.exe二进制文件即可。

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

让我更新。

+0

感谢您 - 你能给我提示我将如何配置Apache以使用CGI? – tomfumb 2012-03-30 18:27:10

+0

我编辑了我的答案。 – 2012-03-30 18:35:42

+0

非常感谢您的更新。我不能在办公时间内测试这种变化(PST),所以我会在周末放弃这个变化 – tomfumb 2012-03-30 18:51:10

1

你通常需要为不同版本的PHP您正在运行不同的库DLL文件。最好将这些放在自己的目录中。

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

† IIRC VC6/VC9将与Visual Studio PHP的哪个版本一起编译。

+0

感谢您的建议,如果我以前想过这可能会有所帮助,因为我应该看到一个错误说php_mysql.dll无法找到 – tomfumb 2012-04-04 16:38:01

+0

没问题,从您的后续答案我可能会建议设置'extension_dir '(或者只是你的php文件夹的目录名或者文件夹的完整c:\路径)在你的'php.ini'文件中,而不是使用'PATH'。这些应该是特定于每个PHP实例,并应指向包含该PHP的DLL的目录。 FWIW'PATH'是分层的,所以Windows将使用包含它所查找文件的列表中的第一个文件夹,如您所说,这将会在运行多个版本的PHP时导致您的问题。 – George 2012-04-10 08:57:29

+0

也供将来参考,这里有更多的帮助:http://php.net/manual/en/install.windows.extensions.php – George 2012-04-10 08:59:57