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