Mysqli __construct php_network_getaddresses: getaddrinfo không thành công

________số 8_______

$db = new FooMysqli('localhost', 'my_user', 'my_password', 'my_db', 3306, null, 'utf8mb4');

Các ứng dụng sử dụng PECL/mysqlnd_ms nên triển khai xử lý lỗi thích hợp cho tất cả lệnh gọi API của người dùng. Và vì plugin thay đổi ngữ nghĩa của bộ điều khiển kết nối, lệnh gọi API có thể trả về lỗi không mong muốn. Nếu sử dụng plugin trên bộ điều khiển kết nối không còn đại diện cho một kết nối mạng riêng lẻ mà là một nhóm kết nối, mã lỗi và thông báo lỗi sẽ được đặt trên bộ điều khiển kết nối bất cứ khi nào xảy ra lỗi trên bất kỳ kết nối mạng nào phía sau

Nếu sử dụng các kết nối lười biếng, là mặc định, các kết nối sẽ không được mở cho đến khi chúng cần thiết để thực hiện truy vấn. Do đó, lệnh gọi API để thực thi câu lệnh có thể trả về lỗi kết nối. Trong ví dụ dưới đây, một lỗi xảy ra khi cố gắng chạy một câu lệnh trên một nô lệ. Mở kết nối nô lệ không thành công vì tệp cấu hình plugin liệt kê tên máy chủ không hợp lệ cho nô lệ

Ví dụ #1 Kích hoạt lỗi kết nối

{
    "myapp": {
        "master": {
            "master_0": {
                "host": "localhost",
                "socket": "\/tmp\/mysql.sock"
            }
        },
        "slave": {
            "slave_0": {
                "host": "invalid_host_name",
            }
        },
        "lazy_connections": 1
    }
}

Việc kích hoạt rõ ràng các kết nối lười biếng chỉ nhằm mục đích trình diễn

Ví dụ #2 Lỗi kết nối khi thực hiện truy vấn

