22
33namespace staabm \PHPStanTodoBy \utils ;
44
5+ use CurlShareHandle ;
6+ use CurlSharePersistentHandle ;
57use RuntimeException ;
68
9+ use function function_exists ;
710use function is_string ;
811
912final class HttpClient
1013{
14+ /**
15+ * @var CurlShareHandle|CurlSharePersistentHandle|resource|null
16+ */
17+ private $ shareHandle ;
18+
1119 /**
1220 * @param non-empty-array<non-empty-string> $urls
1321 * @param list<string> $headers
@@ -16,15 +24,19 @@ final class HttpClient
1624 */
1725 public function getMulti (array $ urls , array $ headers ): array
1826 {
19- if (function_exists ('curl_share_init_persistent ' )) {
20- $ share = curl_share_init_persistent ([
21- CURL_LOCK_DATA_DNS ,
22- CURL_LOCK_DATA_CONNECT ,
23- ]);
24- } else {
25- $ share = curl_share_init ();
26- curl_share_setopt ($ share , CURLSHOPT_SHARE , CURL_LOCK_DATA_DNS );
27- curl_share_setopt ($ share , CURLSHOPT_SHARE , CURL_LOCK_DATA_CONNECT );
27+ if (null === $ this ->shareHandle ) {
28+ if (function_exists ('curl_share_init_persistent ' )) {
29+ $ this ->shareHandle = curl_share_init_persistent ([
30+ CURL_LOCK_DATA_DNS ,
31+ CURL_LOCK_DATA_CONNECT ,
32+ CURL_LOCK_DATA_SSL_SESSION ,
33+ ]);
34+ } else {
35+ $ this ->shareHandle = curl_share_init ();
36+ curl_share_setopt ($ this ->shareHandle , CURLSHOPT_SHARE , CURL_LOCK_DATA_DNS );
37+ curl_share_setopt ($ this ->shareHandle , CURLSHOPT_SHARE , CURL_LOCK_DATA_CONNECT );
38+ curl_share_setopt ($ this ->shareHandle , CURLSHOPT_SHARE , CURL_LOCK_DATA_SSL_SESSION );
39+ }
2840 }
2941
3042 $ mh = curl_multi_init ();
@@ -37,7 +49,7 @@ public function getMulti(array $urls, array $headers): array
3749 throw new RuntimeException ('Could not initialize cURL connection ' );
3850 }
3951
40- curl_setopt ($ curl , CURLOPT_SHARE , $ share );
52+ curl_setopt ($ curl , CURLOPT_SHARE , $ this -> shareHandle );
4153
4254 // see https://stackoverflow.com/a/27776164/1597388
4355 curl_setopt ($ curl , CURLOPT_CONNECTTIMEOUT , 3 );
0 commit comments