Warning: file_get_contents(): failed to open stream: Invalid argument in /path/to/script.php on line 16
原因:PHP 未啟用 OpenSSL 擴展,無法建立 TLS/SSL 連線。
; 找到並取消註解 extension=php_openssl.dll ; Windows ; 或 extension=openssl.so ; Linux/macOS
# Apache systemctl restart httpd # 或 service apache2 restart # Nginx + PHP-FPM systemctl restart php-fpm
方案二:使用 cURL 替代(免配置、功能更強)
適用於無法修改 php.ini 的虛擬主機環境。
通用 HTTPS 請求函式
function httpsGet(string $url, array $options = []): string|false { $ch = curl_init(); $defaults = [ CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYPEER => false, // 僅開發/測試環境使用 CURLOPT_SSL_VERIFYHOST => false, // 生產環境請設為 true 並配置 CA 憑證 CURLOPT_TIMEOUT => 30, CURLOPT_CONNECTTIMEOUT => 10, CURLOPT_FOLLOWLOCATION => true, CURLOPT_MAXREDIRS => 5, CURLOPT_USERAGENT => 'PHP-cURL/' . phpversion(), ]; curl_setopt_array($ch, $defaults + $options); $result = curl_exec($ch); $error = curl_error($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($result === false) { error_log("cURL Error [$code]: $error for URL: $url"); return false; } if ($code >= 400) { error_log("HTTP $code for URL: $url"); } return $result; } // 使用 $html = httpsGet('https://api.example.com/data'); if ($html) { $data = json_decode($html, true); }進階:支援 POST、標頭、憑證驗證
function httpsRequest(string $url, string $method = 'GET', array $data = [], array $headers = []): string|false { $ch = curl_init($url); $options = [ CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => $method, CURLOPT_SSL_VERIFYPEER => true, // 生產環境必須驗證 CURLOPT_CAINFO => '/path/to/cacert.pem', // CA 憑證包 CURLOPT_TIMEOUT => 30, ]; if ($method !== 'GET' && $data) { $options[CURLOPT_POSTFIELDS] = is_array($data) ? http_build_query($data) : $data; } if ($headers) { $options[CURLOPT_HTTPHEADER] = array_map(fn($k, $v) => "$k: $v", array_keys($headers), $headers); } curl_setopt_array($ch, $options); $result = curl_exec($ch); // ... 錯誤處理同前 ... curl_close($ch); return $result; }生產環境安全配置清單
- 必須驗證憑證:
CURLOPT_SSL_VERIFYPEER => true- 配置 CA 憑證包:下載 cacert.pem,設定
CURLOPT_CAINFO- 驗證主機名:
CURLOPT_SSL_VERIFYHOST => 2- 禁用不安全協定:
CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1_2- 設定超時:避免連線卡死佔用資源
常見問題排查
| 錯誤 | 原因 | 解決 |
|---|---|---|
| SSL certificate problem | CA 憑證缺失/過期 | 更新 cacert.pem、設定 CURLOPT_CAINFO |
| SSL connect error | TLS 版本不支援 | 設定 CURLOPT_SSLVERSION |
| Operation timed out | 防火牆/網路不通 | 檢查連線、增加超時 |
| Protocol "https" not supported | OpenSSL 未編譯/載入 | 重新編譯 PHP 或載入擴展 |
掌握這兩大方案,無論是有完整伺服器控制權的環境,還是受限的虛擬主機,都能可靠地處理 HTTPS 請求。生產環境務必啟用完整憑證驗證,保障資料傳輸安全。