Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/01/2012, 10h08   #1
Invité de passage
 
Inscription : janvier 2012
Messages : 5
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 5
Points : 2
Points : 2
Par défaut Optimisation de script

Bonjour tout le monde,

Je viens de réaliser un script qui me permet d'importer le catalogue de mes fournisseur via FTP (fichiers texte) dans ma base de données puis synchroniser mon stock avec celui des fournisseurs.

Mon problème est que je ne dispose que de 1Go de RAM et lors de l’exécution de mon script je perd le contrôle de mon serveur (Redémarrage nécessaire).

Voilà le script en question :

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
<?php
 
try
{
 
        $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
 
// Connexion a la base de données ---------------------------------------------------------------------------------------------
        $bdd = new PDO('mysql:host=127.0.0.1;dbname=db', 'user', 'password');
 
// Création des tables pour l'import ------------------------------------------------------------------------------------------
 
		$bdd->exec("DROP TABLE IF EXISTS `stock_im`");
		$bdd->exec("DROP TABLE IF EXISTS `stock_etc`");
		$bdd->exec("DROP TABLE IF EXISTS `stock`");
		$bdd->exec('CREATE TABLE IF NOT EXISTS `stock_im` (
		  `sku_im` varchar(18) NOT NULL,
		  `reference_im` varchar(32) NOT NULL,
		  `dispo_im` int(11) NOT NULL,
		  `commended_im` int(11) NOT NULL,
		  `eta_im` varchar(18) NOT NULL)') ; 
		$bdd->exec('CREATE TABLE IF NOT EXISTS `stock_etc` (
		  `sku_etc` varchar(18) NOT NULL,
		  `dispo_etc` int(11) NOT NULL,
		  `commended_etc` int(11) NOT NULL,
		  `reference_etc` varchar(32) NOT NULL,
		  `eta_etc` varchar(32) NOT NULL,
		  `eta_etcs` varchar(32) NOT NULL)') ; 
		$bdd->exec('CREATE TABLE IF NOT EXISTS `stock` (
		  `reference` varchar(18) NOT NULL,
		  `dispo_im` int(11) NOT NULL,
		  `dispo_etc` int(11) NOT NULL,
		  `dispo` int(11) NOT NULL)') ; 
 
// Téléchargement du fichier depuis le FTP du fournisseur 1 ---------------------------------------------------------------------
 
		$source = "/fusion/FR/avail/stockim.ZIP";
		$target = fopen("stockim.ZIP", "w");
		$conn = ftp_connect("ftp1") or die("Could not connect");
 
		ftp_login($conn,"user","pass");
		ftp_fget($conn,$target,$source,FTP_BINARY);
		$zip = new ZipArchive;
		if ($zip->open('stockim.ZIP') === TRUE) {
			$zip->extractTo('./');
			$zip->close();
			} else {
			exit;
			}
 
// Téléchargement du fichier depuis le FTP du fournisseur 2 ---------------------------------------------------------------------
 
		$source1 = "/stocksETC.txt";
		$target1 = fopen("stocksETC.txt", "w");
		$conn1 = ftp_connect("ftp2") or die("Could not connect");
 
		ftp_login($conn1,"user","pass");
		ftp_fget($conn1,$target1,$source1,FTP_BINARY,0);
 
// Vérification du fichier 1 ---------------------------------------------------------------------------------------------------
 
		$csvfile = "stockim.TXT";
		if(!file_exists($csvfile)) {
			exit;
		}
 
		$file = fopen($csvfile,"r");
		if(!$file) {
			exit;
		}
 
		$size = filesize($csvfile);
		if(!$size) {
			exit;
		}
 
		fclose($file);
 
// Vérification du fichier 2 --------------------------------------------------------------------------------------------------
 
 
		$csvfile1 = "stocksETC.txt";
		if(!file_exists($csvfile1)) {
			exit;
		}
 
		$file1 = fopen($csvfile1,"r");
		if(!$file1) {
			exit;
		}
 
		$size1 = filesize($csvfile1);
		if(!$size1) {
			exit;
		}
 
		fclose($file1);
 
 
// Import du 1er fichier dans la table stock_im ----------------------------------------------------------------------------------
 
		$bdd->exec("LOAD DATA LOCAL INFILE 'stockim.TXT' INTO TABLE stock_im FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\r\n'");
 
// Import du 2eme fichier dans la table stock_etc --------------------------------------------------------------------------------
 
		$bdd->exec("LOAD DATA LOCAL INFILE 'stocksETC.txt' INTO TABLE stock_etc FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\r\n'");
 
// Rendre le champs "reference" de la table stock unique -------------------------------------------------------------------------
 
		$bdd->exec('ALTER IGNORE TABLE stock ADD  UNIQUE INDEX(reference);');
 
// Lecture et insertion des valeurs reference_im et dispo_im depuis la table stock_im dans stock ------------------------------------
 
		$stock_im = $bdd->query('SELECT * FROM stock_im');
		while ($s_im = $stock_im->fetch())
			{
				$req_im = $bdd->prepare('INSERT INTO stock(reference,dispo_im) VALUES(:reference,:dispo_im)');
				$req_im->execute(array('reference' => $s_im['reference_im'],
									'dispo_im' => $s_im['dispo_im']));
			}
 
// Lecture et insertion des valeurs reference_etc et dispo_etc depuis la table stock_etc dans stock avec mise à jour ----------------
 
		$stock_etc = $bdd->query('SELECT * FROM stock_etc');
		while ($s_etc = $stock_etc->fetch())
			{
				$req_etc = $bdd->prepare('INSERT INTO stock(reference,dispo_etc) VALUES(:reference,:dispo_etc) ON DUPLICATE KEY UPDATE dispo_etc = :dispo_etc');
				$req_etc->execute(array('reference' => $s_etc['reference_etc'],
									'dispo_etc' => $s_etc['dispo_etc']));
			}
// Addition des stocks des deux fournisseurs ----------------------------------------------------------------------------------------
 
		$bdd->exec("UPDATE stock SET dispo = dispo_im + dispo_etc");
 
// Synchronisation du stock de la boutique avec celui des fournisseurs --------------------------------------------------------------
 
		$bdd->exec('UPDATE product,stock SET product.quantity = stock.dispo WHERE product.reference = stock.reference');
 
//---------------------------------------------------------------------------------------------	
 
 
		$stock_im->closeCursor();
		$stock_etc->closeCursor(); 
 
}
catch (Exception $e)
{
        die('Erreur : ' . $e->getMessage());
}
 
 
 
