PHP扩展不是通过httpd找到的,而是通过CLI找到的,具有相同的PHP.ini



在我的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机器上工作。不在窗户上恐怕

相关内容

  • 没有找到相关文章

最新更新