在我的Windows7上安装了PHP 7.1和Apache 2.4之后,我想使用它的一些扩展。我编写了一个小的测试脚本index.php
来调用给定扩展的一些函数。
<?php
var_dump(mb_strlen('p'));
var_dump(mysqli_connect_error());
并取消注释php.ini
中的适当行,如
...
;extension=php_ldap.dll
extension=php_mbstring.dll
;extension=php_exif.dll ; Must be after mbstring as it depends on it
extension=php_mysqli.dll
;extension=php_oci8_12c.dll ; Use with Oracle Database 12c Instant Client
...
并根据CCD_ 3 的窗口特定部分配置extension_
; Directory in which the loadable extensions (modules) reside.
; http://php.net/extension-dir
; extension_dir = "./"
; On windows:
; extension_dir = "ext"
extension_dir = "ext"
我重新启动了Apache web服务器,并获取了http://localhost/index.php.我收到错误消息:
致命错误:未捕获错误:调用C:\Program Files\Apache24\htdocs中未定义的函数mb_strlen()
这意味着没有加载扩展。
我仔细检查了我在中进行修改的php.ini
与浏览器中显示的phpinfo()
相同:
Loaded Configuration File C:Program Filesphpphp.ini
相反,如果我不是通过web服务器而是从命令行启动相同的index.php,那么我会得到不同的输出:
C:Program FilesApache24htdocs>"C:Program Filesphpphp.exe" index.php
int(1)
NULL
这意味着扩展被正确加载。
命令行PHP使用相同的php.ini
:
c:Program FilesApache24htdocs>php -i|find "Loaded Configuration File"
Loaded Configuration File => C:Program Filesphpphp.ini
同一php.ini
文件如何从命令行加载扩展名,但在通过web服务器使用时不加载?
与php.ini中的描述相反,extension_dir
应该使用完整路径指定,而不仅仅是相对路径。从更改php.ini
中的行
extension_dir = "ext"
至
extension_dir = "C:/Progra~1/php/ext"
并且重新启动web服务器解决了这个问题。
注意:我使用DOS-8.3路径而不是"C:/Program Files/php/ext"
,因为根据php-7.1.11-Win32-VC14-x64.zip\install.txt手册,它不喜欢包含空格的路径:
您可以选择不同的位置,但路径中没有空格(如C:\Program Files\PHP),因为如果这样做,一些web服务器会崩溃。
我提到的路径不包含任何空格,所以我不认为我做错了什么。尽管如此,如果我将php安装到默认目录c:\php,我不确定它会如何工作,但定义完整路径似乎是一种更安全的方式。
检查哪些模块是Apache使用的:
- 转到您的apache配置。即:
cd /etc/apache2/mods-enabled
- 列表启用模块
ls -lsai php*
(在我的情况下,启用了以前的版本) - 删除以前的模块(IMC:
rm php*
) - 启用所需的模块。IMC:
sudo ln -s ../mods-available/php7.4.load
sudo ln -s ../mods-available/php7.4.conf
- 重载apache(IMC:
sudo /etc/init.d/apache2 restart
) - 使用
print/dump phpinfo();
检查Apache正在运行哪个php模块
示例中的命令将在Linux/Unix机器上工作。不在窗户上恐怕