Skip to content

Commit 8129ccd

Browse files
committed
[HttpClient] Fix Failed to open stream: Too many open files
1 parent 848a70d commit 8129ccd

File tree

1 file changed

+13
-4
lines changed

1 file changed

+13
-4
lines changed

Internal/CurlClientState.php

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@
2323
*/
2424
final class CurlClientState extends ClientState
2525
{
26-
/** @var \CurlMultiHandle|resource */
26+
/** @var \CurlMultiHandle|resource|null */
2727
public $handle;
28-
/** @var \CurlShareHandle|resource */
28+
/** @var \CurlShareHandle|resource|null */
2929
public $share;
3030
/** @var PushedResponse[] */
3131
public $pushedResponses = [];
@@ -65,8 +65,17 @@ public function __construct(int $maxHostConnections, int $maxPendingPushes)
6565
return;
6666
}
6767

68-
curl_multi_setopt($this->handle, \CURLMOPT_PUSHFUNCTION, function ($parent, $pushed, array $requestHeaders) use ($maxPendingPushes) {
69-
return $this->handlePush($parent, $pushed, $requestHeaders, $maxPendingPushes);
68+
// Clone to prevent a circular reference
69+
$multi = clone $this;
70+
$multi->handle = null;
71+
$multi->share = null;
72+
$multi->pushedResponses = &$this->pushedResponses;
73+
$multi->logger = &$this->logger;
74+
$multi->handlesActivity = &$this->handlesActivity;
75+
$multi->openHandles = &$this->openHandles;
76+
77+
curl_multi_setopt($this->handle, \CURLMOPT_PUSHFUNCTION, static function ($parent, $pushed, array $requestHeaders) use ($multi, $maxPendingPushes) {
78+
return $multi->handlePush($parent, $pushed, $requestHeaders, $maxPendingPushes);
7079
});
7180
}
7281

0 commit comments

Comments
 (0)