From ea978f34859e9ae7ff89512d11f8cebea99d2f3d Mon Sep 17 00:00:00 2001 From: Lance Pioch Date: Sat, 7 Feb 2026 23:17:12 -0500 Subject: [PATCH] Reuse GuzzleClient with timeouts for presigned S3 requests --- app/Extensions/Filesystem/S3Filesystem.php | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/app/Extensions/Filesystem/S3Filesystem.php b/app/Extensions/Filesystem/S3Filesystem.php index 2a3b61a39..daf037e9f 100644 --- a/app/Extensions/Filesystem/S3Filesystem.php +++ b/app/Extensions/Filesystem/S3Filesystem.php @@ -12,6 +12,8 @@ use SimpleXMLElement; class S3Filesystem extends AwsS3V3Adapter { + private ?GuzzleClient $guzzle = null; + /** * @param array $options */ @@ -31,6 +33,18 @@ class S3Filesystem extends AwsS3V3Adapter ); } + private function getGuzzleClient(): GuzzleClient + { + if ($this->guzzle === null) { + $this->guzzle = new GuzzleClient([ + 'timeout' => 30, + 'connect_timeout' => 10, + ]); + } + + return $this->guzzle; + } + public function getClient(): S3ClientInterface { return $this->client; @@ -51,8 +65,7 @@ class S3Filesystem extends AwsS3V3Adapter { $presignedRequest = $this->client->createPresignedRequest($command, '+60 minutes'); - $guzzle = new GuzzleClient(); - $response = $guzzle->send($presignedRequest); + $response = $this->getGuzzleClient()->send($presignedRequest); $body = (string) $response->getBody(); $commandName = $command->getName();