[php-src] Issue #15193: MYSQLI_OPT_CONNECT_TIMEOUT and mysql.connect_timeout not working when connecting to a non-responsive server
| From: | oogFranz | Date: | Thu, 01 Aug 2024 09:14:22 +0000 |
| Subject: | [php-src] Issue #15193: MYSQLI_OPT_CONNECT_TIMEOUT and mysql.connect_timeout not working when connecting to a non-responsive server | ||
| Groups: | php.bugs | ||
| Request: | Send a blank email to php-bugs+get-247417@lists.php.net to get a copy of this message | ||
Issue: https://github.com/php/php-src/issues/15193
Author: oogFranz
### Description
I encountered an issue where the
MYSQLI_OPT_CONNECT_TIMEOUT option and the
mysql.connect_timeout setting do not work as expected when attempting to connect to a
non-responsive server. The connection attempt hangs instead of timing out.
In contrast, when attempting to connect to a non-existent server, the connection attempt fails
immediately.
Steps to Reproduce:
1. Set up a non-responsive server.
I made it by python like this:
```python
import socket
HOST = '0.0.0.0'
PORT = 12345
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen()
print(f"Listening on {HOST}:{PORT}")
while True:
conn, addr = s.accept()
print(f"Connected by {addr}")
```
2. Use the mysqli extension to connect to this server with the
MYSQLI_OPT_CONNECT_TIMEOUT option set.
```php
<?php
$connect = @mysqli_init();
mysqli_options($connect, MYSQLI_OPT_CONNECT_TIMEOUT, 5);
@mysqli_real_connect($connect, 'host.docker.internal', 'user',
'password', null, 12345, "", 0);
```
3. Observe that the connection attempt does not timeout as expected.
Expected Behavior:
The connection attempt should timeout after 5 seconds as specified MYSQLI_OPT_CONNECT_TIMEOUT
duration and rise an exception.
Actual Behavior:
The connection attempt hangs without timing out.
I used the following PHP.
```
php -v
PHP 8.2.21 (cli) (built: Jul 23 2024 06:55:37) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.21, Copyright (c) Zend Technologies
```
The mysqlnd.net_read_timeout and MYSQL_OPT_READ_TIMEOUT options work, but
they affect not only the connection handshake but also every query execution, which is not desirable
for our use case.
### PHP Version
PHP 8.2.21
### Operating System
_No response_