?>

Ma question est, d'après vous est ce qu'il y a un moyen d'optimiser le code afin de réduire le temps d’exécution et la RAM nécessaire surtout pour les deux boucles WHILE?

Merci d'avance
Abou Ilyass est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2012, 11h49   #2
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
Bonjour,

Quelques optimisations :
- remplaces les DROP TABLE / CREATE par TRUNCATE, regardes ici
- déportes les traitements SELECT * FROM stock_im/stock_etc -> INSERT INTO... dans une procédure stockée

Sinon c'est bien d'avoir pensé à utiliser LOAD DATA INFILE
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2012, 12h00   #3
Invité de passage
 
Inscription : janvier 2012
Messages : 5
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 5
Points : 2
Points : 2
Citation:
Envoyé par rawsrc Voir le message
Bonjour,

Quelques optimisations :
- remplaces les DROP TABLE / CREATE par TRUNCATE, regardes ici
- déportes les traitements SELECT * FROM stock_im/stock_etc -> INSERT INTO... dans une procédure stockée

Sinon c'est bien d'avoir pensé à utiliser LOAD DATA INFILE

Bonjour rawsrc,

Merci de votre réponse, pour votre 2eme suggestion "déportes les traitements SELECT * FROM stock_im/stock_etc -> INSERT INTO... dans une procédure stockée" cela veut dire quoi exactement? excusez moi je très débutant en PHP&MySQL.


Merci beaucoup
Abou Ilyass est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2012, 12h24   #4
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
Les procédures stockées sont "l'équivalent" de tes fonctions PHP, sauf qu'elles sont stockées, compilées et exécutées par le serveur de base de données.
Tu manipules ainsi tes données directement sur le serveur sans passer par la couche PHP. Le gain de performance est généralement colossal. Cela est tout à fait approprié dans les cas d'import de données. Regardes ici
Après tu vas trouver des tas de tutos sur le net comme ici-même.
Bon courage.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2012, 13h56   #5
Membre expérimenté
 
Avatar de redoran
 
Homme
Developpeur- Amateur
Inscription : juin 2010
Messages : 981
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 40
Localisation : Algérie

Informations professionnelles :
Activité : Developpeur- Amateur
Secteur : Santé

Informations forums :
Inscription : juin 2010
Messages : 981
Points : 572
Points : 572
Envoyer un message via Skype™ à redoran
Salam ; avec google sa donne ça
http://dev.mysql.com/doc/refman/5.0/...rocedures.html
redoran est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2012, 08h37   #6
Expert Confirmé
 
Avatar de grunk
 
Homme Olivier
Développeur Web
Inscription : août 2003
Messages : 1 837
Détails du profil
Informations personnelles :
Nom : Homme Olivier
Âge : 27
Localisation : France, Côte d'Or (Bourgogne)

Informations professionnelles :
Activité : Développeur Web
Secteur : Industrie

Informations forums :
Inscription : août 2003
Messages : 1 837
Points : 3 318
Points : 3 318
Pourquoi dans tes while reprépare tu la requête avant de l'executer ? C'est le principe des requêtes préparées de n'être préparées qu'une fois pour plusieurs utilisations :

Code :
1
2
3
4
5
6
7
8
$req_im = $bdd->prepare('INSERT INTO stock(reference,dispo_im) VALUES(:reference,:dispo_im)');
while ($s_im = $stock_im->fetch())
{
    $req_im->execute(array(
        'reference' => $s_im['reference_im'],
	'dispo_im' => $s_im['dispo_im'])
    );
}
grunk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2012, 09h37   #7
Modérateur
 
Inscription : septembre 2010
Messages : 7 219
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 219
Points : 8 598
Points : 8 598
Code :
while ($s_im = $stock_im->fetch())
Code :
foreach ($stock_im as $s_im)
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/01/2012, 22h12   #8
Invité de passage
 
Inscription : janvier 2012
Messages : 5
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 5
Points : 2
Points : 2
Merci bouceaup
Abou Ilyass est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h35.


 
 
 
 
Partenaires

Hébergement Web