yvanb Posted December 30, 2012 Share Posted December 30, 2012 (edited) Bonjour à tous, je suis en train de développer un petit script qui me permet de mettre à jour mon stock d’après celui de mon grossiste, comme je suis en Dropshipping, cela m'arrange pas mal.... Mon script fonctionne correctement, cela doit être coder comme un cochon, certes, je débute, mais il fonctionne.... enfin presque, car je bute sur un truc.... Le timeout de php ! Voici mon code : <?php include("config.php"); $sql = "TRUNCATE TABLE ps_stock_maj "; mysql_query($sql); $sq = "TRUNCATE TABLE ps_stock_ref "; mysql_query($sq); $fp = fopen("mon.csv", "r"); while ($data = fgetcsv($fp, 1, ";")) { $insert = "insert into ps_stock_maj (reference, quantity) values ('$data[1]','$data[3]')"; $insertresults = mysql_query($insert) or die(mysql_error()); } fclose ($fp); $query = "SELECT * FROM ps_product_attribute AS a LEFT JOIN ps_stock_available AS b ON a.id_product_attribute = b.id_product_attribute"; $result = mysql_query($query) or die(mysql_error()); while($row = mysql_fetch_array($result)){ $inser = "insert into ps_stock_ref (id_product_attribute, reference, quantity) values ($row[id_product_attribute], '$row[reference]','$row[quantity]')"; $insertresults = mysql_query($inser) or die(mysql_error()); } $requete=mysql_query("SELECT * FROM ps_stock_ref AS a LEFT JOIN ps_stock_maj AS b ON a.reference = b.reference"); $nombrelignes = mysql_numrows($requete); for ($i=0;$i<$nombrelignes;$i++) { $id_product_attribute = mysql_result($requete,$i,"id_product_attribute"); $reference = mysql_result($requete,$i,"b.reference"); $quantity = mysql_result($requete,$i,"b.quantity"); $inser = "UPDATE ps_stock_available SET quantity = '$quantity' WHERE id_product_attribute = '$id_product_attribute' "; $insertresults = mysql_query($inser) or die(mysql_error()); } mysql_close(); ?> Suite à ce problème de timeout, j'ai essayé de mettre un sleep : while ($data = fgetcsv($fp, 1, ";")) { sleep(2); $insert = "insert into ps_stock_maj (reference, quantity) values ('$data[1]','$data[3]')"; $insertresults = mysql_query($insert) or die(mysql_error()); } fclose ($fp); Mais petit bug, il sleep tellement bien qu'il redémarre pas la boucle (pour continuer l'import), ou cela change rien et j'ai toujours le timeout... Sachant que le fichier fait 1.07 Mo et qu'il y à 11868 lignes à importer... Pour infos, ce script récupère le contenu du fichier .csv, l'importe dans une table temporaire, fait la même choses pour les déclinaisons en récupérant la réf et la quantité, il compare les deux, puis, si la réf existe, modifie les quantités directement dans la table ps_stock_available, et donc, cela me met à jour mes quantité. Je dois faire la même choses pour les produits qui n'on pas de déclinaisons, pas très compliqué à faire. Si une âme charitable passe par là, je voudrais bien un peu d'aide pour cette histoire de pause et reprise de la boucle. Merci à tous Edited December 31, 2012 by yvanb (see edit history) Link to comment Share on other sites More sharing options...
Broceliande Posted December 30, 2012 Share Posted December 30, 2012 Bonjour à tous, je suis en train de développer un petit script qui me permet de mettre à jour mon stock d’après celui de mon grossiste, comme je suis en Dropshipping, cela m'arrange pas mal.... Mon script fonctionne correctement, cela doit être coder comme un cochon, certes, je débute, mais il fonctionne.... enfin presque, car je bute sur un truc.... Le timeout de php ! Voici mon code : <?php include("config.php"); $sql = "TRUNCATE TABLE ps_stock_maj "; mysql_query($sql); $sq = "TRUNCATE TABLE ps_stock_ref "; mysql_query($sq); $fp = fopen("mon.csv", "r"); while ($data = fgetcsv($fp, 1, ";")) { $insert = "insert into ps_stock_maj (reference, quantity) values ('$data[1]','$data[3]')"; $insertresults = mysql_query($insert) or die(mysql_error()); } fclose ($fp); $query = "SELECT * FROM ps_product_attribute AS a LEFT JOIN ps_stock_available AS b ON a.id_product_attribute = b.id_product_attribute"; $result = mysql_query($query) or die(mysql_error()); while($row = mysql_fetch_array($result)){ $inser = "insert into ps_stock_ref (id_product_attribute, reference, quantity) values ($row[id_product_attribute], '$row[reference]','$row[quantity]')"; $insertresults = mysql_query($inser) or die(mysql_error()); } $requete=mysql_query("SELECT * FROM ps_stock_ref AS a LEFT JOIN ps_stock_maj AS b ON a.reference = b.reference"); $nombrelignes = mysql_numrows($requete); for ($i=0;$i<$nombrelignes;$i++) { $id_product_attribute = mysql_result($requete,$i,"id_product_attribute"); $reference = mysql_result($requete,$i,"b.reference"); $quantity = mysql_result($requete,$i,"b.quantity"); $inser = "UPDATE ps_stock_available SET quantity = '$quantity' WHERE id_product_attribute = '$id_product_attribute' "; $insertresults = mysql_query($inser) or die(mysql_error()); } mysql_close(); ?> Suite à ce problème de timeout, j'ai essayé de mettre un sleep : while ($data = fgetcsv($fp, 1, ";")) { sleep(2); $insert = "insert into ps_stock_maj (reference, quantity) values ('$data[1]','$data[3]')"; $insertresults = mysql_query($insert) or die(mysql_error()); } fclose ($fp); Mais petit bug, il sleep tellement bien qu'il redémarre pas la boucle (pour continuer l'import), ou cela change rien et j'ai toujours le timeout... Sachant que le fichier fait 1.07 Mo et qu'il y à 11868 lignes à importer... Pour infos, ce script récupère le contenu du fichier .csv, l'importe dans une table temporaire, fait la même choses pour les déclinaisons en récupérant la réf et la quantité, il compare les deux, puis, si la réf existe, modifie les quantités directement dans la table ps_stock_available, et donc, cela me met à jour mes quantité. Je dois faire la même choses pour les produits qui n'on pas de déclinaisons, pas très compliqué à faire. Si une âme charitable passe par là, je voudrais bien un peu d'aide pour cette histoire de pause et reprise de la boucle. Merci à tous Salut, Je réponds vraiment à la louche et sans être entré dans les détails de ton post car je suis en congés et je ne fais que passer Mais à la louche donc pour outrepasser le max_execution_time de php rien ne vaut un bon script ajax. En gros à chaque appel depuis un script js , tu transmet un n° de départ et un nb d'enregistrements à traiter (lignes dans ton cas). Le php récupère ça en get et traite xx lignes à la fois. Il retourne le numéro de la prochaine ligne par ex et ton js peut boucler... Link to comment Share on other sites More sharing options...
yvanb Posted December 31, 2012 Author Share Posted December 31, 2012 Salut, et oui effectivement c'est une solution pas bête du tout, mais finalement j'ai fini par trouvé, il me manquais juste ceci dans ma boucle set_time_limit(10); Du coup, php fait une "micro" pause toutes les 10s se qui "réinitialise" le timeout de 30s (par défaut) de php. Comme php ne compte pas le nombre de requête durant le calcul du timeout, cela est considéré comme une nouvelle requête toutes les 10s. Merci pour ton aide Me reste plus qu'à mettre une progress bar pour connaitre l'avancement Link to comment Share on other sites More sharing options...
rachel01 Posted December 8, 2014 Share Posted December 8, 2014 Salut, et oui effectivement c'est une solution pas bête du tout, mais finalement j'ai fini par trouvé, il me manquais juste ceci dans ma boucle set_time_limit(10); Du coup, php fait une "micro" pause toutes les 10s se qui "réinitialise" le timeout de 30s (par défaut) de php. Comme php ne compte pas le nombre de requête durant le calcul du timeout, cela est considéré comme une nouvelle requête toutes les 10s. Merci pour ton aide Me reste plus qu'à mettre une progress bar pour connaitre l'avancement Bonjour Est-ce que ton code marche pour une version 1.6? Merci d'avance Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now