PHP Conference Japan 2024

在 Windows 上安装 PHP 扩展

在 Windows 上加载 PHP 扩展有两种方法:要么将其编译到 PHP 中,要么加载 DLL。加载预编译的扩展是最简单且推荐的方式。

要加载扩展,它必须以系统上的 .dll 文件形式可用。所有扩展都由 PHP 小组自动定期编译(有关下载,请参阅下一节)。

要将扩展编译到 PHP 中,请参阅 从源代码构建 文档。

要编译独立扩展(即 DLL 文件),请参阅 从源代码构建 文档。如果 PHP 发行版或 PECL 中都没有提供 DLL 文件,则可能需要在使用扩展之前对其进行编译。

在哪里可以找到扩展?

PHP 扩展通常称为 php_*.dll(其中星号代表扩展的名称),它们位于 PHP\ext 文件夹下。

PHP 附带了对大多数开发人员最有用的扩展。它们被称为捆绑扩展。

但是,如果捆绑的扩展没有提供所需的功能,则仍然可以在 » PECL 中找到一个可以提供所需功能的扩展。PHP 扩展社区库 (PECL) 是 PHP 扩展的存储库,提供所有已知扩展的目录以及下载和开发 PHP 扩展的托管设施。

如果为特定用途开发了扩展,则可能会将其托管在 PECL 上,以便具有相同需求的其他用户可以从中受益。一个不错的副作用是,这有机会获得反馈、(希望如此)感谢、错误报告,甚至修复/补丁。在提交扩展以在 PECL 上托管之前,请阅读 » PECL 提交

下载哪个扩展?

很多时候,每个 DLL 会有多个版本可用

  • 不同的版本号(至少前两个数字应该匹配)
  • 不同的线程安全设置
  • 不同的处理器架构(x86、x64 等)
  • 不同的调试设置
  • 等等。

请记住,扩展设置应与正在使用的 PHP 可执行文件的设置匹配。以下 PHP 脚本将显示有关 PHP 设置的所有信息

示例 #1 phpinfo() 调用

<?php
phpinfo
();
?>

或从命令行运行

drive:\path\to\php\executable\php.exe -i

加载扩展

加载 PHP 扩展最常见的方法是将其包含在 php.ini 配置文件中。请注意,许多扩展已存在于 php.ini 中,并且只需删除分号即可激活它们。

请注意,从 PHP 7.2.0 开始,可以使用扩展名代替扩展的文件名。由于这是与操作系统无关且更容易的,尤其对于新手来说,因此它成为指定要加载扩展的推荐方式。为了与先前版本兼容,文件名仍然受支持。

;extension=php_extname.dll
extension=php_extname.dll
; As of PHP 7.2.0, prefer:
extension=extname
zend_extension=another_extension

但是,某些 Web 服务器会造成混淆,因为它们不使用与 PHP 可执行文件位于同一位置的 php.ini。要找出实际的 php.ini 所在位置,请在 phpinfo() 中查找其路径。

Configuration File (php.ini) Path  C:\WINDOWS
Loaded Configuration File   C:\Program Files\PHP\8.2\php.ini

激活扩展后,保存 php.ini,重新启动 Web 服务器,然后再次检查 phpinfo()。新扩展现在应该有自己的部分。

解决问题

如果扩展未出现在 phpinfo() 中,则应检查日志以了解问题来自哪里。

如果从命令行 (CLI) 使用 PHP,则可以在屏幕上直接读取扩展加载错误。

如果将 PHP 与 Web 服务器一起使用,则日志的位置和格式会因软件而异。请阅读 Web 服务器文档以查找日志,因为它与 PHP 本身无关。

常见问题包括 DLL 的位置及其依赖的 DLL、php.ini 中“extension_dir”设置的值以及编译时设置不匹配。

如果问题在于编译时设置不匹配,则可能下载的 DLL 不正确。尝试使用正确的设置再次下载扩展。同样,phpinfo() 可以提供很大的帮助。

添加注释

用户贡献注释 4 条注释

j dot o dot l dot a dot n at bk dot ru
11 个月前
为了让 php 能够看到扩展,在 php.ini 中指定扩展目录的地址时,需要指定根文件夹。例如 extension_dir = "php/ext"
bk at kaelberer-aio dot de
1 年前
除了 ferdnyc 和 dario 的有用评论之外:几周前,我使用 PHP 8.1 设置了一个新的 W11。(作为模块)与 Apache 一起使用。它工作得很好。
今天我想安装 PECL 扩展 php-amqp。此扩展附带两个其他文件,据说应放置在 PHP 的主目录中。它从命令提示符运行时工作正常,但使用 Apache 时扩展失败,并显示“无法加载动态库‘amqp’”。
我尝试了 100 种方法来在 php.ini 和 http.conf 中表示路径:c:、C:、\、\\、/、"。我还安装了根目录中的新 PHP 以去除路径中的空格。它没有帮助。
在阅读 dario 的评论时,我偶然发现了他在提到“路径环境变量”。我在 Windows 设置中检查了这一点,我意识到我已将 PHP 的路径添加到用户的路径设置中,但没有添加到系统的路径中。这就是为什么它在命令提示符下工作但在以服务形式启动 Apache 时不起作用的原因。添加它之后,它工作正常。
dario at 4assistance dot com
1 年前
在 Windows 上,将扩展的依赖项放入您选择的目录中,但不要放在 PHP 安装目录中。将该目录添加到 PHP 使用的路径环境变量中。将 <extension_name>.dll 添加到 PHP 的 extension_dir 中,并更新您的 php.ini(除非您只是使用 PHP 的 cli 进行测试)。
ferdnyc at gmail dot com
2 年前
在“解决问题”部分中对此进行了某种程度的含糊其辞,但在 Windows 上安装 PHP 扩展时,(非扩展)DLL 文件的位置错误通常是一个问题。

许多 PHP 扩展不仅包含扩展 DLL,还包含该扩展所需的补充 DLL。(例如,php_luasandbox.dll 附带 lua5.1.dll,即它沙盒化的 lua 解释器。)这些其他 DLL 应与 php.exe 二进制文件放在同一个目录中,而不是扩展目录。

因此,如果 php_luasandbox.dll 安装在 C:\PHP8.1\ext\php_luasandbox.dll 中,则解释器将位于 C:\PHP8.1\lua5.1.dll 中。这允许 PHP 二进制文件 C:\PHP8.1\php.exe 在需要时找到这些其他 DLL。
To Top