Bonjour,
J'ai installé le système de multi base de données avec symfony sur un serveur OVH. En local la commande fonctionne, par contre sur le serveur OVH j'obtiens une erreur connexion refusée.
C'est la connexion "alias" qui est refusée.
Voici les réglages :

protected function execute(InputInterface $input, OutputInterface $output)
    {
        $argument       = $input->getArgument('argument');
        $output->writeln("Début de limportation des utilisateurs....");

        $manager        = $this->getContainer()->get("doctrine")->getManager("default");
        $aliasManager   = $this->getContainer()->get("doctrine")->getManager("alias");

        $usersImport    = $aliasManager->getRepository("UserBundle:User")->getAllImport();
        $users          = $manager->getRepository("UserBundle:User")->findAll();

        $encoder = $this->getContainer()->get("security.password_encoder");

        $progress = new ProgressBar($output, count($usersImport));
        $progress->setRedrawFrequency(5);
        $progress->setFormat("very_verbose");
        $progress->start();

        if(empty($users)){
            foreach ($usersImport as $userImport){

                $numCompta          = $userImport->getNumCompta();
                $numEtablissement   = $userImport->getNumEtablissement();
                $nom                = $userImport->getNom();
                $prenom             = $userImport->getPrenom();
                $email              = $userImport->getEmail();
                $adresse            = $userImport->getAdresse();
                $adresseBIS         = $userImport->getAdresse2();
                $codePostal         = $userImport->getCodePostal();
                $ville              = $userImport->getVille();
                $identifiant        = $userImport->getIdentifiant();
                $motdepasse         = trim($userImport->getMotPasse());
                $codePays           = $userImport->getCodePays();
                $telephone          = $userImport->getTelephone();
                $telPort            = $userImport->getTelephonePort();
                $actif              = true;
                $firstConnexion     = true;

                $user = new User();

                $user->setNumCompta($numCompta);
                $user->setNumEtablissement($numEtablissement);
                $user->setNom($nom);
                $user->setPrenom($prenom);
                $user->setEmail($email);
                $user->setAdresse($adresse);
                $user->setAdresse2($adresseBIS);
                $user->setCodePostal($codePostal);
                $user->setVille($ville);
                $user->setIdentifiant($identifiant);
                $user->setMotPasse($encoder->encodePassword($user, $motdepasse));
                $user->setCodePays($codePays);
                $user->setTelephone($telephone);
                $user->setTelephonePort($telPort);
                $user->setActif($actif);
                $user->setPremierConnexion($firstConnexion);
                $user->setDateCreation(new \DateTime());

                $manager->persist($user);
                $progress->advance();
            }
            $manager->flush();
        }else{
            foreach ($usersImport as $userImport){
                $numCompta          = $userImport->getNumCompta();
                $numEtablissement   = $userImport->getNumEtablissement();
                $nom                = $userImport->getNom();
                $prenom             = $userImport->getPrenom();
                $email              = $userImport->getEmail();
                $adresse            = $userImport->getAdresse();
                $adresseBIS         = $userImport->getAdresse2();
                $codePostal         = $userImport->getCodePostal();
                $ville              = $userImport->getVille();
                $codePays           = $userImport->getCodePays();
                $telephone          = $userImport->getTelephone();
                $telPort            = $userImport->getTelephonePort();

                $user = $manager->getRepository("UserBundle:User")->getUserByNumCompta($numCompta);

                if($numEtablissement !== $user->getNumEtablissement()){
                    $user->setNumEtablissement($numEtablissement);
                }

                if($nom !== $user->getNom()){
                    $user->setNom($nom);
                }
                if($prenom !== $user->getPrenom()){
                    $user->setPrenom($prenom);
                }
                if($email !== $user->getEmail()){
                    $user->setEmail($email);
                }
                if($adresse !== $user->getAdresse()){
                    $user->setAdresse($adresse);
                }
                if($adresseBIS !== $user->getAdresse2()){
                    $user->setAdresse2();
                }
                if($codePostal !== $user->getCodePostal()){
                    $user->setCodePostal($codePostal);
                }
                if($ville !== $user->getVille()){
                    $user->setVille($ville);
                }
                if($codePays !== $user->getCodePays()){
                    $user->setCodePays($codePays);
                }
                if($telephone !== $user->getTelephone()){
                    $user->setTelephone($telephone);
                }
                if($telPort !== $user->getTelephonePort()){
                    $user->setTelephonePort($telPort);
                }
                $progress->advance();
                $manager->flush();
            }
        }
        $progress->finish();
        $output->writeln('');
        $output->writeln('User importés.');
    }
