a conexão php pdo não pode ser estabelecida, mas o cliente de linha de comando mysql pode

2

situação da seguinte forma:

script php no servidor a, executado pelo usuário 'web' (nginx + php-fpm) deve acessar o mysql no servidor b via pdo library, mas obtém SQLSTATE [HY000] [2003] Não é possível conectar-se ao servidor MySQL em 'xxx.xxx.xxx.xxx' (4)

servidor a centos 6.5, php 5.3; servidor b centos 6.2, mysql 5.1

no entanto, o cliente de linha de comando mysql - executado como usuário sem privilégios - pode se conectar perfeitamente, reproduzível e estável.

uma vez que o cliente da linha de comando mysql estabeleceu uma conexão bem-sucedida entre os servidores, o script php é executado com sucesso por cerca de 5-7 minutos, presumivelmente até a conexão do cliente da linha de comando mysql atingir o tempo limite.

o que está faltando?

aqui está o script de teste:

   <?php
   try {
   $dbh = new PDO('mysql:host=111.111.111.111;dbname=myname;port=3306', 'myuser',
    'mypass');
  echo 'Connected to database';
}
catch(PDOException $e)
{
echo $e->getMessage();
}
    
por Andreas Wagner 02.07.2014 / 19:02

3 respostas

1

Então, no final das contas, isso foi uma questão de roteamento.

Atualmente estamos usando uma rede estaticamente roteada, e o servidor mysql a não possui uma rota definida de volta para o servidor b.

a configuração da rede é um pouco confusa, já que a conexão física é assim: servidor b (fora do local) > vpn gw > internet > ponto de verificação fw > roteador openwrt > servidor a

Aparentemente, o cliente de linha de comando do mysql é mais tolerante e foi capaz de estabelecer essa conexão, mas a biblioteca pdo não foi.

Depois de adicionar a rota, a biblioteca pdo pode estabelecer conexões por conta própria e está felizmente sendo executada desde então.

Portanto, verifique suas rotas, mesmo que as conexões ping / telnet / mysql estejam aparentemente funcionando.

A propósito, o erro "Interromper chamada do sistema" cobriria este cenário?

    
por 05.07.2014 / 10:31
0
$ perror 4
OS error code   4:  Interrupted system call

Você deve simplesmente tentar novamente ao receber esse erro específico.

Isso pode ser uma indicação de um servidor / rede altamente carregado . Nesse caso, você pode tentar aumentar o tempo limite de conexão como uma correção de curto prazo e resolver os problemas de congestionamento a longo prazo.

    
por 02.07.2014 / 20:18
0

Apenas encontrei esse tipo de problema, embora fosse um pouco diferente em termos de servidores, endereços, etc. O importante que me ajudou a resolver isso é:

  1. Tente acessar o DB em questão por meio da CLI na mesma caixa em que seu PHP é executado
  2. Tente conectar o banco de dados através do PHP a partir de uma caixa diferente

Se o primeiro falhar e o segundo funcionar, pode ser que você tenha uma conta de usuário extra no banco de dados designado ao host do qual está se conectando.

Verifique os usuários existentes com

select host, user, password from mysql.user;

Se você encontrar algo como:

| host           | user           | password
+----------------+----------------+------------------------------------------
| 10.10.10.1     | myuser         | 
| %              | myuser         | *0803B925439C244BA857C3FD07A4F86A556F0925

isso significa que você tem esse usuário extra conectado ao host PHP do qual você está se conectando. Largue-o ou torne a senha adequada um privilégio para este usuário específico do host.

    
por 02.04.2018 / 21:34