集成新浪/微博/支付寶等第三方 SDK 時,調用 curl_init() 拋出 Call to undefined function curl_init()。根因:PHP 未啟用 cURL 擴展,或依賴庫加載失敗。
curl_multi)php.ini(最關鍵步驟)<?php phpinfo(); ?>
瀏覽器查找 Loaded Configuration File,例如:
C:\Apache24\bin\php.ini(Apache 模塊模式)C:\php\php.ini(CLI 模式,Web 不生效)切記:修改 Apache 加載的那個 php.ini!
; php.ini extension=curl ; PHP 7.2+ 無需寫 php_curl.dll,統一 extension=curl
cURL 依賴 OpenSSL、libssh2、nghttp2 等 DLL。必須將以下文件從 PHP 安裝目錄複製到 Apache 的 bin 目錄(如 C:\Apache24\bin\):
| 文件 | 作用 | 來源 |
|---|---|---|
libcrypto-3-x64.dll | OpenSSL 3.x 加密核心 | PHP 安裝目錄 |
libssl-3-x64.dll | OpenSSL 3.x SSL/TLS | |
libssh2.dll | SFTP/SCP 支持 | |
nghttp2.dll | HTTP/2 多路複用 |
⚠️ 絕對不要複製到 C:\Windows\System32!會導致系統級版本衝突,影響其他軟件。
# 管理員 PowerShell Restart-Service Apache2.4 # 或 httpd.exe -k restart
再次訪問 phpinfo(),搜索 cURL support → enabled,版本信息應顯示 libcurl/8.x.x OpenSSL/3.x.x。
<?php
// test_curl.php
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => 'https://httpbin.org/get',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_SSL_VERIFYPEER => true,
CURLOPT_CAINFO => __DIR__ . '/cacert.pem', // 必須!
]);
$resp = curl_exec($ch);
if ($resp === false) {
die('cURL Error: ' . curl_error($ch) . ' (Code: ' . curl_errno($ch) . ')');
}
$info = curl_getinfo($ch);
curl_close($ch);
echo "HTTP {$info['http_code']} | Time: {$info['total_time']}s\n";
var_dump(json_decode($resp, true));
?>
# 下載最新 CA 束 wget https://curl.se/ca/cacert.pem -O C:\Apache24\bin\cacert.pem # 或 PowerShell Invoke-WebRequest https://curl.se/ca/cacert.pem -OutFile C:\Apache24\bin\cacert.pem
在 php.ini 全局生效:
curl.cainfo = "C:/Apache24/bin/cacert.pem" openssl.cafile = "C:/Apache24/bin/cacert.pem"
<?php
function sinaOAuthToken(string $code): array {
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => 'https://api.weibo.com/oauth2/access_token',
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query([
'client_id' => $_ENV['SINA_APP_KEY'],
'client_secret' => $_ENV['SINA_APP_SECRET'],
'grant_type' => 'authorization_code',
'redirect_uri' => $_ENV['SINA_REDIRECT_URI'],
'code' => $code,
]),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 15,
CURLOPT_CONNECTTIMEOUT => 5,
CURLOPT_SSL_VERIFYPEER => true,
CURLOPT_SSL_VERIFYHOST => 2,
CURLOPT_CAINFO => ini_get('curl.cainfo'),
CURLOPT_USERAGENT => 'MyApp/1.0',
CURLOPT_HTTPHEADER => [
'Accept: application/json',
'Content-Type: application/x-www-form-urlencoded',
],
// Cookie 持久化(OAuth 多步驟可能需要)
CURLOPT_COOKIEJAR => sys_get_temp_dir() . '/sina_cookie.txt',
CURLOPT_COOKIEFILE => sys_get_temp_dir() . '/sina_cookie.txt',
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$errno = curl_errno($ch);
$error = curl_error($ch);
curl_close($ch);
if ($response === false) {
throw new RuntimeException("cURL 失敗: $error ($errno)");
}
if ($httpCode !== 200) {
throw new RuntimeException("HTTP $httpCode: $response");
}
$data = json_decode($response, true);
if (empty($data['access_token'])) {
throw new RuntimeException("無 access_token: " . ($data['error_description'] ?? '未知'));
}
return $data;
}
?>
| 錯誤碼 | 常量 | 含義 | 解決方案 |
|---|---|---|---|
| 60 | CURLE_SSL_CACERT | CA 憑證驗證失敗 | 配置正確的 CURLOPT_CAINFO/curl.cainfo |
| 6 | CURLE_COULDNT_RESOLVE_HOST | DNS 解析失敗 | 檢查服務器 DNS、防火牆、/etc/resolv.conf |
| 7 | CURLE_COULDNT_CONNECT | 無法連接服務器 | 檢查 IP/端口通達性、安全組、防火牆 |
| 28 | CURLE_OPERATION_TIMEDOUT | 操作超時 | 調大 CURLOPT_TIMEOUT、CURLOPT_CONNECTTIMEOUT |
| 35 | CURLE_SSL_CONNECT_ERROR | SSL 握手失敗 | TLS 版本不兼容、憑證過期、SNI 缺失 |
| 51 | CURLE_SSL_ENGINE_NOTFOUND | SSL 引擎未找到 | OpenSSL DLL 未加載、版本不匹配 |
# Ubuntu 22.04/24.04 sudo apt update && sudo apt install php8.3-curl ca-certificates sudo systemctl restart php8.3-fpm nginx # CentOS 9 / RHEL 9 / Rocky / Alma sudo dnf install php-curl ca-certificates sudo systemctl restart php-fpm nginx # 驗證 php -m | grep curl php -r "var_dump(curl_version());"
CURLOPT_DNS_CACHE_TIMEOUT)curl_handle,避免重複握手CURLOPT_SSL_VERIFYPEER = true、CURLOPT_SSL_VERIFYHOST = 2、禁用 SSLv3/TLS 1.0/1.1Windows 下啟用 cURL 核心在於:改對 php.ini + 複製 DLL 到 Apache bin 目錄 + 配置 CA 憑證。完成這三步,99% 的「undefined function」與「SSL certificate problem」即可解決。後續對接任何 HTTPS API,皆可復用此配置基線。