2015-05-22 27 views
6

Tôi muốn kết nối với một cá thể MySQL từ xa (một Google Cloud SQL) bằng cách sử dụng địa chỉ IPv6 của nó.PHP & PDO: Kết nối với MySQL bằng địa chỉ IPv6

Tôi đang sử dụng PHP PDO như thế:

$db = new \PDO('mysql:host=<ipv6-address>;port=3306;dbname=<database-name>', 
    '<username>', 
    '<password>' 
); 

Nhưng nó luôn luôn thất bại với thông điệp ngoại lệ sau đây:

PDOException: SQLSTATE [HY000] [2002] Không có con đường để lưu trữ

Từ thiết bị đầu cuối tôi có thể kết nối với cá thể MySQL, mà không có bất kỳ vấn đề nào, như sau:

mysql --host=<ipv6-address> --user=<username> --<password> 

Mọi trợ giúp sẽ thực sự được đánh giá cao.

Cảm ơn

+0

Hoặc bạn không có IPv6 hoặc kết nối được tường lửa. –

+1

Nếu đúng như vậy, tôi sẽ không thể kết nối từ dòng lệnh. –

+0

@JohannFradj Bạn đã giải quyết được vấn đề chưa? –

Trả lời

0

Hãy thử sử dụng tính năng này cho PDO của bạn và xem nó có hoạt động không.

$dbh = new PDO('mysql:host=<ipv6-address>;port=<port>;dbname=<dbname>', <dbusername>, <dbpassword>); 

Trong trường hợp nếu thất bại, bạn có thể sử dụng tốt hơn try...catch để có được chính xác tại lỗi

<?php 
try { 
    $dbh = new PDO('mysql:host=<ipv6-address>;port=<port>;dbname=<dbname>', <dbusername>, <dbpassword>); 
} catch (PDOException $e) { 
    print "Error!: " . $e->getMessage() . "<br/>"; 
    die(); 
} 
?> 
+0

Xin lỗi nhưng tôi không thấy bất kỳ sự khác biệt nào giữa mã của bạn và của tôi? Và tôi đã dán thông báo lỗi ngoại lệ. Cảm ơn bạn đã giúp đỡ. –

+0

Bạn đã thử kết nối mà không có 'cổng' trong mã của bạn trong trường hợp một cổng khác được cấu hình để nghe kết nối cơ sở dữ liệu chưa? – OmniPotens

+0

Đúng, đã thử. Chính xác cùng một thông báo lỗi. –

3

Reading https://www.saotn.org/php-mysql-and-ipv6-still-slow/ này cung cấp cho các ý tưởng sau đây:

Biết rằng, thông thường, IPv6 được ưu tiên hơn IPv4 (có thể định cấu hình được), người dùng bị bỏ lại với trang web phản hồi chậm và hoạt động cơ sở dữ liệu, chỉ vì kết nối với địa chỉ IPv6 trong PHP bị từ chối và kết nối bị từ chối không được xử lý đúng cách, làm cho dự phòng chậm lại với IPv4. Nó mất vài giây mysql.connect_timeout

Lưu ý: các nguồn có vẻ đáng tin cậy

Ngoài ra, đây là một đọc tốt: http://dev.mysql.com/worklog/task/?id=798

Hỗ trợ nên được bổ sung cho MySQL để làm việc trên IPv6
("Giao thức Internet phiên bản 6").
Điều này có nghĩa là:
- người dùng có thể kết nối với IPv6. đây là một phần vấn đề kết nối.
- lưu trữ thông tin địa chỉ người dùng, ví dụ: trong mysql.user, có thể là ở định dạng IPv6
- đề xuất mới các kiểu dữ liệu CIDR và ​​INET cho phép định dạng IPv6 như mô tả trong WL # 2037 "Add CIDR và ​​dữ liệu INET loại"
- chức năng như inet_ntoa() cần sửa đổi

+0

Điều đó thật kỳ lạ. Ngoài ra còn có các thành phần khác của PHP mà dường như hỗ trợ ipv6 như ổ cắm http://php.net/manual/en/function.socket-connect.php –

+1

dường như vấn đề được bản địa hóa trong kết nối mysql php ... xin lỗi về cái xấu Tin tức. –

+1

Thật không thể tin được là không có thêm thông tin gì về điều đó ... –

4

Trong trường hợp bất kỳ ai khác tình cờ gặp vấn đề tương tự, và để lưu chúng 2 giờ delving thông qua nguồn PHP, PDO MySQL kết nối IPv6 làm việc nếu bạn đặt dấu ngoặc vuông xung quanh địa chỉ.

Xem: https://github.com/php/php-src/blob/master/main/streams/xp_socket.c#L568

ví dụ:

$pdo = new PDO("mysql:host=[1234:5678::42];port=3306;dbname=foo", ...); 
Các vấn đề liên quan