$mysqli = new mysqli("myapp", "username", "password", "database");
if (mysqli_connect_errno())
  /* Of course, your error handling is nicer... */
  die(sprintf("[%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()));

/* Connection 1, connection bound SQL user variable, no SELECT thus run on master */
if (!$mysqli->query("SET @myrole='master'")) {
 printf("[%d] %s\n", $mysqli->errno, $mysqli->error);
}

/* Connection 2, run on slave because SELECT, provoke connection error */
if (!($res = $mysqli->query("SELECT @myrole AS _role"))) {
 printf("[%d] %s\n", $mysqli->errno, $mysqli->error);
} else {
 $row = $res->fetch_assoc();
 $res->close();
 printf("@myrole = '%s'\n", $row['_role']);
}
$mysqli->close();
?>

Ví dụ trên sẽ xuất ra một cái gì đó tương tự như

PHP Warning:  mysqli::query(): php_network_getaddresses: getaddrinfo failed: Name or service not known in %s on line %d
PHP Warning:  mysqli::query(): [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known (trying to connect via tcp://invalid_host_name:3306) in %s on line %d
[2002] php_network_getaddresses: getaddrinfo failed: Name or service not known

Các ứng dụng dự kiến ​​sẽ xử lý các lỗi kết nối có thể xảy ra bằng cách triển khai xử lý lỗi thích hợp

Tùy thuộc vào trường hợp sử dụng, các ứng dụng có thể muốn xử lý lỗi kết nối khác với các lỗi khác. Các lỗi kết nối điển hình là 2002 (CR_CONNECTION_ERROR) - Can't connect to local MySQL server through socket '%s' (%d), 2003 (CR_CONN_HOST_ERROR) - Can't connect to MySQL server on '%s' (%d)2005 (CR_UNKNOWN_HOST) - Unknown MySQL server host '%s' (%d). Ví dụ: ứng dụng có thể kiểm tra mã lỗi và thực hiện chuyển đổi dự phòng theo cách thủ công. Triết lý của plugin là không cung cấp chuyển đổi dự phòng tự động, ngoài chuyển đổi dự phòng chính, bởi vì chuyển đổi dự phòng không phải là một hoạt động minh bạch

Ví dụ #3 Kích hoạt lỗi kết nối

{
    "myapp": {
        "master": {
            "master_0": {
                "host": "localhost"
            }
        },
        "slave": {
            "slave_0": {
                "host": "invalid_host_name"
            },
            "slave_1": {
                "host": "192.168.78.136"
            }
        },
        "lazy_connections": 1,
        "filters": {
            "roundrobin": [

            ]
        }
    }
}

Kích hoạt rõ ràng các kết nối lười biếng được thực hiện cho mục đích trình diễn, cũng như cân bằng tải luân phiên trái ngược với loại

PHP Warning:  mysqli::query(): php_network_getaddresses: getaddrinfo failed: Name or service not known in %s on line %d
PHP Warning:  mysqli::query(): [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known (trying to connect via tcp://invalid_host_name:3306) in %s on line %d
[2002] php_network_getaddresses: getaddrinfo failed: Name or service not known
0 mặc định

Ví dụ #4 Chuyển đổi dự phòng cơ bản nhất

$mysqli = new mysqli("myapp", "username", "password", "database");
if (mysqli_connect_errno())
  /* Of course, your error handling is nicer... */
  die(sprintf("[%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()));

/* Connection 1, connection bound SQL user variable, no SELECT thus run on master */
if (!$mysqli->query("SET @myrole='master'")) {
 printf("[%d] %s\n", $mysqli->errno, $mysqli->error);
}

PHP Warning:  mysqli::query(): php_network_getaddresses: getaddrinfo failed: Name or service not known in %s on line %d
PHP Warning:  mysqli::query(): [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known (trying to connect via tcp://invalid_host_name:3306) in %s on line %d
[2002] php_network_getaddresses: getaddrinfo failed: Name or service not known
3

PHP Warning:  mysqli::query(): php_network_getaddresses: getaddrinfo failed: Name or service not known in %s on line %d
PHP Warning:  mysqli::query(): [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known (trying to connect via tcp://invalid_host_name:3306) in %s on line %d
[2002] php_network_getaddresses: getaddrinfo failed: Name or service not known
4

Ví dụ trên sẽ xuất ra một cái gì đó tương tự như

[1045] Access denied for user 'username'@'localhost' (using password: YES)
PHP Warning:  mysqli::query(): php_network_getaddresses: getaddrinfo failed: Name or service not known in %s on line %d
PHP Warning:  mysqli::query(): [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known (trying to connect via tcp://invalid_host_name:3306) in %s on line %d
SUCCESS, [0] ''
version = 5.6.2-m5-log

Trong một số trường hợp, có thể không dễ dàng truy xuất tất cả các lỗi xảy ra trên tất cả các kết nối mạng thông qua bộ điều khiển kết nối. Ví dụ: giả sử một bộ điều khiển kết nối đại diện cho một nhóm gồm ba kết nối đang mở. Một kết nối với chủ và hai kết nối với nô lệ. Ứng dụng thay đổi cơ sở dữ liệu hiện tại bằng cách sử dụng lệnh gọi API người dùng mysqli_select_db(), sau đó gọi hàm thư viện mysqlnd để thay đổi lược đồ. mysqlnd_ms giám sát chức năng và cố gắng thay đổi cơ sở dữ liệu hiện tại trên tất cả các kết nối để hài hòa trạng thái của chúng. Bây giờ, giả sử chủ thành công trong việc thay đổi cơ sở dữ liệu và cả hai nô lệ đều thất bại. Khi có lỗi ban đầu từ nô lệ đầu tiên, plugin sẽ đặt một lỗi thích hợp trên tay cầm kết nối. Điều tương tự cũng được thực hiện khi nô lệ thứ hai không thể thay đổi cơ sở dữ liệu. Thông báo lỗi từ nô lệ đầu tiên bị mất

Những trường hợp như vậy có thể được gỡ lỗi bằng cách kiểm tra lỗi loại

PHP Warning:  mysqli::query(): php_network_getaddresses: getaddrinfo failed: Name or service not known in %s on line %d
PHP Warning:  mysqli::query(): [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known (trying to connect via tcp://invalid_host_name:3306) in %s on line %d
[2002] php_network_getaddresses: getaddrinfo failed: Name or service not known
5 (xem ở trên) hoặc, nếu không có lựa chọn nào khác, điều tra lỗi