Skip to content

Commit 3c2b7f7

Browse files
authored
Fix curl-share handling on PHP < 8.5 (#173)
1 parent fcf461f commit 3c2b7f7

File tree

2 files changed

+31
-10
lines changed

2 files changed

+31
-10
lines changed

phpstan.neon

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,12 @@ parameters:
1313

1414
excludePaths:
1515
- tests/data/*
16+
17+
ignoreErrors:
18+
-
19+
message: "#CurlShareHandle#"
20+
path: src/utils/HttpClient.php
21+
22+
-
23+
message: "#CurlSharePersistentHandle#"
24+
path: src/utils/HttpClient.php

src/utils/HttpClient.php

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,20 @@
22

33
namespace staabm\PHPStanTodoBy\utils;
44

5+
use CurlShareHandle;
6+
use CurlSharePersistentHandle;
57
use RuntimeException;
68

9+
use function function_exists;
710
use function is_string;
811

912
final 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

Comments
 (0)