mirror of
https://github.com/php-curl-class/php-curl-class.git
synced 2026-08-30 04:01:47 +00:00
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")
This commit is contained in:
+3
-36
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user