花了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上也解決了。
總結遇到問題解決方向:
- 嘗試print exception / error 看線索
- 嘗試記錄log / 看log找線索
- 嘗試重現問題發生規律
- 嘗試釐清問題因由, 重點
(Code 的問題? Setting 的問題? Network 的問題? Server 的問題? 例如版本問題? ) - 從重點列出關鍵字, 再Google找解決方案
- 重複以上步驟, 直至問題解決
沒有留言:
張貼留言