最近在做一個php小項目的時候,發現curl調用微信的授權api.weixin.qq.com,經常是需要等待很久,但是有時候卻很快。
剛開始以為是網絡慢問題,沒去注意。后面通過打上時間日志觀察發現,慢的時候基本是在5秒。既然那么有規律了,那肯定是有某個問題的。
http請求的初始過程是什么呢?dns解析。
通過ping和wget命令,發現確實在域名解析的那個過程很慢。所以,最終在host直接寫死域名,解決了這個問題。
(
我也是,呵呵,省事,后期可以考慮安裝dns緩存服務
vim /etc/hosts 增加2行(微信支付好像用到的就是這個2個域名,前面的ip,請以你服務器上ping出來的為准)
140.207.135.108 api.weixin.qq.com
140.207.69.101 api.mch.weixin.qq.com
)
為什么是5秒(的確是5s,郁悶)呢?
我們知道配置dns服務的地址在/etc/resolv.conf。
通過man resolv.conf可以找到
timeout:n
sets the amount of time the resolver will wait for
a response from a remote name server before retry-
ing the query via a different name server. Mea-
sured in seconds, the default is RES_TIMEOUT (see
<resolv.h> ).
查看/usr/include/resolv.h 可以找到這行代碼 # define RES_TIMEOUT 5 /* min. seconds between retries */
問題是解決了,但是卻引申出了很多知識點。
dns的解析默認超時時間是5秒
網上說,有可能是開啟了ipv6卻沒有給這個域名分配ipv6的地址,通過查看vim /etc/modprobe.conf,發現沒有開啟ipv6功能。
查看域名的解析過程有dig命令