PHP接口請(qǐng)求超時(shí)完整排查與解決方案
接口不是報(bào)錯(cuò),
而是——一直等,最后直接 timeout。
很多 PHP 開(kāi)發(fā)者都會(huì)遇到這種情況:
- 本地請(qǐng)求 OK,上線(xiàn)就超時(shí)
- curl 沒(méi)報(bào)錯(cuò),但返回 false
- 頁(yè)面轉(zhuǎn)圈,最后 504 / timeout
- 第三方接口偶爾成功,偶爾超時(shí)
超時(shí)問(wèn)題最難的地方在于:
你不知道是 代碼慢、接口慢、網(wǎng)絡(luò)慢,還是服務(wù)器在攔你
這篇文章,我直接給你一套 從 PHP 到服務(wù)器的完整排查順序。
一、先確認(rèn):是哪一層在“超時(shí)”?
超時(shí)并不只有一種,不同層的超時(shí),解決方式完全不同。
常見(jiàn)的 4 種超時(shí)來(lái)源
| 層級(jí) | 常見(jiàn)現(xiàn)象 |
|---|---|
| PHP cURL | curl_exec() 返回 false |
| PHP 腳本 | 頁(yè)面執(zhí)行到一半終止 |
| Web 服務(wù)器 | 504 Gateway Timeout |
| 上游接口 | 偶爾成功,偶爾超時(shí) |
第一步永遠(yuǎn)是定位層級(jí)
二、PHP cURL 層:最常見(jiàn)的超時(shí)原因
1、CURLOPT_TIMEOUT 設(shè)置過(guò)小
很多人圖快,寫(xiě)成這樣:
curl_setopt($ch, CURLOPT_TIMEOUT, 2);
第三方接口稍微慢一點(diǎn):
直接超時(shí)
建議:
curl_setopt($ch, CURLOPT_TIMEOUT, 10); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
2、只設(shè)了 TIMEOUT,沒(méi)設(shè) CONNECTTIMEOUT
CONNECTTIMEOUT:連接階段TIMEOUT:整體請(qǐng)求
沒(méi)設(shè)連接超時(shí),DNS / TCP 卡住會(huì)一直等
3、DNS 解析慢(非常隱蔽)
表現(xiàn)為:
- IP 直連快
- 域名訪問(wèn)慢
排查方法:
ping api.example.com
或臨時(shí)用 IP 測(cè)試。
4、SSL 握手耗時(shí)過(guò)長(zhǎng)
HTTPS 接口在以下情況容易慢:
- 老系統(tǒng)
- 證書(shū)鏈過(guò)長(zhǎng)
- 沒(méi)開(kāi)啟 keep-alive
表現(xiàn)為 第一次請(qǐng)求特別慢
三、PHP 腳本本身被“掐死”
5、max_execution_time 不夠
max_execution_time = 30
接口 + 處理邏輯超過(guò)時(shí)間:
PHP 直接終止
臨時(shí)測(cè)試:
set_time_limit(0);
6、memory_limit 導(dǎo)致假性超時(shí)
內(nèi)存不足時(shí):
- 腳本卡住
- 沒(méi)明確報(bào)錯(cuò)
- 最終表現(xiàn)為超時(shí)
日志里通常有線(xiàn)索
四、Web 服務(wù)器層的超時(shí)(最容易被誤判)
7、Nginx fastcgi_read_timeout
fastcgi_read_timeout 60;
PHP-FPM 慢一點(diǎn):
Nginx 直接 504
8、PHP-FPM 進(jìn)程被耗盡
表現(xiàn):
- 偶發(fā)超時(shí)
- 高并發(fā)時(shí)必現(xiàn)
原因:
pm.max_children太小- 慢請(qǐng)求堆積
不是代碼問(wèn)題,是配置問(wèn)題
五、第三方接口自身問(wèn)題(但你要兜底)
9、接口限流 / 風(fēng)控導(dǎo)致“假超時(shí)”
很多第三方 API:
- 超限不返回錯(cuò)誤
- 直接拖到超時(shí)
極其常見(jiàn)
10、接口高峰期響應(yīng)變慢
表現(xiàn)為:
- 白天慢
- 晚上快
加重試 / 降級(jí)是唯一解法
六、網(wǎng)絡(luò)與服務(wù)器環(huán)境問(wèn)題(線(xiàn)上常見(jiàn))
11、防火墻 / 安全組攔截
云服務(wù)器常見(jiàn):
- 新端口被攔
- 出口流量被限制
本地 OK,服務(wù)器超時(shí)
12、PHP-FPM 與 Nginx 通信異常
Unix Socket / TCP 配置不當(dāng):
- 請(qǐng)求掛起
- 無(wú)明顯錯(cuò)誤
看 Nginx + PHP-FPM 日志
七、標(biāo)準(zhǔn)排查順序(非常重要)
當(dāng)你遇到 PHP 接口超時(shí)時(shí),按這個(gè)順序走:
- 打印
curl_error+curl_getinfo - 臨時(shí)放大 cURL timeout
- 單獨(dú)測(cè)試第三方接口
- 查看 PHP 錯(cuò)誤日志
- 查看 Nginx / Apache 日志
- 檢查 PHP-FPM 狀態(tài)
不要一上來(lái)就改服務(wù)器
八、一個(gè)“超時(shí)調(diào)試模板”(強(qiáng)烈建議你用)
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
$res = curl_exec($ch);
if ($res === false) {
echo curl_error($ch);
var_dump(curl_getinfo($ch));
exit;
}
至少讓你知道 卡在了哪一步
九、工程級(jí)解決方案(老項(xiàng)目必用)
超時(shí)兜底方案
- 設(shè)置合理超時(shí)
- 接口失敗走降級(jí)
- 不阻塞主流程
中轉(zhuǎn)服務(wù)解耦
前端 → 自己接口 → 隊(duì)列 / 異步 → 第三方 API
到此這篇關(guān)于PHP接口請(qǐng)求超時(shí)完整排查與解決方案的文章就介紹到這了,更多相關(guān)PHP接口請(qǐng)求超時(shí)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PHP Beanstalkd消息隊(duì)列的安裝與使用方法實(shí)例詳解
這篇文章主要介紹了PHP Beanstalkd消息隊(duì)列的安裝與使用方法,結(jié)合實(shí)例形式詳細(xì)分析了PHP Beanstalkd消息隊(duì)列的基本功能、原理、安裝、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2020-02-02
PHP實(shí)現(xiàn)將base64編碼字符串轉(zhuǎn)換成圖片示例
這篇文章主要介紹了PHP實(shí)現(xiàn)將base64編碼字符串轉(zhuǎn)換成圖片,涉及php編碼轉(zhuǎn)換、文件讀寫(xiě)等簡(jiǎn)單處理技巧,需要的朋友可以參考下2018-06-06
php基于session實(shí)現(xiàn)數(shù)據(jù)庫(kù)交互的類(lèi)實(shí)例
這篇文章主要介紹了php基于session實(shí)現(xiàn)數(shù)據(jù)庫(kù)交互的類(lèi),實(shí)例分析了php結(jié)合session操作數(shù)據(jù)庫(kù)的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08
php通過(guò)正則表達(dá)式記取數(shù)據(jù)來(lái)讀取xml的方法
這篇文章主要介紹了php通過(guò)正則表達(dá)式記取數(shù)據(jù)來(lái)讀取xml的方法,實(shí)例分析了php正則表達(dá)式的技巧及讀取XML文件的方法,需要的朋友可以參考下2015-03-03
PHP數(shù)據(jù)庫(kù)調(diào)用類(lèi)調(diào)用實(shí)例(詳細(xì)注釋)
PHP開(kāi)發(fā)中我們經(jīng)常需要用一些數(shù)據(jù)庫(kù)類(lèi),這里簡(jiǎn)單的分享下調(diào)用類(lèi)的代碼,學(xué)習(xí)php數(shù)據(jù)庫(kù)操作的朋友可以參考下2012-07-07
PHP取整數(shù)函數(shù)常用的四種方法小結(jié)
PHP取整數(shù)函數(shù)常用的四種方法,下面收集了四個(gè)函數(shù);經(jīng)常用到取整的函數(shù),今天小小的總結(jié)一下!其實(shí)很簡(jiǎn)單,就是幾個(gè)函數(shù)而已~~主要是:ceil,floor,round,intval2012-07-07
php連接mssql的一些相關(guān)經(jīng)驗(yàn)及注意事項(xiàng)
php連接mssql對(duì)于很多朋友或許已經(jīng)是老生長(zhǎng)談,習(xí)以為常了,不過(guò)本文還是要嘮叨一下,主要以分享連接數(shù)據(jù)庫(kù)的相關(guān)經(jīng)驗(yàn),感興趣的你可千萬(wàn)不要錯(cuò)過(guò),或許本文對(duì)你有所幫助呢2013-02-02

