From 89496808f06f91ac6da172eafc90c152804a3d20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emre=20=C3=87al=C4=B1=C5=9Fkan?= Date: Mon, 30 Jun 2025 22:13:52 +0300 Subject: [PATCH 01/13] added CURLINFO_CONN_ID --- UPGRADING | 6 +++ ext/curl/curl.stub.php | 7 ++++ ext/curl/curl_arginfo.h | 5 ++- ext/curl/interface.c | 5 +++ .../tests/curl_getinfo_CURLINFO_CONN_ID.phpt | 39 +++++++++++++++++++ 5 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt diff --git a/UPGRADING b/UPGRADING index 5491d85f529d8..476021712c28c 100644 --- a/UPGRADING +++ b/UPGRADING @@ -182,6 +182,11 @@ PHP 8.5 UPGRADE NOTES first redirect thus if there is any follow up redirect, it won't go any further. CURLFOLLOW_ALL is equivalent to setting CURLOPT_FOLLOWLOCATION to true. + . Added support for CURLINFO_CONN_ID (libcurl >= 8.2.0) to the curl_getinfo() + function. This constant allows retrieving the unique ID of the connection + used by a cURL transfer. It is primarily useful when connection reuse or + connection pooling logic is needed in PHP-level applications. When + curl_getinfo() returns an array, this value is available as the "conn_id" key. - DOM: . Added Dom\Element::$outerHTML. @@ -483,6 +488,7 @@ PHP 8.5 UPGRADE NOTES . CURLINFO_USED_PROXY. . CURLINFO_HTTPAUTH_USED. . CURLINFO_PROXYAUTH_USED. + . CURLINFO_CONN_ID. . CURLOPT_INFILESIZE_LARGE. . CURLFOLLOW_ALL. . CURLFOLLOW_OBEYCODE. diff --git a/ext/curl/curl.stub.php b/ext/curl/curl.stub.php index 00532f45793f5..5dac22ae7952c 100644 --- a/ext/curl/curl.stub.php +++ b/ext/curl/curl.stub.php @@ -3103,6 +3103,13 @@ */ const CURLINFO_POSTTRANSFER_TIME_T = UNKNOWN; #endif +#if LIBCURL_VERSION_NUM >= 0x080200 /* Available since 8.2.0 */ +/** + * @var int + * @cvalue CURLINFO_CONN_ID + */ +const CURLINFO_CONN_ID = UNKNOWN; +#endif /** * @var int * @cvalue CURLOPT_DISALLOW_USERNAME_IN_URL diff --git a/ext/curl/curl_arginfo.h b/ext/curl/curl_arginfo.h index cff18b2916859..bda4806d8ca05 100644 --- a/ext/curl/curl_arginfo.h +++ b/ext/curl/curl_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: c087ac501d0abe14ed87968023d837f358e6fee8 */ + * Stub hash: 533884c442ca1146a61c0824a4f8c9628c31aae3 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_close, 0, 1, IS_VOID, 0) ZEND_ARG_OBJ_INFO(0, handle, CurlHandle, 0) @@ -824,6 +824,9 @@ static void register_curl_symbols(int module_number) #endif #if LIBCURL_VERSION_NUM >= 0x080a00 /* Available since 8.10.0 */ REGISTER_LONG_CONSTANT("CURLINFO_POSTTRANSFER_TIME_T", CURLINFO_POSTTRANSFER_TIME_T, CONST_PERSISTENT); +#endif +#if LIBCURL_VERSION_NUM >= 0x080200 /* Available since 8.2.0 */ + REGISTER_LONG_CONSTANT("CURLINFO_CONN_ID", CURLINFO_CONN_ID, CONST_PERSISTENT); #endif REGISTER_LONG_CONSTANT("CURLOPT_DISALLOW_USERNAME_IN_URL", CURLOPT_DISALLOW_USERNAME_IN_URL, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("CURLOPT_PROXY_TLS13_CIPHERS", CURLOPT_PROXY_TLS13_CIPHERS, CONST_PERSISTENT); diff --git a/ext/curl/interface.c b/ext/curl/interface.c index 3470ad2f72327..956a70f3d7cfb 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -2659,6 +2659,11 @@ PHP_FUNCTION(curl_getinfo) if (curl_easy_getinfo(ch->cp, CURLINFO_POSTTRANSFER_TIME_T, &co) == CURLE_OK) { CAAL("posttransfer_time_us", co); } +#endif +#if LIBCURL_VERSION_NUM >= 0x080200 /* Available since 8.2.0 */ + if (curl_easy_getinfo(ch->cp, CURLINFO_CONN_ID , &co) == CURLE_OK) { + CAAL("conn_id", co); + } #endif if (curl_easy_getinfo(ch->cp, CURLINFO_TOTAL_TIME_T, &co) == CURLE_OK) { CAAL("total_time_us", co); diff --git a/ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt b/ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt new file mode 100644 index 0000000000000..43c0df5cb7ea7 --- /dev/null +++ b/ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt @@ -0,0 +1,39 @@ +--TEST-- +Curlinfo CURLINFO_CONN_ID +--EXTENSIONS-- +curl +--SKIPIF-- += 8.2.0"); +?> +--FILE-- + 0); + +?> +--EXPECT-- +bool(false) +bool(true) +bool(true) +bool(true) +bool(true) + From 045953d9882738d855bad1fa7d405872aea1c3cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emre=20=C3=87al=C4=B1=C5=9Fkan?= Date: Mon, 30 Jun 2025 22:36:08 +0300 Subject: [PATCH 02/13] added CURLINFO_CONN_ID --- ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt b/ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt index 43c0df5cb7ea7..bfcf78ab3d933 100644 --- a/ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt +++ b/ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt @@ -20,18 +20,20 @@ curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $info = curl_getinfo($ch); var_dump(isset($info['conn_id'])); +var_dump($info['posttransfer_time_us'] === -1); $result = curl_exec($ch); $info = curl_getinfo($ch); var_dump(isset($info['conn_id'])); var_dump(is_int($info['conn_id'])); -var_dump(curl_getinfo($ch, CURLINFO_CONN_ID) === $info['CURLINFO_CONN_ID']); -var_dump(curl_getinfo($ch, CURLINFO_CONN_ID) > 0); +var_dump(curl_getinfo($ch, CURLINFO_CONN_ID) === $info['conn_id']); +var_dump(curl_getinfo($ch, CURLINFO_CONN_ID) === -1); ?> --EXPECT-- -bool(false) +bool(true) +bool(true) bool(true) bool(true) bool(true) From f6704b7b05a69bcc0896384e96bf16aa4bac3791 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emre=20=C3=87al=C4=B1=C5=9Fkan?= Date: Mon, 30 Jun 2025 22:58:05 +0300 Subject: [PATCH 03/13] added CURLINFO_CONN_ID --- .../tests/curl_getinfo_CURLINFO_CONN_ID.phpt | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt b/ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt index bfcf78ab3d933..74465ff783781 100644 --- a/ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt +++ b/ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt @@ -20,7 +20,9 @@ curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $info = curl_getinfo($ch); var_dump(isset($info['conn_id'])); -var_dump($info['posttransfer_time_us'] === -1); +var_dump($info['conn_id'] === 0); +var_dump("1. debug"); +var_dump($info['conn_id']); $result = curl_exec($ch); @@ -29,6 +31,19 @@ var_dump(isset($info['conn_id'])); var_dump(is_int($info['conn_id'])); var_dump(curl_getinfo($ch, CURLINFO_CONN_ID) === $info['conn_id']); var_dump(curl_getinfo($ch, CURLINFO_CONN_ID) === -1); +var_dump("2. debug"); +var_dump($info['conn_id']); + + + +curl_setopt($ch, CURLOPT_URL, "{$host}/get.inc?test=file"); +curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); +$result = curl_exec($ch); + +$info = curl_getinfo($ch); +var_dump("3. debug"); +var_dump($info['conn_id']); + ?> --EXPECT-- From 4c17b9ba5f19d5010a6e9ed3d641c2f48845f58d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emre=20=C3=87al=C4=B1=C5=9Fkan?= Date: Mon, 30 Jun 2025 23:19:47 +0300 Subject: [PATCH 04/13] added CURLINFO_CONN_ID --- ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt b/ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt index 74465ff783781..f8a9fa78ebe9b 100644 --- a/ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt +++ b/ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt @@ -17,12 +17,19 @@ $port = (int) (explode(':', $host))[1]; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "{$host}/get.inc?test=file"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); +curl_setopt($ch, CURLOPT_FORBID_REUSE, false); +curl_setopt($ch, CURLOPT_FRESH_CONNECT, false); +curl_setopt($ch, CURLOPT_HTTPHEADER, [ + 'Connection: Keep-Alive', + 'Keep-Alive: 10' +]); $info = curl_getinfo($ch); var_dump(isset($info['conn_id'])); var_dump($info['conn_id'] === 0); var_dump("1. debug"); var_dump($info['conn_id']); +print_r($info); $result = curl_exec($ch); @@ -33,6 +40,7 @@ var_dump(curl_getinfo($ch, CURLINFO_CONN_ID) === $info['conn_id']); var_dump(curl_getinfo($ch, CURLINFO_CONN_ID) === -1); var_dump("2. debug"); var_dump($info['conn_id']); +print_r($info); @@ -43,6 +51,7 @@ $result = curl_exec($ch); $info = curl_getinfo($ch); var_dump("3. debug"); var_dump($info['conn_id']); +print_r($info); ?> From 97f7af0a4240fff7be7fe79dc597c6d499561616 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emre=20=C3=87al=C4=B1=C5=9Fkan?= Date: Tue, 1 Jul 2025 00:04:59 +0300 Subject: [PATCH 05/13] added CURLINFO_CONN_ID --- ext/curl/interface.c | 10 +++--- .../tests/curl_getinfo_CURLINFO_CONN_ID.phpt | 33 +++++++------------ 2 files changed, 17 insertions(+), 26 deletions(-) diff --git a/ext/curl/interface.c b/ext/curl/interface.c index 956a70f3d7cfb..f478320b743e8 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -2659,11 +2659,6 @@ PHP_FUNCTION(curl_getinfo) if (curl_easy_getinfo(ch->cp, CURLINFO_POSTTRANSFER_TIME_T, &co) == CURLE_OK) { CAAL("posttransfer_time_us", co); } -#endif -#if LIBCURL_VERSION_NUM >= 0x080200 /* Available since 8.2.0 */ - if (curl_easy_getinfo(ch->cp, CURLINFO_CONN_ID , &co) == CURLE_OK) { - CAAL("conn_id", co); - } #endif if (curl_easy_getinfo(ch->cp, CURLINFO_TOTAL_TIME_T, &co) == CURLE_OK) { CAAL("total_time_us", co); @@ -2696,6 +2691,11 @@ PHP_FUNCTION(curl_getinfo) if (curl_easy_getinfo(ch->cp, CURLINFO_PROXYAUTH_USED, &l_code) == CURLE_OK) { CAAL("proxyauth_used", l_code); } +#endif +#if LIBCURL_VERSION_NUM >= 0x080200 /* Available since 8.2.0 */ + if (curl_easy_getinfo(ch->cp, CURLINFO_CONN_ID , &co) == CURLE_OK) { + CAAL("conn_id", co); + } #endif } else { switch (option) { diff --git a/ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt b/ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt index f8a9fa78ebe9b..fba971c005d0d 100644 --- a/ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt +++ b/ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt @@ -15,21 +15,12 @@ $host = curl_cli_server_start(); $port = (int) (explode(':', $host))[1]; $ch = curl_init(); -curl_setopt($ch, CURLOPT_URL, "{$host}/get.inc?test=file"); +curl_setopt($ch, CURLOPT_URL, "{$host}/get.inc?test=get"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); -curl_setopt($ch, CURLOPT_FORBID_REUSE, false); -curl_setopt($ch, CURLOPT_FRESH_CONNECT, false); -curl_setopt($ch, CURLOPT_HTTPHEADER, [ - 'Connection: Keep-Alive', - 'Keep-Alive: 10' -]); $info = curl_getinfo($ch); var_dump(isset($info['conn_id'])); -var_dump($info['conn_id'] === 0); -var_dump("1. debug"); -var_dump($info['conn_id']); -print_r($info); +var_dump($info['conn_id'] === -1); $result = curl_exec($ch); @@ -37,21 +28,17 @@ $info = curl_getinfo($ch); var_dump(isset($info['conn_id'])); var_dump(is_int($info['conn_id'])); var_dump(curl_getinfo($ch, CURLINFO_CONN_ID) === $info['conn_id']); -var_dump(curl_getinfo($ch, CURLINFO_CONN_ID) === -1); -var_dump("2. debug"); -var_dump($info['conn_id']); -print_r($info); +var_dump(curl_getinfo($ch, CURLINFO_CONN_ID) === 0); - - -curl_setopt($ch, CURLOPT_URL, "{$host}/get.inc?test=file"); +curl_setopt($ch, CURLOPT_URL, "{$host}/get.inc?test=get"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($ch); $info = curl_getinfo($ch); -var_dump("3. debug"); -var_dump($info['conn_id']); -print_r($info); +var_dump(isset($info['conn_id'])); +var_dump(is_int($info['conn_id'])); +var_dump(curl_getinfo($ch, CURLINFO_CONN_ID) === $info['conn_id']); +var_dump(curl_getinfo($ch, CURLINFO_CONN_ID) === 1); ?> @@ -62,4 +49,8 @@ bool(true) bool(true) bool(true) bool(true) +bool(true) +bool(true) +bool(true) +bool(true) From 5c9d18aedda329646ed236c6117c2415be5042ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emre=20=C3=87al=C4=B1=C5=9Fkan?= Date: Thu, 3 Jul 2025 15:29:51 +0300 Subject: [PATCH 06/13] added curl multi handle test --- .../tests/curl_getinfo_CURLINFO_CONN_ID.phpt | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt b/ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt index fba971c005d0d..0c2ec208b973b 100644 --- a/ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt +++ b/ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt @@ -40,6 +40,33 @@ var_dump(is_int($info['conn_id'])); var_dump(curl_getinfo($ch, CURLINFO_CONN_ID) === $info['conn_id']); var_dump(curl_getinfo($ch, CURLINFO_CONN_ID) === 1); +$ch1=curl_init(); +$ch2=curl_init(); +$cmh=curl_multi_init(); + +foreach([$ch1, $ch2] as $ch) { + curl_setopt($ch, CURLOPT_URL, "{$host}/get.inc?test=getpost&get_param=Curl%20Handle"); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + $info = curl_getinfo($ch); + var_dump(isset($info['conn_id'])); + var_dump($info['conn_id'] === -1); + curl_multi_add_handle($cmh,$ch); +} + +$running=0; +do { + curl_multi_exec($cmh,$running); +} while ($running>0); + +foreach([$ch1, $ch2] as $ch) { + $result = curl_multi_getcontent($ch); + $info = curl_getinfo($ch); + var_dump(isset($info['conn_id'])); + var_dump(is_int($info['conn_id'])); + var_dump(curl_getinfo($ch, CURLINFO_CONN_ID) === $info['conn_id']); + var_dump(curl_getinfo($ch, CURLINFO_CONN_ID) === 0); +} + ?> --EXPECT-- @@ -53,4 +80,12 @@ bool(true) bool(true) bool(true) bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) From 7b57965c4d40387e95c80003a52c158afa60c997 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emre=20=C3=87al=C4=B1=C5=9Fkan?= Date: Thu, 3 Jul 2025 15:59:13 +0300 Subject: [PATCH 07/13] added curl share test --- .../tests/curl_getinfo_CURLINFO_CONN_ID.phpt | 55 ++++++++++++++++++- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt b/ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt index 0c2ec208b973b..3d259b4bec43c 100644 --- a/ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt +++ b/ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt @@ -58,15 +58,54 @@ do { curl_multi_exec($cmh,$running); } while ($running>0); -foreach([$ch1, $ch2] as $ch) { +foreach([$ch1, $ch2] as $key => $ch) { $result = curl_multi_getcontent($ch); $info = curl_getinfo($ch); var_dump(isset($info['conn_id'])); var_dump(is_int($info['conn_id'])); var_dump(curl_getinfo($ch, CURLINFO_CONN_ID) === $info['conn_id']); - var_dump(curl_getinfo($ch, CURLINFO_CONN_ID) === 0); + var_dump(curl_getinfo($ch, CURLINFO_CONN_ID) === $key); } +$csh = curl_share_init(); + +curl_share_setopt($csh, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE); +curl_share_setopt($csh, CURLSHOPT_SHARE, CURL_LOCK_DATA_CONNECT); +curl_share_setopt($csh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS); +curl_share_setopt($csh, CURLSHOPT_SHARE, CURL_LOCK_DATA_SSL_SESSION); + + +$ch1=curl_init(); +$ch2=curl_init(); + +foreach([$ch1, $ch2] as $ch) { + curl_setopt($ch, CURLOPT_URL, "{$host}/get.inc?test=getpost&get_param=Curl%20Handle"); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + $info = curl_getinfo($ch); + var_dump(isset($info['conn_id'])); + var_dump($info['conn_id'] === -1); +} + + +curl_setopt($ch1, CURLOPT_SHARE, $csh); + +$result = curl_exec($ch1); + +$info = curl_getinfo($ch1); +var_dump(isset($info['conn_id'])); +var_dump(is_int($info['conn_id'])); +var_dump(curl_getinfo($ch, CURLINFO_CONN_ID) === $info['conn_id']); +var_dump(curl_getinfo($ch, CURLINFO_CONN_ID) === 0); + +curl_setopt($ch2, CURLOPT_SHARE, $csh); + +$result = curl_exec($ch2); + +$info = curl_getinfo($ch2); +var_dump(isset($info['conn_id'])); +var_dump(is_int($info['conn_id'])); +var_dump(curl_getinfo($ch, CURLINFO_CONN_ID) === $info['conn_id']); +var_dump(curl_getinfo($ch, CURLINFO_CONN_ID) === 0); ?> --EXPECT-- @@ -88,4 +127,16 @@ bool(true) bool(true) bool(true) bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) From 4021a7701f3b5e9356bd33e224d4aa2307514460 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emre=20=C3=87al=C4=B1=C5=9Fkan?= Date: Thu, 3 Jul 2025 16:23:26 +0300 Subject: [PATCH 08/13] added curl share test --- ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt b/ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt index 3d259b4bec43c..ac26ad3f6585b 100644 --- a/ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt +++ b/ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt @@ -94,8 +94,8 @@ $result = curl_exec($ch1); $info = curl_getinfo($ch1); var_dump(isset($info['conn_id'])); var_dump(is_int($info['conn_id'])); -var_dump(curl_getinfo($ch, CURLINFO_CONN_ID) === $info['conn_id']); -var_dump(curl_getinfo($ch, CURLINFO_CONN_ID) === 0); +var_dump(curl_getinfo($ch1, CURLINFO_CONN_ID) === $info['conn_id']); +var_dump(curl_getinfo($ch1, CURLINFO_CONN_ID) === 0); curl_setopt($ch2, CURLOPT_SHARE, $csh); @@ -104,8 +104,8 @@ $result = curl_exec($ch2); $info = curl_getinfo($ch2); var_dump(isset($info['conn_id'])); var_dump(is_int($info['conn_id'])); -var_dump(curl_getinfo($ch, CURLINFO_CONN_ID) === $info['conn_id']); -var_dump(curl_getinfo($ch, CURLINFO_CONN_ID) === 0); +var_dump(curl_getinfo($ch2, CURLINFO_CONN_ID) === $info['conn_id']); +var_dump(curl_getinfo($ch2, CURLINFO_CONN_ID) === 0); ?> --EXPECT-- @@ -139,4 +139,8 @@ bool(true) bool(true) bool(true) bool(true) +bool(true) +bool(true) +bool(true) +bool(true) From 22aef08fe00ee869052367d4889829afe7e8e6c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emre=20=C3=87al=C4=B1=C5=9Fkan?= Date: Thu, 3 Jul 2025 16:38:26 +0300 Subject: [PATCH 09/13] added curl share test --- ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt b/ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt index ac26ad3f6585b..4a90b0a3c52e3 100644 --- a/ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt +++ b/ext/curl/tests/curl_getinfo_CURLINFO_CONN_ID.phpt @@ -105,7 +105,7 @@ $info = curl_getinfo($ch2); var_dump(isset($info['conn_id'])); var_dump(is_int($info['conn_id'])); var_dump(curl_getinfo($ch2, CURLINFO_CONN_ID) === $info['conn_id']); -var_dump(curl_getinfo($ch2, CURLINFO_CONN_ID) === 0); +var_dump(curl_getinfo($ch2, CURLINFO_CONN_ID) === 1); ?> --EXPECT-- From 313fc787e176416545ea409fc243cbd9363b66f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emre=20=C3=87al=C4=B1=C5=9Fkan?= Date: Wed, 16 Jul 2025 13:35:08 +0300 Subject: [PATCH 10/13] added CURLINFO_QUEUE_TIME_T --- UPGRADING | 5 +++ ext/curl/curl.stub.php | 7 ++++ ext/curl/curl_arginfo.h | 5 ++- ext/curl/interface.c | 5 +++ .../curl_getinfo_CURLINFO_QUEUE_TIME_T.phpt | 41 +++++++++++++++++++ 5 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 ext/curl/tests/curl_getinfo_CURLINFO_QUEUE_TIME_T.phpt diff --git a/UPGRADING b/UPGRADING index 1d878a44e2a10..b6727e1c80abe 100644 --- a/UPGRADING +++ b/UPGRADING @@ -193,6 +193,11 @@ PHP 8.5 UPGRADE NOTES used by a cURL transfer. It is primarily useful when connection reuse or connection pooling logic is needed in PHP-level applications. When curl_getinfo() returns an array, this value is available as the "conn_id" key. + . Added support for CURLINFO_QUEUE_TIME_T (libcurl >= 8.6.0) to the curl_getinfo() + function. This constant allows retrieving the time (in microseconds) that the + request spent in libcurl’s connection queue before it was sent. + This value can also be retrieved by passing CURLINFO_QUEUE_TIME_T to the + curl_getinfo() $option parameter. This requires libcurl 8.6.0 or later. - DOM: . Added Dom\Element::$outerHTML. diff --git a/ext/curl/curl.stub.php b/ext/curl/curl.stub.php index 5dac22ae7952c..7199583b90396 100644 --- a/ext/curl/curl.stub.php +++ b/ext/curl/curl.stub.php @@ -3054,6 +3054,13 @@ * @cvalue CURLAUTH_BEARER */ const CURLAUTH_BEARER = UNKNOWN; +#if LIBCURL_VERSION_NUM >= 0x080600 /* Available since 8.6.0 */ +/** + * @var int + * @cvalue CURLINFO_QUEUE_TIME_T + */ +const CURLINFO_QUEUE_TIME_T = UNKNOWN; +#endif /** * @var int * @cvalue CURLINFO_APPCONNECT_TIME_T diff --git a/ext/curl/curl_arginfo.h b/ext/curl/curl_arginfo.h index 75be3b75c4983..640eaa62f2f97 100644 --- a/ext/curl/curl_arginfo.h +++ b/ext/curl/curl_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 533884c442ca1146a61c0824a4f8c9628c31aae3 */ + * Stub hash: c2245ec496551980ca17ff4472cc1790653e41bd */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_close, 0, 1, IS_VOID, 0) ZEND_ARG_OBJ_INFO(0, handle, CurlHandle, 0) @@ -812,6 +812,9 @@ static void register_curl_symbols(int module_number) REGISTER_LONG_CONSTANT("CURLOPT_HAPROXYPROTOCOL", CURLOPT_HAPROXYPROTOCOL, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("CURL_LOCK_DATA_PSL", CURL_LOCK_DATA_PSL, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("CURLAUTH_BEARER", CURLAUTH_BEARER, CONST_PERSISTENT); +#if LIBCURL_VERSION_NUM >= 0x080600 /* Available since 8.6.0 */ + REGISTER_LONG_CONSTANT("CURLINFO_QUEUE_TIME_T", CURLINFO_QUEUE_TIME_T, CONST_PERSISTENT); +#endif REGISTER_LONG_CONSTANT("CURLINFO_APPCONNECT_TIME_T", CURLINFO_APPCONNECT_TIME_T, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("CURLINFO_CONNECT_TIME_T", CURLINFO_CONNECT_TIME_T, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("CURLINFO_NAMELOOKUP_TIME_T", CURLINFO_NAMELOOKUP_TIME_T, CONST_PERSISTENT); diff --git a/ext/curl/interface.c b/ext/curl/interface.c index ffb7889c748b2..56286fc222e56 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -2571,6 +2571,11 @@ PHP_FUNCTION(curl_getinfo) if (curl_easy_getinfo(ch->cp, CURLINFO_APPCONNECT_TIME_T, &co) == CURLE_OK) { CAAL("appconnect_time_us", co); } +#if LIBCURL_VERSION_NUM >= 0x080600 /* Available since 8.6.0 */ + if (curl_easy_getinfo(ch->cp, CURLINFO_QUEUE_TIME_T , &co) == CURLE_OK) { + CAAL("queue_time_us", co); + } +#endif if (curl_easy_getinfo(ch->cp, CURLINFO_CONNECT_TIME_T, &co) == CURLE_OK) { CAAL("connect_time_us", co); } diff --git a/ext/curl/tests/curl_getinfo_CURLINFO_QUEUE_TIME_T.phpt b/ext/curl/tests/curl_getinfo_CURLINFO_QUEUE_TIME_T.phpt new file mode 100644 index 0000000000000..82064b93af182 --- /dev/null +++ b/ext/curl/tests/curl_getinfo_CURLINFO_QUEUE_TIME_T.phpt @@ -0,0 +1,41 @@ +--TEST-- +Curlinfo CURLINFO_QUEUE_TIME_T +--EXTENSIONS-- +curl +--SKIPIF-- += 8.6.0"); +?> +--FILE-- + 0); + +?> +--EXPECT-- +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) + From e97e377f6221d7d38d0292123da466708a4ff71c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emre=20=C3=87al=C4=B1=C5=9Fkan?= Date: Wed, 16 Jul 2025 13:36:47 +0300 Subject: [PATCH 11/13] added CURLINFO_QUEUE_TIME_T --- UPGRADING | 1 + 1 file changed, 1 insertion(+) diff --git a/UPGRADING b/UPGRADING index b6727e1c80abe..8fb0a809c9453 100644 --- a/UPGRADING +++ b/UPGRADING @@ -528,6 +528,7 @@ PHP 8.5 UPGRADE NOTES . CURLINFO_HTTPAUTH_USED. . CURLINFO_PROXYAUTH_USED. . CURLINFO_CONN_ID. + . CURLINFO_QUEUE_TIME_T. . CURLOPT_INFILESIZE_LARGE. . CURLFOLLOW_ALL. . CURLFOLLOW_OBEYCODE. From 08069862bc34911516569eac68a1a56fd4873455 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emre=20=C3=87al=C4=B1=C5=9Fkan?= <13554944+thecaliskan@users.noreply.github.com> Date: Wed, 16 Jul 2025 18:36:27 +0300 Subject: [PATCH 12/13] deleted the libcurl version requirement twice Co-authored-by: Ayesh Karunaratne --- UPGRADING | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UPGRADING b/UPGRADING index 8fb0a809c9453..c4fad26b1e86f 100644 --- a/UPGRADING +++ b/UPGRADING @@ -193,7 +193,7 @@ PHP 8.5 UPGRADE NOTES used by a cURL transfer. It is primarily useful when connection reuse or connection pooling logic is needed in PHP-level applications. When curl_getinfo() returns an array, this value is available as the "conn_id" key. - . Added support for CURLINFO_QUEUE_TIME_T (libcurl >= 8.6.0) to the curl_getinfo() + . Added support for CURLINFO_QUEUE_TIME_T to the curl_getinfo() function. This constant allows retrieving the time (in microseconds) that the request spent in libcurl’s connection queue before it was sent. This value can also be retrieved by passing CURLINFO_QUEUE_TIME_T to the From 8fd4038ca11db23a60dc9a9fc3edc79aab283ce5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emre=20=C3=87al=C4=B1=C5=9Fkan?= Date: Thu, 17 Jul 2025 11:45:12 +0300 Subject: [PATCH 13/13] added CURLINFO_QUEUE_TIME_T --- UPGRADING | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/UPGRADING b/UPGRADING index c4fad26b1e86f..31988344edac4 100644 --- a/UPGRADING +++ b/UPGRADING @@ -193,11 +193,11 @@ PHP 8.5 UPGRADE NOTES used by a cURL transfer. It is primarily useful when connection reuse or connection pooling logic is needed in PHP-level applications. When curl_getinfo() returns an array, this value is available as the "conn_id" key. - . Added support for CURLINFO_QUEUE_TIME_T to the curl_getinfo() + . Added support for CURLINFO_QUEUE_TIME_T (libcurl >= 8.6.0) to the curl_getinfo() function. This constant allows retrieving the time (in microseconds) that the request spent in libcurl’s connection queue before it was sent. This value can also be retrieved by passing CURLINFO_QUEUE_TIME_T to the - curl_getinfo() $option parameter. This requires libcurl 8.6.0 or later. + curl_getinfo() $option parameter. - DOM: . Added Dom\Element::$outerHTML.