总有人间一两风,填我十万八千梦

Windows 10 下php.ini中开启了curl和sqlite3等扩展之后,依然无法加载对应dll的问题

软件技巧 Zero、J 890℃ 0评论

在Windows下更新PHP版本到7之后,php.ini中开启了curl和sqlite3,但是依然无法使用对应的功能,例如 Uncaught Error: Call to undefined function curl_init() Uncaught Error: Class 'SQLite3' not found  Uncaught PDOException: could not find driver  ,同时会在系统日志中出现了几个错误信息:

  • PHP Warning: PHP Startup: Unable to load dynamic library ‘curl’ (tried: /ext/curl找不到指定的模块
  • PHP Warning: PHP Startup: Unable to load dynamic library ‘pdo_sqlite’ (tried: ext/pdo_sqlite 找不到指定的模块
  • PHP Warning: PHP Startup: Unable to load dynamic library ‘sqlite3’ (tried: ext/sqlite3 (找不到指定的模块。),

系统信息

  • 操作系统:Windows 10 x64
  • Apache:Apache 2.4 x64
  • PHP:PHP7.4 x64 Thread Safe
  • 运行模式:PHP以模块形式被Apache加载,非FastCGI模式( FastCGI 这种模式,调用php-cgi.exe,不会有这种问题)
  • 未经授权,请不要转载:http://www.youranshare.com

原因分析

Apache2.4加载了php7apache2_4.dll模块,但是对于进程而言,当其需要加载某些DLL的时候,会首先搜索exe所在目录,然后是系统PATH目录。

不幸的是,当使用模块加载的方式运行PHP的时候,当PHP需要加载例如php_curl.dll的时候,其需要依赖这个libssh2.dll,Apache会搜索自己的运行目录,然后和系统的PATH,如果没有找到,那么就不能正常加载php_curl.dll。

在解决方案之前的检查

  • 请首先确保,在Windows下你已经正确的通过Apache调用了PHP模块,也就是你的Apache服务能够正常启动,如下代码使我的httpd.conf加载PHP的配置,请参考。
######### httpd.conf 加载 PHP7
# 定义一个PHP目录路径
Define PHP7ROOT "C:/PHP/PHP7.4"

#加载PHP模块
LoadModule php7_module "${PHP7ROOT}/php7apache2_4.dll"
# 如果PHP加载成功
<IfModule php7_module>
    # 指定 php.ini配置文件所在的目录
    PHPIniDir "${PHP7ROOT}/"
    AddHandler application/x-httpd-php .php
</IfModule>
  • 同时,在Windows下,php.ini中的的扩展目录设置,请使用绝对路径,否则可能会无法加载你的扩展
; Directory in which the loadable extensions (modules) reside.
; http://php.net/extension-dir
;extension_dir = "./"
; On windows:
extension_dir = "C:/PHP/PHP7.4/ext/"

解决方案1

该方法,是通过PATH环境变量的形式将PHP的所在目录加入到系统PATH中,因为libssh2.dll、libsqlite3.dll等这些dll在PHP根目录下,如图所示,是我添加的环境变量。

添加PHP目录到环境变量

添加完成之后,请重启你的Apache服务,即可。

解决方案2

这种方案,是将所依赖的dll拷贝到Apache的bin目录中,博主这里使用了curl和sqlite3,那就只需要将PHP根目录下的libsqlite3.dll和libssh2.dll拷贝过去即可,如图所示。

拷贝依赖dll

同样,在拷贝之后,请重启你的Apache服务。

解决方案2中的注意事项

在PHP根目录中有好几个libxxx.dll文件,博主这里只测试了curl和sqlite的依赖,如果你并不知道你使用的PHP扩展依赖了哪些dll,这里建议就一股脑的使用PATH环境变量进行处理,毕竟实际线上项目上用模块形式加载PHP的不多,自己开发的时候就无所谓了。

转载请注明:悠然品鉴 » Windows 10 下php.ini中开启了curl和sqlite3等扩展之后,依然无法加载对应dll的问题

喜欢 (0)or分享 (0)
发表我的评论
取消评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址