2020年9月3日 星期四

[Debug 進程] Could not connect to host

 花了2天時間fix一個issue

事源是datasheet bulk verify job (利用SoapClient->doRequest webservice處理多條工序)大於1000條的話, 約到第800條左右就會出現"Could not connect to host" exception。


起初以為是對方Server限制了到達指定數量的工序時就會block了(eBay VerifyAddItem Document: https://developer.ebay.com/DevZone/XML/docs/Reference/eBay/VerifyAddItem.html)

但看上文是會返回errorCode 21919144的內容, 在var_dump exception 時卻找不到這個error code, 只是說SoapClient->doRequest 出現問題。

這個問題處理得很困難, 源於exception只有"Could not connect to host"這一句, 而每次測試這1000條bulk job都要花上我2個小時……


奇怪的是大約跑了800條左右(2小時花掉), 它會不斷很快地返回"Could not connect to host"這一句, 所以不像是對方server的返回資訊, 而更像是內部的error返回。

再看會發現soapClient本身也返回"Could not connect to host" error。網上找有可能是cache問題, timeout問題, 可是都沒有方向如何處理。

https://stackoverflow.com/questions/4318870/soapfault-exception-could-not-connect-to-host

我們的問題是起初可以"Connect to host", 直到800條才不行, 而不是一開始就不行了, 所以有很多Google results 也似乎不像我們的情況……

及後繼續Google和看Log, 事情的確只發生於soapClient->__doRequest 會出現exception……

之後找來了:
https://stackoverflow.com/questions/43947872/soapclient-error-could-not-connect-to-host-on-php-7-0-and-laravel

發現有機會是php version的問題, 原來問題在php 5.6 上不會發生, php 7.2 上就會出現。這是個重大發現! 測試又多花了2個小時……

判斷了是php version 問題後, 再經上司幫了一下忙找到:

https://stackoverflow.com/questions/40884866/could-not-connect-to-host-soapfault-exception-after-some-requests/40927519#40927519

這個情況跟我們的很像, 因為它像我們的一樣, 直到第500-1000條calls 時就會出現"Could not connect to host" , 而我們還是可以成功連去對方server的。

結果原來是因為我們開了太多connections所引起的, 依據答案加入'keep_alive' => false, 把用完的connections關掉, 再花2個小時run一次, 1000條運行成功, 問題在php 7.2上也解決了。




總結遇到問題解決方向:

  1. 嘗試print exception / error 看線索
  2. 嘗試記錄log / 看log找線索
  3. 嘗試重現問題發生規律
  4. 嘗試釐清問題因由, 重點
    (Code 的問題? Setting 的問題? Network 的問題? Server 的問題? 例如版本問題? )
  5. 從重點列出關鍵字, 再Google找解決方案
  6. 重複以上步驟, 直至問題解決

沒有留言:

張貼留言

[康復路] 試完又試

見了醫生,因為血色素又變低了,醫生想檢查是否「缺鐵」為成因,檢查又檢查…… 感覺有些麻煩……又抽血,又要留樣本…… 令我回想起當日入院的時光,因為一些原因,留樣本只需留一次,免卻留三次的麻煩;現在每天都要留一次,連續三天。每天早上就要跑醫院一趟再上班。 幸好也完成了。 第二次抽血...