呼叫外部 API 時,網路抖動或服務暫時不可用導致回應異常。需實作「重試 N 次,間隔 M 秒,直到回應包含預期關鍵字」的彈性機制。
/**
* 帶重試功能的 cURL GET 請求
* @param string $url 請求網址
* @param string $target 回應必須包含的關鍵字
* @param int $retry 重試次數 (預設 3)
* @param int $sleep 重試間隔秒數 (預設 1)
* @return mixed|bool 成功回傳回應內容,失敗回傳 false
*/
function curlGetRetry($url, $target, $retry = 3, $sleep = 1) {
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CONNECTTIMEOUT => 5,
CURLOPT_TIMEOUT => 5,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => 1,
]);
$output = curl_exec($ch);
while (($retry-- > 0) && (strpos($output, $target) === false)) {
sleep($sleep);
$output = curl_exec($ch);
}
curl_close($ch);
return $output;
}
$response = curlGetRetry('https://api.example.com/status', '"status":"ok"', 5, 2);
if ($response === false || strpos($response, '"status":"ok"') === false) {
// 記錄失敗日誌、發送告警...
}
$sleep *= 2。以 strpos 檢查關鍵字作為成功條件,配合簡單迴圈與 sleep,即可快速賦予 cURL 請求基本的重試韌性,適合非關鍵路徑的外部 API 呼叫。