MYSQLI_OPT_CONNECT_TIMEOUT and mysql.connect_timeout not working when connecting to a non-responsive server
@SakiTakamachi ya está trabajando en esto.
Desde el 2/8/2024.
- Lenguaje dominante
- C
- Estrellas
- 40.4k
- Forks
- 8.2k
- Merge medio
- 2 d 15 h
- PR fusionados (30 d)
- 103
Descripción
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:
- Set up a non-responsive server.
I made it by python like this(tcp_server.py):
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}")
- Use the mysqli extension to connect to this server with the
MYSQLI_OPT_CONNECT_TIMEOUToption set.
<?php
$connect = @mysqli_init();
mysqli_options($connect, MYSQLI_OPT_CONNECT_TIMEOUT, 5);
@mysqli_real_connect($connect, 'host.docker.internal', 'user', 'password', null, 12345, "", 0);
- 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
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Evaluación
Este issue todavía no se ha evaluado.