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 :
J'ai créé une commande symfony que j'ai nommé loadUser
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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: ~
En local sur ma machine tout fonctionne parfaitement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.'); } }
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
ici je n'ai pas de soucis de connexion.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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);
j'ai donc essayé de tout faire avec mon script et lancer les commandes symfony avec php.
Voici donc ma nouvelle page test.php :
ici j'ai bien le transfert des données qui se réalise mais la commande symfony n'est elle pas exécutée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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"); ?>
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![]()
Cordialement.
Partager