doctrine:
    dbal:
        default_connection : default
        connections:
            default:
                driver: pdo_mysql
                host: '%database_host%'
                port: '%database_port%'
                dbname: '%database_name%'
                user: '%database_user%'
                password: '%database_password%'
                charset: UTF8
            alias:
                driver: pdo_mysql
                host: '%alias_database_host%'
                port: '%alias_database_port%'
                dbname: '%alias_database_name%'
                user: '%alias_database_user%'
                password: '%alias_database_password%'
                charset: UTF8

  [Doctrine\DBAL\Exception\ConnectionException]                              
  An exception occured in driver: SQLSTATE[HY000] [2002] Connection refused  

  [Doctrine\DBAL\Driver\PDOException]        
  SQLSTATE[HY000] [2002] Connection refused  

  [PDOException]                             
  SQLSTATE[HY000] [2002] Connection refused  

Est ce que OVH bloque quelque chose ? je suis dans le flou total.

36 réponses


Petit up je trouve vraiment rien

Bonjour,

Le message d'erreur est plutôt explicite, as-tu essayer de te connecter avec la cli de mysql directement depuis ton serveur ?
Exemple: mysql -u utilisateur -p -h adresseip
Est-ce que ça fonctionne?

Non cela ne fonctionne pas non plus. Apparemment en faisant une recherche faut que je commente une ligne sur le serveur pour autoriser les connections à distance si j'ai bien compris

EDIT : C'est pas la même erreur, pour le moment une autre erreur est apparu, le temps d'arriver à corriger celle ci et voir comme cela se passe ensuite.

EDIT 2 : Donc une connexion PDO fonctionne depuis n'importe quel serveur par contre sur le serveur OVH quand je tente la ligne de commande

mysql -u utilisateur -p -h adressip 

j'obtiens :

ERROR 2003 (HY000): Can't connect to MySQL server on 'ADRESSE_IP' (111)

Petit up, je ne sais vraiment pas pourquoi avec symfony impossible de me connecter sur cette base de données.
Même un

$test = new PDO(....)

me met connection refusée dans le script de command symfony. Alors que dans une page php normal la connexion fonctionne. Je sais vraiment pas comment faire.

Est ce que le serveur sur lequel est exécuté ton script php est autorisé à ce connecter au serveur SQL (firewall) ?

Est ce que l'utilisateur MySql est autorisé à ce connecter à cette base de données ? sur ce serveur ? exemple dans phpMyAdmin

Je sais que chez OVH les bases de données MySql fournis avec des hébergements mutualisés ne sont pas accessibles depuis l'extérieur.

Je pense que si c'étais un problème de ce genre là mon script php brut ne fonctionnerai pas également hors là c'est juste avec symfony qu'il fonctionne pas.

Hum...

Selon moi, si tu te places sur le serveur sur lequel doit tourner ton script PHP (symfony ou autre) et que quand tu lance la commande :

mysql -u utilisateur -pmot2passe -h adressip

tu obtiens une erreur de connexion du genre :

Can't connect to MySQL server on 'ADRESSE_IP'

C'est que tu as un problème de connexion générale qui n'a rien à voir avec Symfony.

  • soit un problème de port mysql (3306) non ouvert sur le serveur Sql
  • soit un mauvais user/password

    Mais c'est très surprenant si ton script php brut, exécuté sur le même serveur, fonctionne.

Sur le serveur SQL, dans le fichier

/etc/mysql/my.cnf

verrifie si tu as la ligne

bind-address            = 127.0.0.1

Celà signifie que seul les connexions internes sont autorisées et ton serveur SQL n'est donc pas ouvert à l'extérieur.

C'est un serveur dédié où nous avons une infogérance dessus. Je pense que la ligne est bien configuré, et sur d'autres serveurs du même type la connexion à mysql n'est pas refusée.

Personnelement, je ferais une levée de doute.

J'exécuterai des tests croisés :

  • est-ce que le même script exécuté sur un autre serveur fonctiionne ?
  • est ce que ce script pointant vers un autre serveur SQL fonctionne ?
  • ...

