From 4b36f455dd7c22cae654519eefe03410ef70fb8b Mon Sep 17 00:00:00 2001 From: Zach Borboa Date: Thu, 20 Nov 2025 23:39:03 -0500 Subject: [PATCH] Simplify MultiCurl execution loop (#1017) * Clean up * Simplify MultiCurl execution loop - Removes legacy workarounds - Deprecates MultiCurl::setRequestTimeAccuracy() - Removes use of CURLM_CALL_MULTI_PERFORM ("As of cURL 7.20.0, this constant is not used") --- src/Curl/MultiCurl.php | 39 ++------------------ tests/PHPCurlClass/PHPMultiCurlClassTest.php | 15 -------- tests/PHPCurlClass/TimeUtilTest.php | 6 +-- 3 files changed, 5 insertions(+), 55 deletions(-) diff --git a/src/Curl/MultiCurl.php b/src/Curl/MultiCurl.php index 6595b71..a610021 100644 --- a/src/Curl/MultiCurl.php +++ b/src/Curl/MultiCurl.php @@ -19,7 +19,6 @@ class MultiCurl extends BaseCurl private $currentRequestCount = 0; private $concurrency = 25; private $nextCurlId = 0; - private $preferRequestTimeAccuracy = false; private $rateLimit = null; private $rateLimitEnabled = false; @@ -678,40 +677,7 @@ class MultiCurl extends BaseCurl $this->waitUntilRequestQuotaAvailable(); } - if ($this->preferRequestTimeAccuracy) { - // Wait for activity on any curl_multi connection when curl_multi_select (libcurl) fails to correctly - // block. - // https://bugs.php.net/bug.php?id=63411 - // - // Also, use a shorter curl_multi_select() timeout instead the default of one second. This allows - // pending requests to have more accurate start times. Without a shorter timeout, it can be nearly a - // full second before available request quota is rechecked and pending requests can be initialized. - if (curl_multi_select($this->multiCurl, 0.2) === -1) { - usleep(100_000); - } - - curl_multi_exec($this->multiCurl, $active); - } else { - // Use multiple loops to get data off of the multi handler. Without this, the following error may appear - // intermittently on certain versions of PHP: - // curl_multi_exec(): supplied resource is not a valid cURL handle resource - - // Clear out the curl buffer. - do { - $status = curl_multi_exec($this->multiCurl, $active); - } while ($status === CURLM_CALL_MULTI_PERFORM); - - // Wait for more information and then get that information. - while ($active && $status === CURLM_OK) { - // Check if the network socket has some data. - if (curl_multi_select($this->multiCurl) !== -1) { - // Process the data for as long as the system tells us to keep getting it. - do { - $status = curl_multi_exec($this->multiCurl, $active); - } while ($status === CURLM_CALL_MULTI_PERFORM); - } - } - } + curl_multi_exec($this->multiCurl, $active); while ( (is_resource($this->multiCurl) || $this->multiCurl instanceof \CurlMultiHandle) && @@ -801,10 +767,11 @@ class MultiCurl extends BaseCurl /** * Set request time accuracy + * + * @deprecated This method is deprecated and no longer has any effect. */ public function setRequestTimeAccuracy() { - $this->preferRequestTimeAccuracy = true; } /** diff --git a/tests/PHPCurlClass/PHPMultiCurlClassTest.php b/tests/PHPCurlClass/PHPMultiCurlClassTest.php index 088e283..9b8b572 100644 --- a/tests/PHPCurlClass/PHPMultiCurlClassTest.php +++ b/tests/PHPCurlClass/PHPMultiCurlClassTest.php @@ -5055,7 +5055,6 @@ class PHPMultiCurlClassTest extends \PHPUnit\Framework\TestCase $request_stats = []; $multi_curl = new MultiCurl(); - $multi_curl->setRequestTimeAccuracy(); $multi_curl->setHeader('X-DEBUG-TEST', 'timeout'); $multi_curl->setRateLimit('2/5s'); $multi_curl->beforeSend(function ($instance) use (&$request_stats) { @@ -5129,7 +5128,6 @@ class PHPMultiCurlClassTest extends \PHPUnit\Framework\TestCase $request_stats = []; $multi_curl = new MultiCurl(); - $multi_curl->setRequestTimeAccuracy(); $multi_curl->setHeader('X-DEBUG-TEST', 'timeout'); $multi_curl->setRateLimit('2/5s'); $multi_curl->beforeSend(function ($instance) use (&$request_stats) { @@ -5201,7 +5199,6 @@ class PHPMultiCurlClassTest extends \PHPUnit\Framework\TestCase $request_stats = []; $multi_curl = new MultiCurl(); - $multi_curl->setRequestTimeAccuracy(); $multi_curl->setHeader('X-DEBUG-TEST', 'timeout'); $multi_curl->setRateLimit('2/5s'); $multi_curl->beforeSend(function ($instance) use (&$request_stats) { @@ -5273,7 +5270,6 @@ class PHPMultiCurlClassTest extends \PHPUnit\Framework\TestCase $request_stats = []; $multi_curl = new MultiCurl(); - $multi_curl->setRequestTimeAccuracy(); $multi_curl->setHeader('X-DEBUG-TEST', 'timeout'); $multi_curl->setRateLimit('2/5s'); $multi_curl->beforeSend(function ($instance) use (&$request_stats) { @@ -5346,7 +5342,6 @@ class PHPMultiCurlClassTest extends \PHPUnit\Framework\TestCase $request_stats = []; $multi_curl = new MultiCurl(); - $multi_curl->setRequestTimeAccuracy(); $multi_curl->setHeader('X-DEBUG-TEST', 'timeout'); $multi_curl->setRateLimit('2/5s'); $multi_curl->beforeSend(function ($instance) use (&$request_stats) { @@ -5419,7 +5414,6 @@ class PHPMultiCurlClassTest extends \PHPUnit\Framework\TestCase $request_stats = []; $multi_curl = new MultiCurl(); - $multi_curl->setRequestTimeAccuracy(); $multi_curl->setHeader('X-DEBUG-TEST', 'timeout'); $multi_curl->setRateLimit('2/5s'); $multi_curl->beforeSend(function ($instance) use (&$request_stats) { @@ -5492,7 +5486,6 @@ class PHPMultiCurlClassTest extends \PHPUnit\Framework\TestCase $request_stats = []; $multi_curl = new MultiCurl(); - $multi_curl->setRequestTimeAccuracy(); $multi_curl->setHeader('X-DEBUG-TEST', 'timeout'); $multi_curl->setRateLimit('2/5s'); $multi_curl->beforeSend(function ($instance) use (&$request_stats) { @@ -5573,7 +5566,6 @@ class PHPMultiCurlClassTest extends \PHPUnit\Framework\TestCase $request_stats = []; $multi_curl = new MultiCurl(); - $multi_curl->setRequestTimeAccuracy(); $multi_curl->setHeader('X-DEBUG-TEST', 'timeout'); $multi_curl->setRateLimit('2/5s'); $multi_curl->beforeSend(function ($instance) use (&$request_stats) { @@ -5654,7 +5646,6 @@ class PHPMultiCurlClassTest extends \PHPUnit\Framework\TestCase $request_stats = []; $multi_curl = new MultiCurl(); - $multi_curl->setRequestTimeAccuracy(); $multi_curl->setHeader('X-DEBUG-TEST', 'timeout'); $multi_curl->setRateLimit('2/5s'); $multi_curl->beforeSend(function ($instance) use (&$request_stats) { @@ -5727,7 +5718,6 @@ class PHPMultiCurlClassTest extends \PHPUnit\Framework\TestCase $request_stats = []; $multi_curl = new MultiCurl(); - $multi_curl->setRequestTimeAccuracy(); $multi_curl->setRateLimit('1/1s'); $multi_curl->beforeSend(function ($instance) use (&$request_stats) { $request_stats[$instance->id] = []; @@ -5766,7 +5756,6 @@ class PHPMultiCurlClassTest extends \PHPUnit\Framework\TestCase $request_stats = []; $multi_curl = new MultiCurl(); - $multi_curl->setRequestTimeAccuracy(); $multi_curl->setHeader('X-DEBUG-TEST', 'timeout'); $multi_curl->setRateLimit('5/30s'); $multi_curl->beforeSend(function ($instance) use (&$request_stats) { @@ -5801,7 +5790,6 @@ class PHPMultiCurlClassTest extends \PHPUnit\Framework\TestCase $request_stats = []; $multi_curl = new MultiCurl(); - $multi_curl->setRequestTimeAccuracy(); $multi_curl->setHeader('X-DEBUG-TEST', 'timeout'); $multi_curl->setRateLimit('1/1m'); $multi_curl->beforeSend(function ($instance) use (&$request_stats) { @@ -5836,7 +5824,6 @@ class PHPMultiCurlClassTest extends \PHPUnit\Framework\TestCase $request_stats = []; $multi_curl = new MultiCurl(); - $multi_curl->setRequestTimeAccuracy(); $multi_curl->setHeader('X-DEBUG-TEST', 'timeout'); $multi_curl->setRateLimit('3/1m'); $multi_curl->beforeSend(function ($instance) use (&$request_stats) { @@ -5869,7 +5856,6 @@ class PHPMultiCurlClassTest extends \PHPUnit\Framework\TestCase $request_stats = []; $multi_curl = new MultiCurl(); - $multi_curl->setRequestTimeAccuracy(); $multi_curl->setHeader('X-DEBUG-TEST', 'timeout'); $multi_curl->setRateLimit('3/65s'); $multi_curl->beforeSend(function ($instance) use (&$request_stats) { @@ -5902,7 +5888,6 @@ class PHPMultiCurlClassTest extends \PHPUnit\Framework\TestCase $request_stats = []; $multi_curl = new MultiCurl(); - $multi_curl->setRequestTimeAccuracy(); $multi_curl->setHeader('X-DEBUG-TEST', 'timeout'); $multi_curl->setRateLimit('10/2m'); $multi_curl->beforeSend(function ($instance) use (&$request_stats) { diff --git a/tests/PHPCurlClass/TimeUtilTest.php b/tests/PHPCurlClass/TimeUtilTest.php index a6ac1fb..7bbc05f 100644 --- a/tests/PHPCurlClass/TimeUtilTest.php +++ b/tests/PHPCurlClass/TimeUtilTest.php @@ -14,10 +14,6 @@ class TimeUtilTest extends \PHPUnit\Framework\TestCase // [...]ime = microtime(true); $start_time = (float)1_750_000_000.123456; - // Use a fixed current time that occurs after the start time. - // [...]_microtime = (float)1_750_000_045.000001; - $current_microtime = (float)1_750_000_044.999999; - $interval_seconds = 60; $sleep_until_microtime = TimeUtil::getSleepUntilMicrotime( $start_time, @@ -33,6 +29,8 @@ class TimeUtilTest extends \PHPUnit\Framework\TestCase public function testGetSleepSecondsUntilMicrotime() { $sleep_until_microtime = (float)1_750_000_060.123456; + + // Use a fixed current time that occurs after the start time. $current_microtime = (float)1_750_000_044.999999; $sleep_seconds = TimeUtil::getSleepSecondsUntilMicrotime(