Multi BDD connexion refusée
Bonjour tous le monde.
Je bosse sur un projet où je dois importer des données d'une base de données extérieur au site où l'application est hébergé.
Je vais essayer de schématiser :
Serveur 1:
OVH
héberge l'application symfony
base de donnée habituelle.
identifiant.mysql.db
Serveur 2:
OVH
base de données accessible par un logiciel
adresse IP pour se connecter sur la BDD
Je voudrais pouvoir récupérer les utilisateurs de la base de données du serveur 2 afin de les traiter avec symfony pour crypter les mots de passe etc etc.
Tout ceci sera exécuté tous les jours pendant la nuit. Donc avec une CRON.
j'ai utilisé le tuto https://symfony.com/doc/current/doct..._managers.html
Voilà mon config.yml :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
|
# Doctrine Configuration
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
# if using pdo_sqlite as your database driver:
# 1. add the path in parameters.yml
# e.g. database_path: '%kernel.project_dir%/var/data/data.sqlite'
# 2. Uncomment database_path in parameters.yml.dist
# 3. Uncomment next line:
#path: '%database_path%'
orm:
default_entity_manager: default
entity_managers:
default :
connection: default
mappings:
AppBundle: ~
EncoursBundle: ~
PaiementBundle: ~
UserBundle: ~
alias:
connection: alias
mappings:
AppBundle: ~
EncoursBundle: ~
PaiementBundle: ~
UserBundle: ~ |
J'ai créé une commande symfony que j'ai nommé loadUser
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
|
<?php
namespace User\UserBundle\Command;
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Helper\ProgressBar;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use User\UserBundle\Entity\User;
class LoadUserCommand extends ContainerAwareCommand
{
protected function configure()
{
$this
->setName('loadUser')
->setDescription('...')
->addArgument('argument', InputArgument::OPTIONAL, 'Argument description')
->addOption('option', null, InputOption::VALUE_NONE, 'Option description')
;
}
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();
$count = 0;
$bach = 20;
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);
if (($count % $bach) === 0){
$manager->flush();
$manager->clear();
}
$progress->advance();
$count ++;
}
$manager->flush();
$manager->clear();
}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 ($user){
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);
}
$manager->flush();
}
$progress->advance();
}
}
$progress->finish();
$output->writeln('');
$output->writeln('User importés.');
}
} |
En local sur ma machine tout fonctionne parfaitement.
Cependant quand je met le site en production donc sur le serveur 1, j'ai la connexion au serveur 2 qui est refusée quand je tape la commande bin/console loadUser
Pour tester si c'était un blocage du serveur 2 sur les connexions entrante j'ai fait un script qui n'utilise pas symfony où j'initialise mes 2 connexions :
test.php
Code:
1 2 3 4 5 6 7 8
|
SERVEUR 2
$dbAlias = new PDO("mysql:host=xxx.xxx.xxx.xxx;dbname=xxxxxxxxx", "xxxxxxxxx", "xxxxxxxx");
$dbAlias->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
SERVEUR 1
$db = new PDO("mysql:host=identifiantovh.mysql.db;dbname=xxxxxxxx", "xxxxxxxxxxx", "xxxxxxxxxxxx");
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); |
ici je n'ai pas de soucis de connexion.
j'ai donc essayé de tout faire avec mon script et lancer les commandes symfony avec php.
Voici donc ma nouvelle page test.php :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
<?php
SERVEUR 2
$dbAlias = new PDO("mysql:host=xxx.xxx.xxx.xxx;dbname=xxxxxxxxx", "xxxxxxxxx", "xxxxxxxx");
$dbAlias->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
SERVEUR 1
$db = new PDO("mysql:host=identifiantovh.mysql.db;dbname=xxxxxxxx", "xxxxxxxxxxx", "xxxxxxxxxxxx");
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$userStmt = $dbAlias->query("SELECT * FROM User_Import");
$users = $userStmt->fetchAll(PDO::FETCH_ASSOC);
$encours_stmt = $dbAlias->query("SELECT * FROM Encours_Import");
$encours = $encours_stmt->fetchAll(PDO::FETCH_ASSOC);
$db->exec("DELETE FROM User_Import");
$db->exec("DELETE FROM Encours_Import");
function placeholders($text, $count=0, $separator=","){
$result = array();
if($count > 0){
for($x=0; $x<$count; $x++){
$result[] = $text;
}
}
return implode($separator, $result);
}
foreach($users as $row){
$fields = implode(",", array_keys($row));
$test = placeholders("?", sizeof(array_values($row)), ",");
try{
$stmt = $db->prepare("INSERT INTO User_Import (".$fields.") VALUES (".$test.")");
if($stmt){
$stmt->execute(array_values($row));
}
}catch (PDOException $e){
echo $e->getMessage();
}
}
foreach ($encours as $encour){
$fields = implode(",", array_keys($encour));
$values = placeholders("?", sizeof(array_values($encour)), ",");
try{
$stmt = $db->prepare("INSERT INTO Encours_Import (".$fields.") VALUES (".$values.")");
if($stmt){
$stmt->execute(array_values($encour));
}
}catch (PDOException $e){
echo $e->getMessage();
}
}
exec("php ".__DIR__."/bin/console loadUser");
?> |
ici j'ai bien le transfert des données qui se réalise mais la commande symfony n'est elle pas exécutée.
Donc en résumé peut importe la méthode 1 ou la méthode 2 tant que ça fonctionne ça m'est égal qu'elle partie vous pouvez m'aider à résoudre. Je suis désespéré ça fait 1 semaine que je cherche une solution et je ne trouve rien.
J'espère que c'est clair ce que j'ai dis.
Merci d'avances pour l'aide bénie soit celui qui m'aidera à trouver la solution :mouarf:
Cordialement.