Dans le but d'écarter les incertitudes et de certifier que c'est bien un problème lié à ta conf Symfony et non ta conf système.

Le script brut ? ou la commande symfony ?

Les deux mon capitaine

Alors j'ai un petit soucis c'est que la majorité des serveurs que mon entreprise possède ne sont pas très à jour niveau php du coup je pense que symfony ne sera pas compatible dessus. C'est pour cela qu'on prends des serveurs cloud pour chaque projet symfony. Les autres serveurs sont genre en php 5.2 ou 5.3.

dans ce cas, au moins la commande

mysql -u utilisateur -pmot2passe -h adressip

Tant qu'elle ne fonctionnera pas, c'est que la conf système n'est pas bonne.

Alors au risque d'etre chiant ^^' je n'ai un accès SSH que sur les serveurs OVH Cloud sur les autres gros serveurs mon responsable ne veux pas me donner l'accès pour éviter de faire des plantage sur le serveur.

Bon, ton responsable ne nous facilite pas la tâche ^^

Alors juste un bon gros script php qui fait juste une connexion à Mysql. Tu test ce script sur différents serveurs, vers différents serveurs SQL

Alors je possède un autre serveur cloud ovh et quand je tape

mysql -u USER -p PASSWORD -h ADRESSE_IP DATABASE_NAME

j'ai toute la doc de mysql qui s'affiche et les parametres du fichier my.cnf. qui s'affichage mais pas d'accès.

et sinon les scripts fonctionne sur n'importe quel serveur vers le serveur qui me refuse la connexion.

EDIT : je parle du script php brut.

EDIT 2 : En rentrant chez moi j'essaierai de lancer le script brut de ma machine voir si j'accède au serveur.

Je vais poser une question bête, mais mon hypothèse est la suivant,

Tu nous dit avoir une erreur du genre: Can't connect to MySQL server on 'ADRESSE_IP'
Tu nous dit également que ta commande est la suivante: mysql -u USER -p PASSWORD -h ADRESSE_IP DATABASE_NAME
J'espère que tu as bien remplacé -h par l'adresse IP de ton serveur ? ou au moins par 127.0.0.1 ?

Si tu te trouves en SSH sur le serveur où le serveur mysql est installé tu es pas obligé de mettre le paramètre "-h".
Essaye ceci:

mysql -u USER -p

Ensuite le prompt va te demander le mot de passe (il ne sera pas affiché quand tu vas taper).
Si cela ne fonctionne pas indique nous ton erreur, sinon cela veut dire que tu as bien accès à ta BDD.

Oui bien sur !
je met ADRESSE_IP car c'est l'adresse IP publique du serveur de mon entreprise donc je ne la divulge pas. Donc sur et certain que je met bien une adresse IP et que celle ci est bonne comme j'ai dis plus haut il me semble j'ai créé un script php avec :

