Bug #80830 [Nab->Opn]: Running out of local ports when using curl

From: Date: Tue, 09 Mar 2021 11:54:57 +0000
Subject: Bug #80830 [Nab->Opn]: Running out of local ports when using curl
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-232637@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=80830&edit=1 ID: 80830 Updated by: cmb@php.net Reported by: external dot maik dot dieterich at bosch dot com Summary: Running out of local ports when using curl -Status: Not a bug +Status: Open Type: Bug Package: Network related Operating System: Windows Server 2019 PHP Version: 7.4.15 Assigned To: cmb Block user comment: N Private report: N New Comment: To clarify: you are not initializing multiple curl handles in a single request, but rather for different requests, and you are using the apache2handler SAPI? In this case there may indeed be a problem, since the SAPI intializes libcurl (curl_global_init()) at its startup and shuts it down (curl_global_cleanup()) at its shutdown, so libcurl might keep connections open, but may not reuse them. > It's causing localhost to localhost TIME_WAITs. Frankly, I have no idea why that happens. The curl extension is relatively thin wrapper around libcurl, so I wonder whether we set up or use libcurl inappropriately, or whether Apache or the SAPI interferes. Previous Comments: ------------------------------------------------------------------------ [2021-03-09 08:23:25] michael dot mckeever at bosch dot com Thank you @danack and @cmb for the quick response. Your suggestions with reusing the the curl handle is correct if you're using a cli application and you're in control of the environment. The problem described by Maik is that if you're using apache you can't reuse curl handles. @rtrtrtrtrt, your comment is unfortunately not helping in this topic ;-) The key question is, why is the mass usage of curl.exe not causing TIME_WAITs and the php libcurl functions causing TIME_WAITs. Furthermore the php functinos are not causing TIME_WAITs to the called server as one would expect, but it's causing TIME_WAITs for some kind of local redirects. It's causing localhost to localhost TIME_WAITs. ------------------------------------------------------------------------ [2021-03-04 20:07:01] rtrtrtrtrt at dfdfdfdf dot dfd it's just how TCP works https://superuser.com/questions/173535/what-are-close-wait-and-time-wait-states ------------------------------------------------------------------------ [2021-03-04 18:32:27] external dot maik dot dieterich at bosch dot com First thanks for the quick response. What is not clear for me, is why the connection I open to the external server can be closed immediately and why this local local port connections, which i do not have if i use curl from command line, are still open even if the external connection I open is closed. Because each connection is opened in a different thread i think I can not reuse them. ------------------------------------------------------------------------ [2021-03-04 17:19:18] cmb@php.net I think @danack is spot on. But instead of fiddling with these Windows settings, I suggest to re-use the same curl resource (object as of PHP 8.0.0), like described by Dan, to avoid calling curl_easy_cleanup() under the hood, because[1] | re-using handles is a key to good performance with libcurl Anyway, this is not a PHP issue. [1] <https://curl.se/libcurl/c/curl_easy_cleanup.html> ------------------------------------------------------------------------ [2021-03-04 15:51:58] danack@php.net This is a feature of Windows. It keeps network connections open for a long time by default. You could either work around this by "Adjust the MaxUserPort and TcpTimedWaitDelay settings" - https://docs.microsoft.com/en-us/biztalk/technical-guides/settings-that-can-be-modified-to-improve-network-performance Or you can re-use the same Curl object, which will almost certainly re-use the underlying network connection if possible, ``` $ch = curl_init($url); for($i = 0; $i < 5000; $i++) { curl_setopt($ch, CURLOPT_URL, $url); $response = curl_exec($ch); } curl_close($ch); ``` I'll leave it open, so that someone who is more sure that there is nothing to be done in PHP, can close it. ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at https://bugs.php.net/bug.php?id=80830 -- Edit this bug report at https://bugs.php.net/bug.php?id=80830&edit=1

« previous php.bugs (#232637) next »