2015-05-22 21 views
6

Desidero connettermi a un'istanza MySQL remota (una di Google Cloud SQL) utilizzando il suo indirizzo IPv6.PHP e PDO: connessione a MySQL tramite indirizzo IPv6

Sto utilizzando PHP DOP così:

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

Ma non riesce sempre con il seguente messaggio di eccezione:

PDOException: SQLSTATE [HY000] [2002] No route to host

Dal terminale posso connettermi all'istanza MySQL, senza alcun problema, come questo:

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

Qualsiasi aiuto sarà molto apprezzato.

Grazie

+0

O non si dispone di IPv6 o la connessione è protetta da firewall. –

+1

Se fosse il caso, non sarei in grado di connettermi dalla riga di comando. –

+0

@JohannFradj Hai risolto il problema? –

risposta

0

Provare a utilizzare questo per il vostro conenction DOP e vedere se funziona.

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

Nel caso in cui non riesce, si può meglio utilizzare try...catch per ottenere esattamente l'errore

<?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

Scusa ma non vedo alcuna differenza tra il tuo codice e il mio? E ho già incollato il messaggio di errore di eccezione. Grazie per l'aiuto. –

+0

Hai provato a connetterti senza 'port' nel tuo codice nel caso in cui fosse stata configurata una porta diversa per ascoltare la connessione al database? – OmniPotens

+0

Sì, già provato. Esattamente lo stesso messaggio di errore. –

3

La lettura di questo https://www.saotn.org/php-mysql-and-ipv6-still-slow/ ha pronunciato la seguente idea:

Sapendo che, normalmente, IPv6 ha la precedenza su IPv4 (che è configurabile), agli utenti viene lasciato un sito Web e le operazioni di database che rispondono lentamente, solo perché si connette a un indirizzo IPv6 in PHP viene rifiutato e la connessione rifiutata non viene gestita correttamente, rendendo così lento il fallback a IPv4. Ci vogliono pochi secondi mysql.connect_timeout

Nota: la fonte sembra attendibile

Inoltre, questa è una buona lettura: http://dev.mysql.com/worklog/task/?id=798

supporto dovrebbe essere aggiunto per MySQL per lavorare su IPv6
("Protocollo Internet versione 6").
Ciò significa:
- gli utenti possono connettersi con IPv6. questo è parzialmente un problema di connettore.
- memorizzazione di informazioni sull'indirizzo dell'utente, ad es. in mysql.user, possono essere in formato IPv6
- la proposta di nuovi tipi di dati e CIDR INET permettono formato IPv6, come descritto nella WL # 2037 "Aggiungi CIDR e dati INET tipi"
- funzioni come inet_ntoa() hanno bisogno di revisione

+0

Sarebbe strano. Inoltre ci sono altri componenti di PHP che sembrano supportare ipv6 come socket http://php.net/manual/en/function.socket-connect.php –

+1

a quanto pare il problema è localizzato nel connettore php mysql ... mi dispiace per il cattivo notizia. –

+1

Incredibile che non ci siano molte più informazioni su questo ... –

4

Nel caso in cui qualcun altro inciampi sullo stesso problema, e per salvarli 2 ore scavando attraverso il sorgente PHP, le connessioni PDO MySQL IPv6 funzionano se si mettono parentesi quadre attorno all'indirizzo.

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

esempio

$pdo = new PDO("mysql:host=[1234:5678::42];port=3306;dbname=foo", ...);