Bug #71251 [Opn->Fbk]: Blocking TCP socket connection does not timeout
Edit report at https://bugs.php.net/bug.php?id=71251&edit=1
ID: 71251
Updated by: ab@php.net
Reported by: gohanman at gmail dot com
Summary: Blocking TCP socket connection does not timeout
-Status: Open
+Status: Feedback
Type: Bug
Package: Sockets related
Operating System: Windows 10
PHP Version: 7.0.1
Block user comment: N
Private report: N
New Comment:
Thanks for the report. I've a question - what is localhost:15674 supposed to have behind? On my
machine there's no such service, so I just see "Done" with your repro code - the
connection simply gets refused. If there's some difference in 7.0, it therefore should depend
and be reproducable on a concrete counterpart. Could you please provide more info on that?
Thanks.
Previous Comments:
------------------------------------------------------------------------
[2015-12-30 22:36:17] gohanman at gmail dot com
Description:
------------
I'm trying to set a connection timeout on a TCP port. I specifically want to verify whether a
remote service is alive. If the host does not respond within the specified timeout, I want to mark
it as down and continue with execution. If you happen to be running something on port 15674
substitute any closed port. I *want* the connection to fail in a predictable way.
In PHP 5.3 - 5.6, socket_connect blocks for roughly one second and then returns false. In PHP 7,
socket_connect blocks for infinity as far as I can tell. The longest I've let it run so far is
about 15 minutes but its clearly ignoring every built in execution limit. Restarting Apache is the
only thing that halts the script's execution.
I'm using php.ini-production with the following modules enabled: sockets, opcache, curl,
gettext, intl, mysqli, pdo_mysql, openssl, and xsl. Other than enabling modules I haven't made
any changes to the config.
Apache is 2.4.18 (Apache Lounge build). Both PHP and Apache are x86. The same code does work as
expected on the same machine in PHP 5.3 - PHP 5.6 so I don't think it's strictly a Windows
10 problem. I'm running the older PHP versions with different, older VC9 and VC11 Apache builds
of course.
Test script:
---------------
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($sock, SOL_SOCKET, SO_SNDTIMEO, array('sec' => 1, 'usec'
=> 0));
socket_set_block($sock);
$test = @socket_connect($sock,'localhost',15674);
socket_close($sock);
echo "Done";
Expected result:
----------------
$test gets boolean value true or false without more or less one second (with reasonable allowance
for whatever precision the underlying system can actually provide).
Actual result:
--------------
socket_connect blocks forever
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=71251&edit=1
Thread (7 messages)