首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

Windows PHP 解決 php_curl.dll 無法載入問題:libeay32.dll、ssleay32.dll 依賴修復全記錄

     編輯:PHP 相關知識

錯誤現象

PHP Warning:  PHP Startup: Unable to load dynamic library 'php_curl.dll' 
(tried: ext\php_curl.dll - 找不到指定的模組。, 
ext\php_php_curl.dll.dll - 找不到指定的模組。) in Unknown on line 0

phpinfo() 中無 cURL 區塊,function_exists('curl_init') 返回 false。

根本原因

Windows 下 php_curl.dll 依賴 OpenSSL 庫:

  • PHP 5.6 / 7.0-7.2:libeay32.dll、ssleay32.dll (OpenSSL 1.0.x)
  • PHP 7.3+:libcrypto-1_1.dll、libssl-1_1.dll (OpenSSL 1.1.1)
  • PHP 8.0+:libcrypto-3.dll、libssl-3.dll (OpenSSL 3.x)

這些 DLL 必須在系統 PATH 環境變量可見的目錄中,PHP 才能載入 php_curl.dll。

三步驟標準修復流程

步驟 1:確認 php.ini 配置

; 1. extension_dir 指向正確 ext 目錄
extension_dir = "C:/php/ext"

; 2. 啟用 curl 擴展 (PHP 7.2+ 可省略 .dll 後綴)
extension=curl
; extension=php_curl.dll  ; PHP 5.6/7.0-7.1

; 3. 確保 allow_url_fopen=On (cURL 不強制依賴,但建議開啟)
allow_url_fopen = On

步驟 2:複製 OpenSSL DLL 到 PHP 根目錄(推薦,隔離不污染系統)

# 假設 PHP 安裝在 C:\php
# 根據 PHP 版本複製對應 DLL

# PHP 7.3 - 7.4 (OpenSSL 1.1.1)
copy C:\php\libcrypto-1_1.dll C:\php\
copy C:\php\libssl-1_1.dll    C:\php\

# PHP 8.0 - 8.2 (OpenSSL 3.x)
copy C:\php\libcrypto-3.dll   C:\php\
copy C:\php\libssl-3.dll      C:\php\

# PHP 5.6 / 7.0 - 7.2 (OpenSSL 1.0.2)
copy C:\php\libeay32.dll      C:\php\
copy C:\php\ssleay32.dll      C:\php\

原理:Windows DLL 搜尋順序:應用程序目錄 → 系統目錄 → PATH 目錄。PHP 根目錄即「應用程序目錄」,優先級最高,避免版本衝突。

步驟 3:重啟 Web 服務並驗證

# Apache
httpd -k restart

# Nginx + PHP-FPM
net stop php-fpm & net start php-fpm
# 或 任務管理器重啟 php-cgi.exe 進程

# CLI 驗證
php -m | findstr curl
php -r "var_dump(curl_version());"

成功標誌:輸出包含 curl 且 curl_version() 返回版本信息陣列。

進階排查:依賴行走器

若仍失敗,用 Dependency Walker (depends.exe) 分析 php_curl.dll:

  1. 打開 C:\php\ext\php_curl.dll
  2. 查看紅色缺失的 DLL(通常是 libcrypto-*.dll、libssl-*.dll、nghttp2.dll、libssh2.dll、zlib.dll)
  3. 從 PHP 目錄複製所有缺失 DLL 到 PHP 根目錄

常見誤區與避坑

誤區後果正確做法
複製 DLL 到 C:\Windows\System32污染系統、不同 PHP 版本衝突、安全風險複製到 PHP 根目錄或專用目錄並加入 PATH
只加 PATH 不重啟服務進程環境變量不更新,無效必須重啟 Apache/Nginx/PHP-FPM 進程
php.ini extension_dir 路徑錯誤找不到 php_curl.dll 本體使用絕對路徑 C:/php/ext,斜槓統一
混用 Thread Safe (TS) / Non-Thread Safe (NTS) 版本模組載入失敗、隨機崩潰PHP、Apache、擴展必須同一線程模型
OpenSSL 版本不匹配符號缺失、運行時崩潰嚴格使用 PHP 發布包自帶的 DLL

現代替代:Docker 統一環境

# Dockerfile
FROM php:8.2-apache
RUN docker-php-ext-install curl
# 自動處理所有依賴,無需手動折騰 DLL

生產環境強烈建議容器化,徹底消除「在我機器上能跑」的依賴地獄。

總結

Windows PHP 載入 php_curl.dll 失敗 99% 是 OpenSSL DLL 不在 PATH 可見範圍。標準修復:php.ini 啟用 extension=curl → 複製 libcrypto/libssl 到 PHP 根目錄 → 重啟服務。用 Dependency Walker 可精準定位缺失依賴。長遠看,Docker 容器化是徹底解決之道。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved