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 庫:
libeay32.dll、ssleay32.dll (OpenSSL 1.0.x)libcrypto-1_1.dll、libssl-1_1.dll (OpenSSL 1.1.1)libcrypto-3.dll、libssl-3.dll (OpenSSL 3.x)這些 DLL 必須在系統 PATH 環境變量可見的目錄中,PHP 才能載入 php_curl.dll。
; 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
# 假設 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 根目錄即「應用程序目錄」,優先級最高,避免版本衝突。
# 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:
C:\php\ext\php_curl.dlllibcrypto-*.dll、libssl-*.dll、nghttp2.dll、libssh2.dll、zlib.dll)| 誤區 | 後果 | 正確做法 |
|---|---|---|
| 複製 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 |
# 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 容器化是徹底解決之道。