【问题标题】:Apache doesn't load PHP MySQL extension but IIS doesApache 不加载 PHP MySQL 扩展,但 IIS 加载
【发布时间】:2012-03-27 01:35:55
【问题描述】:

我对 Windows Server 2008 R2 上的 PHP 有一个非常恼人的问题。 IIS 和 Apache 运行在同一台机器上(Apache 嵌入了另一个产品,它不是我的选择)。

IIS 被配置为能够使用多个版本的 PHP,并且那里的所有 PHP 版本都没有使用 Windows 安装程序安装(因此路径中不存在 php.exe)。

Apache 使用一个特定版本的 PHP(5.2.5 线程安全 - 我无法更改这一点,因为第 3 方应用程序已针对此版本编译了 PHP 扩展)。

如果我在我的 Apache 站点中检查 phpinfo(),它没有 MySQL 条目,即使 php_mysql.dll 在 php.ini 中启用并且它存在于 \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 使用默认系统帐户,因为看起来系统可以访问所有 DLL。

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

在谷歌搜索该问题后,我发现 Windows 服务器上 PHP 中突然出现的其他问题,但通常的解决方法 - 重建 php.ini、重新启动 IIS、重新启动服务器 - 没有帮助。

非常感谢任何关于下一步看哪里的建议!

【问题讨论】:

  • 您是否检查过 c:\%php_5.2.5_install_path$\ 中的 DLL 是否已复制到 C:\Windows\System32 ?例如“libmysql.dll”或“libmhash.dll”。我知道 Apache+PHP 需要这个,不确定 IIS+PHP
  • @JScoobyCed 这听起来很有希望,但我也有 PHP 5.3.10 在 IIS 中工作,它目前连接到 MySQL 没有问题。将 5.2.5 DLL 复制到 System32 是否存在对 5.3.10 产生不利影响的风险?
  • 如果 System32 中已经存在 5.3.10 DLL,是的,存在影响 PHP 5.3.10 的风险
  • 不幸的是,复制 libmysql.dll 并没有解决问题,但我确实发现服务器上的其他地方有几个同名的文件。例如 MySQL 工作台就有一个。 MySQL 工作台在路径上,所以也许这个 DLL 正在由 PHP 5.2.5 加载? C:\Windows\System32 是路径上的第一个条目,MySQL 工作台接近尾声,所以我希望我复制到 System32 的 DLL 优先 - 也许不是这种情况?
  • 你加载了哪些模块?其中很多没有出现在附加模块标题下(这是您正在谈论的列表吗?)我自己使用php_info() 的列表是空的,但如果我使用get_loaded_extensions(),我有一个包含35 个模块的列表。我相信“附加模块”是指第三方模块?

标签: apache windows-server-2008-r2 php


【解决方案1】:

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

我知道你正在使用 mod_php,但是通过 FastCGI 调用它会从网络服务器进程中抽象出 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 扩展名的文件现在将由 PHP FastCGI 包装器执行。请务必指定与 IIS 使用的相同的 php-cgi.exe 二进制文件。

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

让我更新。

【讨论】:

  • 谢谢你 - 你能提供任何关于如何配置 apache 以使用 CGI 的提示吗?
  • 非常感谢您的更新。我无法在办公时间 (PST) 内测试此更改,所以我会在周末尝试一下
  • @tomfumb:你有机会测试我的提议吗?
  • 抱歉耽搁了,最后我实际上并不需要尝试(尽管我很感谢您的意见),因为我终于找到了问题的根源。没有一个答案准确地描述了问题,因此将任何内容标记为正确会误导其他人
  • 没问题,很高兴我能帮上忙!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    对于您正在运行的不同版本的 PHP,您通常需要不同的库 dll。最好将它们保存在自己的目录中。

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

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

    【讨论】:

    • 感谢您的建议,如果我早点想到这一点,它可能会有所帮助,因为我应该看到一个错误,提示找不到 php_mysql.dll
    • 没问题,根据您的后续回答,我可能会建议在您的php.ini 中设置extension_dir(只是您的php 文件夹中的目录名称或文件夹的完整c:\ 路径)文件而不是使用PATH。这些应该特定于每个 php 实例,并且应该指向包含该 PHP 的 DLL 的目录。 FWIW PATH 是分层的,因此 Windows 将使用列表中包含它正在寻找的文件的第一个文件夹,正如您所说,这可能会导致您在运行多个版本的 PHP 时出现问题。
    • 还有更多帮助供将来参考:php.net/manual/en/install.windows.extensions.php
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 1970-01-01
      • 2010-10-26
      • 2014-03-03
      相关资源
      最近更新 更多