@@ -35,30 +35,13 @@ class ClientHTTP
3535 public static function sendHttpPostRequest (string $ url , array $ params , array $ headers =[]):PBXAmoResult {
3636 $ client = new GuzzleHttp \Client ();
3737 $ options = [
38- 'timeout ' => 5 ,
39- 'http_errors ' => false ,
40- 'headers ' => $ headers ,
41- 'json ' => $ params ,
38+ 'timeout ' => 15 ,
39+ 'connect_timeout ' => 5 ,
40+ 'http_errors ' => false ,
41+ 'headers ' => $ headers ,
42+ 'json ' => $ params ,
4243 ];
43- $ message = '' ;
44- $ resultHttp = null ;
45- try {
46- $ resultHttp = $ client ->request ('POST ' , $ url , $ options );
47- $ code = $ resultHttp ->getStatusCode ();
48- }catch (GuzzleHttp \Exception \ConnectException $ e ){
49- $ message = $ e ->getMessage ();
50-
51- $ errorMessage = "Error: " . $ e ->getMessage () . ', ' ;
52- $ errorMessage .= "Request URL: " . $ e ->getRequest ()->getUri () . ', ' ;
53- $ errorMessage .= "Request Method: " . $ e ->getRequest ()->getMethod () . ', ' ;
54- Util::sysLogMsg ('ModuleAmoCrm ' , "ConnectException: " .$ errorMessage );
55- $ code = 0 ;
56- } catch (GuzzleException $ e ) {
57- $ message = $ e ->getMessage ();
58- Util::sysLogMsg ('ModuleAmoCrm ' , "GuzzleException " );
59- $ code = 0 ;
60- }
61- return self ::parseResponse ($ resultHttp , $ message , $ code );
44+ return self ::executeWithRetry ($ client , 'POST ' , $ url , $ options );
6245 }
6346
6447 /**
@@ -71,29 +54,13 @@ public static function sendHttpPostRequest(string $url, array $params, array $he
7154 public static function sendHttpPatchRequest (string $ url , array $ params , array $ headers =[]):PBXAmoResult {
7255 $ client = new GuzzleHttp \Client ();
7356 $ options = [
74- 'timeout ' => 5 ,
75- 'http_errors ' => false ,
76- 'headers ' => $ headers ,
77- 'json ' => $ params ,
57+ 'timeout ' => 15 ,
58+ 'connect_timeout ' => 5 ,
59+ 'http_errors ' => false ,
60+ 'headers ' => $ headers ,
61+ 'json ' => $ params ,
7862 ];
79- $ message = '' ;
80- $ resultHttp = null ;
81- try {
82- $ resultHttp = $ client ->request ('PATCH ' , $ url , $ options );
83- $ code = $ resultHttp ->getStatusCode ();
84- }catch (GuzzleHttp \Exception \ConnectException $ e ){
85- $ message = $ e ->getMessage ();
86- $ errorMessage = "Error: " . $ e ->getMessage () . ', ' ;
87- $ errorMessage .= "Request URL: " . $ e ->getRequest ()->getUri () . ', ' ;
88- $ errorMessage .= "Request Method: " . $ e ->getRequest ()->getMethod () . ', ' ;
89- Util::sysLogMsg ('ModuleAmoCrm ' , "ConnectException: " .$ errorMessage );
90- $ code = 0 ;
91- } catch (GuzzleException $ e ) {
92- $ message = $ e ->getMessage ();
93- Util::sysLogMsg ('ModuleAmoCrm ' , "GuzzleException " );
94- $ code = 0 ;
95- }
96- return self ::parseResponse ($ resultHttp , $ message , $ code );
63+ return self ::executeWithRetry ($ client , 'PATCH ' , $ url , $ options );
9764 }
9865
9966 /**
@@ -109,26 +76,52 @@ public static function sendHttpGetRequest(string $url, array $params, array $hea
10976 }
11077 $ client = new GuzzleHttp \Client ();
11178 $ options = [
112- 'timeout ' => 8 ,
113- 'http_errors ' => false ,
114- 'headers ' => $ headers ,
79+ 'timeout ' => 15 ,
80+ 'connect_timeout ' => 5 ,
81+ 'http_errors ' => false ,
82+ 'headers ' => $ headers ,
11583 ];
116- $ message = '' ;
84+ return self ::executeWithRetry ($ client , 'GET ' , $ url , $ options );
85+ }
86+
87+ /**
88+ * Выполнение HTTP-запроса с retry при ConnectException (таймауты, сетевые ошибки).
89+ * До 3 попыток с линейным backoff (2, 4, 6 сек).
90+ * @param GuzzleHttp\Client $client
91+ * @param string $method
92+ * @param string $url
93+ * @param array $options
94+ * @return PBXAmoResult
95+ */
96+ private static function executeWithRetry (GuzzleHttp \Client $ client , string $ method , string $ url , array $ options ):PBXAmoResult
97+ {
98+ $ maxRetries = 3 ;
99+ $ retryDelay = 2 ;
100+ $ message = '' ;
117101 $ resultHttp = null ;
118- try {
119- $ resultHttp = $ client ->request ('GET ' , $ url , $ options );
120- $ code = $ resultHttp ->getStatusCode ();
121- }catch (GuzzleHttp \Exception \ConnectException $ e ){
122- $ message = $ e ->getMessage ();
123- $ errorMessage = "Error: " . $ e ->getMessage () . ', ' ;
124- $ errorMessage .= "Request URL: " . $ e ->getRequest ()->getUri () . ', ' ;
125- $ errorMessage .= "Request Method: " . $ e ->getRequest ()->getMethod () . ', ' ;
126- Util::sysLogMsg ('ModuleAmoCrm ' , "ConnectException: " .$ errorMessage );
127- $ code = 0 ;
128- } catch (GuzzleException $ e ) {
129- $ message = $ e ->getMessage ();
130- Util::sysLogMsg ('ModuleAmoCrm ' , "GuzzleException " );
131- $ code = 0 ;
102+ $ code = 0 ;
103+ for ($ attempt = 1 ; $ attempt <= $ maxRetries ; $ attempt ++) {
104+ try {
105+ $ resultHttp = $ client ->request ($ method , $ url , $ options );
106+ $ code = $ resultHttp ->getStatusCode ();
107+ break ;
108+ } catch (GuzzleHttp \Exception \ConnectException $ e ) {
109+ $ message = $ e ->getMessage ();
110+ $ errorMessage = "Error: " . $ e ->getMessage () . ', ' ;
111+ $ errorMessage .= "Request URL: " . $ e ->getRequest ()->getUri () . ', ' ;
112+ $ errorMessage .= "Request Method: " . $ e ->getRequest ()->getMethod () . ', ' ;
113+ $ errorMessage .= "Attempt: $ attempt/ $ maxRetries " ;
114+ Util::sysLogMsg ('ModuleAmoCrm ' , "ConnectException: " . $ errorMessage );
115+ if ($ attempt < $ maxRetries ) {
116+ sleep ($ retryDelay * $ attempt );
117+ }
118+ $ code = 0 ;
119+ } catch (GuzzleException $ e ) {
120+ $ message = $ e ->getMessage ();
121+ Util::sysLogMsg ('ModuleAmoCrm ' , "GuzzleException: " . $ message );
122+ $ code = 0 ;
123+ break ;
124+ }
132125 }
133126 return self ::parseResponse ($ resultHttp , $ message , $ code );
134127 }
0 commit comments