1. 程式人生 > >php突然報api.weixin.qq.com無法解析的問題

php突然報api.weixin.qq.com無法解析的問題

下午公司人員反饋彬彬大學APP微信登入有問題,經查詢發現APP微信登入介面第一步,即通過code換取網頁授權access_token

   $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid={$appid}&secret={$appSecret}&code={$code}&grant_type=authorization_code";

正常的請求以上URL後會返回類似下面的JSON串:

{"access_token":"11_6pfOAP3ZbUHLtbbaYawPkAGQaIdNSDbi3VrH4LowE0yMdPUxSA8pkb9CFSV7363pkMstEHfX5_KILRCRgORvXBI9Oy2aYC1na8LVs0bm7aE","expires_in":7200,"refresh_token":"11_Bjk3g8fszAuzxm64xK25oeFvLlLnjboaANvbcy_q-ZWXWra6AX5fbsy6asVpN7jSzEE7ZntGjRVkDQEU3giPsFXzGLlO4snr6RhLImPfcSY","openid":"ou6Y61vM0kktC48RLjXGnS1QhjQM","scope":"snsapi_userinfo","unionid":"oHijVvnI0k8iZuZQoKdqJ6xIqvMw"}

但突然用php curl方法請求時報couldn't resolve host api.weixin.qq.com,且確認服務端PHP程式碼未做任何改動,只是yum update了一下,暫不確認是否與此有關。伺服器環境為centos7(為阿里雲ECS伺服器),php版本號為php7.1.7。

php的curl的方法為,且該方法從上線後一直沒改動過:

protected function _httpGetRequest($url)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL,$url);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, 3); // 設定超時限制防止死迴圈
        $result  = curl_exec($ch);
        if (curl_errno($ch)) {
        curl_close($ch);
        return false;
        }
        curl_close($ch);
        return $result;
    }
在伺服器上ping api.weixin.qq.com也能ping通,用nslookup及dig命令也都正常,截圖如下:

在shell下直接用curl請求$url也能返回結果:


最後懷疑是不是伺服器centos防火牆問題,shell下查詢了下是否開啟了防火牆,查詢後未開啟,排除伺服器centos防火牆所導致的問題。

最後把curl方法換成file_get_contents方法請求該URL,報以下:

PHP message: PHP Warning:  file_get_contents(): php_network_getaddresses: getaddrinfo failed: Name or service not known

錯誤資訊。

其實還是api.weixin.qq.com不能解析。

嘗試平滑重啟nginx服務,還是不行。

插曲:中間想到公司另一臺阿里雲ECS伺服器上部署的有彬彬幫APP的服務,且也有微信APP登入,同樣也用yum update更新了下,但彬彬幫的微信APP登入沒問題,且微信登入與彬彬大學所用的程式碼和方法均一樣。

最後實在沒辦法通過 kill -USR2命令平滑重啟下PHP服務,然後再試竟然好了!再嘗試用PHP的curl方法或file_get_contents方法請求$url試竟然都好了。。。。

工作這麼久第一次碰到此類問題,初步懷疑api.weixin.qq.com的DNS解析微信那邊有變動,但PHP快取中對應的DNS解析還是舊的,平滑重啟PHP服務後更新了DNS快取至最新,只是初步懷疑是這樣,但不敢確認確實是這樣。誰碰到過此類問題?求教其原理