$db = new PDO("mysql:host=xxx.xxx.xxx.xxx;dbname=DBNAME", "USER", "MDP);

et cela fonctionne.

et pour ta proposition je vois pas ce que ça pourrai faire. je cherche à me connecter un une base mysql qui n'est pas en local. La base de OVH propre à l'application hébergé j'y arrive sans soucis.
Et que en local j'arrive à me connecter à ce serveur distant et à ma base de donnée local.
Mon problème est du serveur où est hébergé l'application vers un autre serveur là il veut pas sauf si je passe par le script brut et simple en PDO comme j'ai indiqué plus haut.

... je séche.
Question très très très conne : tes paramètres de connexion dans ton fichier YML sont corrects ?

doctrine:
    dbal:
        default_connection : default
        connections:
            default:
                driver: pdo_mysql
                host: '%database_host%'
                port: '%database_port%'
                dbname: '%database_name%'
                user: '%database_user%'
                password: '%database_password%'
                charset: UTF8
            alias:
                driver: pdo_mysql
                host: '%alias_database_host%'
                port: '%alias_database_port%'
                dbname: '%alias_database_name%'
                user: '%alias_database_user%'
                password: '%alias_database_password%'
                charset: UTF8

Vu que en local ça fonctionne j'ai envi de dire oui ^^'

Par contre j'ai une hypothése.
J'ai remarqué que j'arrivais à faire un var_dump de la connexion nommé "alias" via un controller donc en accédant à celle ci via une méthode GET
Quand j'accède à mon script brut de php c'est encore une fois en GET.
une commande symfony ne doit pas utiliser la même méthode. Donc et si OVH me bloquais cette façon que j'utilise d'accéder à la base de données ?
Les opérations à réaliser sont longue, surtout lors de la premier importation des données, je peux donc pas passer par un autre moyen.
Vous en pensez quoi ?

Perso je bosse avec Symfony 2.8
Et dans mes commandes, j'utilise cette syntaxe pour travailler avec l'entityManager

$defaultEm = $this->getContainer()->get('doctrine.orm.default_entity_manager');
$aliasEm = $this->getContainer()->get('doctrine.orm.alias_entity_manager');

Sans doute similaire à ta syntaxe mais bon ... a tester

Autre chose de surprenant, tu cherches à atteindre le même UserRepository avec les 2 Managers.
Je me trompte peut être mais quand tu travailles avec plusieurs BDD sous Symfony, il faut précisier pour chaque Bundle quel Manager utiliser

doctrine:
    dbal:
        default_connection: default
        connections:
            default:
                driver:   pdo_mysql
                host:     '%database_host%'
                port:     '%database_port%'
                dbname:   '%database_name%'
                user:     '%database_user%'
                password: '%database_password%'
                charset:  UTF8
            customer:
                driver:   pdo_mysql
                host:     '%database_host2%'
                port:     '%database_port2%'
                dbname:   '%database_name2%'
                user:     '%database_user2%'
                password: '%database_password2%'
                charset:  UTF8

    orm:
        default_entity_manager: default
        entity_managers:
            default:
                connection: default
                mappings:
                    AppBundle:  ~
                    AcmeStoreBundle: ~
            customer:
                connection: customer
                mappings:
                    AcmeCustomerBundle: ~

Avec cette exemple de conf, je ne suis pas sur que tu puisses mettre UserBundle dans les 2 entity_managers

Si je peux, comme tu dis je dois juste utiliser le bon manager pour atteindre la bonne table. les tests en local fonctionnent très bien et me récupère les bonnes données dans cette état, sur et certain que le problème ne viens pas de là.

et en local tu arrive à te connecter aux 2 bases distantes (je veux dire les futures base de prod) ?

Pas celle de OVH où est hébergé l'application c'est logique, mais celle avec l'adresse IP oui j'y accède.

je reste sur ma première idée : le serveur SQL n'autorise pas pas de connexion depuis le serveur sur lequel tourne l'appli.

Si tu dis que tu as une infogérance sur ce serveur SQL, c'est possible qu'ils aient fait une configuration dans laquelle seule ton adresse IP fixe de dev est autorisé.

Au cas où, demande leur de vérifier que l'adresse IP du serveur OVH sur lequel l'appli est hébergé est bien autorisé à se connecter au service MySql du 2nd serveur.

Faut vraiement faire une levée de doute.

Mais si c'étais le cas, je pourrais me connecter en faisant un bête et méchant new PDO non ?

Exactement

Hors là c'est le cas. Donc je pense pas que ce soit ça, je suis en train de faire un serveur sur Digital Ocean voir ce que cela donne.

Pardon, j'avais compris l'inverse

Il y a pas de soucis. C'est pour ca que j'ai émit une hypothèse plus haut.

Donc après plusieurs test je confirme ma théorie.
OVH bloque l'accès a une base de données distante via les commandes de symfony.
j'accède à la base de données via une page web donc dans un controller.
Le problème est que la taille des imports à faire est très conséquante ce qui fait que le script ne va pas jusqu'au bout.

C'est bizarre cette histroire.
Pourquoi une connexion à une BDD distante serait bloquée quand elle est initiée par Symfony et pas par une connexion "bas niveau" ?
Qu'est ce qui change avec Symfony pour que la connexion soit refusée ?

... la vérité est ailleurs (selon moi)
Bon courage

Tout simplement la méthode d'appel. Au niveau de la requête. Si la méthode est une méthode GET alors il est moins stricte. Surement pour des raisons justement de lourdeur de tâche pour pas faire crouler le serveur, sécurité etc etc. C'est la seule raison que je vois. Toute les connexions bas niveau que j'ai réalisé réussissait à l'appel d'une page. En ligne de commande la connexion étais refusée.