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