Bug #78825 [Ver]: stream_socket_client works slower than except

From: Date: Thu, 02 Jan 2020 16:32:03 +0000
Subject: Bug #78825 [Ver]: stream_socket_client works slower than except
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-224669@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=78825&edit=1 ID: 78825 Updated by: cmb@php.net Reported by: vibbow at hotmail dot com Summary: stream_socket_client works slower than except Status: Verified Type: Bug Package: Performance problem Operating System: Windows Server 2019 PHP Version: 7.3.11 Block user comment: N Private report: N New Comment: If this performance issue affects PECL/redis, I suggest that you file that as issue there; at least the maintainers would become aware of that, and maybe one of them would have a look at the issue in the PHP stream layer. Previous Comments: ------------------------------------------------------------------------ [2020-01-02 12:39:31] vibbow at hotmail dot com This bug also effect some pecl extension whom use stream_socket_client to create connection. The one I know is redis extension. ------------------------------------------------------------------------ [2020-01-02 12:34:00] cmb@php.net In the meantime (for whatever reason) I have been able to reproduce a noticeable performance difference. The relevant difference between socket_connect() and the respective part of stream_socket_client() appears to be that the latter switches the socket to non-blocking mode before connect()[1], and then poll()s to wait for the connection to be established. Since there is no poll() on Windows, an emulation[2] is used, which might explain the performance difference. However, if I enforce using the poll emulation on Linux, that's only marginally slower. If I skip setting the socket non-blocking, performance is very close to socket_connect(), but doing so would ignore configured timeouts, and as such is not an option. Another noteworthy difference is that Windows explicitly calls shutdown() and poll() before closesocket() is called[3]. This issue certainly deserves further investigation, but doesn't appear of high priority, so I'm unassigning myself for now. Maybe someone else has some time to look into this? [1] <https://github.com/php/php-src/blob/php-7.3.13/main/network.c#L306> [2] <https://github.com/php/php-src/blob/php-7.3.13/main/network.c#L1197> [3] <https://github.com/php/php-src/blob/php-7.3.13/main/streams/xp_socket.c#L201-L212> ------------------------------------------------------------------------ [2019-12-23 12:24:06] vibbow at hotmail dot com My server environment is Windows server 2019 (same build number as windows 10 1809) and still can get this reproduced. So this issue is not strict to windows 10 1909 ------------------------------------------------------------------------ [2019-12-23 12:21:44] cmb@php.net Thanks for the update! So far I suspect Windows 10 1909 causing the issue. Will have to check with that version. ------------------------------------------------------------------------ [2019-12-23 12:02:36] vibbow at hotmail dot com Just tried this on a clean install PC. Dell Optiplex 3060, with windows 10 1909 x64 Only PHP and VC runtime, no other software Still can get this reproduced. https://gist.github.com/vibbow/8909ffc9990023129562e8971fe30f7d ------------------------------------------------------------------------ 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=78825 -- Edit this bug report at https://bugs.php.net/bug.php?id=78825&edit=1

« previous php.bugs (#224669) next »