csid Posted March 28, 2014 Share Posted March 28, 2014 Bonjour, j'ai fait un script qui met à jour ma boutique PS 1.6.0.4 (en test pour l'instant j'upgraderai pour faire la boutique finale ) Ce script prend en entrée un fichier CSV de 16000 lignes pour plus de 6000 produits(plusieurs lignes par produit) Dans le traitement je récupère donc pour chaque article un tableau avec une url pour aller chercher chaque image chez mon fournisseur. La technique fonctionne au coup par coup ou avec quelques produits à la fois (3-4) Mais lorsque je lance le traitement sur tout le fichier CSV après avoir nettoyé(vidée) ma base au préalable, j'ai bizarrement des mélanges d'images. Voici les cas que j'ai : - les thumbs d'un produit sont bons mais l'image grand format est une autre (d'un autre produit) - les thumbs sont ceux d'un autre produit les grandes images correspondent aux thumbs - les thumbs sont ceux d'un autre produit les grandes images sont celle d'autres produits - le top du top : thumbs ok mais grande image = mélange de 2 autres images!!!!!!!!!!!! oui on parle bien d'un MELANGE !! (le haut est un produit puis une zone pixelisée puis un autre produit) J'utilise déjà ce script sur d'autres boutiques et, à part une fois, je n'ai jamais eu de problème. Je ne me suis donc pas formalisé pour cette fameuse fois. Sauf que là c'est toute ma base sauf les premiers produits qui est touchée. Je penche pour un pb lié à la rapidité d'execution, temps d'ecriture sur disque... des pb de timeout...? Aucune erreur affichée alors que j'ai activé l'affichage des erreurs dans mon script : error_reporting(E_ALL);ini_set("display_errors", 1); Les chemins et numéro d'images semblent correctement affectés au produits... Je n'ai rien trouvé comme info sur ce genre de pb. Voici mon code : pour chaque article je traite le tableau des urls d'images : //---- on est en insertion nouveau produit -> on ajoute l'image $type=true; // true = image cover for ($i=1; $i<=7; $i++){ if (trim($images[$i])!='' and $limage=file_get_contents($images[$i])){ ajouteImageProd($prod_id,$limage,$type); $type=false; //--false = image secondaire } } Ma fonction ajouteImageProd() : //---- ajoute une image à un produit function ajouteImageProd($id_prod,$limage,$cover=true){ //----chemin fichier temporaire $file='/chemin_vers_prestashop/img/tmp/tmp_import_prod.jpg'; if (!$idfic=fopen($file,"w+")){ echo ' <br>Erreur ajouteImageProd sur fopen '.$file.'<br>'; } if (!fputs($idfic,$limage)){ echo ' <br>Erreur ajouteImageProd sur fputs '.$file.'<br>'; } fclose($idfic); //-- création image dans prestashop $g = new Image(0); $g->id_product = $id_prod; $g->cover=$cover; $g->save(); //-- génère la structure image $g->createImgFolder(); $imgTypes = ImageType::getImagesTypes('products'); foreach($imgTypes as $value){ $ch=$g->id; $chaine=''; for($i=0;$i<strlen($ch);$i++){ $chaine.=$ch[$i].'/'; } ImageManager::resize($file, _PS_PROD_IMG_DIR_.$chaine.$g->id.'-'.$value['name'].'.jpg',$value['width'],$value['height']); } //---- copie l'image originale @copy($file, _PS_PROD_IMG_DIR_.$chaine.$g->id.'.jpg'); return true; } Si quelqu'un avait une idée pour que mes créations d'image soient bonnes ... (à part importer référence par référence ou par paquets de 4 ou 5) Merci! Link to comment Share on other sites More sharing options...
2FR3 Posted March 30, 2014 Share Posted March 30, 2014 Je dirai que c'est plutot l'arrivée et le traitement de creation des images qui est trop lent par rapport a la mise en base. Ca expliquerai p'tet le decalage et le melange Link to comment Share on other sites More sharing options...
csid Posted March 31, 2014 Author Share Posted March 31, 2014 Oui... c'est bien l'idée que j'en avais... Mais si c'est ça le problème que faire???????? est ce qu'un sleep ou usleep arrangerait...???? je vais tenter mais bonjour le temps d'exécution! si je regarde dans la base c'est bizarre. la plupart des articles sont ok c'est à dire que les numéro d'image se suivent et correspondent à un meme numéro de produit : prod_x => img y prod_x => img y+1 prod_x => img y+2 => OK mais de temps en temps j'ai : prod_x => img y prod_x => img y+1 prod_x => img y+3 <- -- prod_x+1 => img y+2 <- prod_x+1 => img y+4 Il y a inversion de deux numéro d'image Autre chose surprenante : sur CERTAINS produits dont les images sont mal affectées si je regarde dans la fiche la liste des images je vais en avoir 3 par exemple. Si je visualise la pleine page de la première j'ai une image différente! et l'imagette correspondant au produit dans la LISTE DES PRODUITS est cette meme image!!!!! Mais le plus surprenant c'est que dans le front office : le lien entre imagette et pleine page est ok. Seule l'affectation du numéro d'image au produit peut parfois poser pb Bref je m'arrache les cheveux à essayer de comprendre. J'espère que je ne suis pas en plus victime de mini bugs dans l'admin de la 1.6... Link to comment Share on other sites More sharing options...
csid Posted April 1, 2014 Author Share Posted April 1, 2014 Juste pour vous tenir au courant : j'avance pas... et apres avoir revu X fois l'algorithmie vérifié les noms de variables et autre bugs du genre "=" au lieu de "==" dans les if.... bref... toujours le même problème.... jusqu'à l'instant où je viens de m'apercevoir (après avoir TOUT réécrit from scratch) que mes tables PS sont en InnoDB au lieu de MyIsam habituellement.... de mémoire avec innodb ya des histoire de transactionnel et en particulier si mes souvenirs sont bons il n'écrit pas toujours dans la base pour accélérer les ecritures... Là je suis mort donc prochaines manips : - réinstalle de PS1.6 en MyIsam (au passage j'ai pas souvenir d'avoir eu le choix) - si pas mieux réinstalle de PS1.5 ... des fois que PS 1.6 soit bugé...... Suite au prochain épisode ...... Link to comment Share on other sites More sharing options...
csid Posted April 1, 2014 Author Share Posted April 1, 2014 (edited) Ca se confirme mais là je verrai vraiment ca demain : J'ai fait : -nettoyage de la base avec le module PS -vérifié par phpmysql que les tables ps_product, images, shop etc.. etaient bien vides - le repertoire /img/p a bien été vidé En traçant précisément ce qui se passe voici ce que j'ai vu : premier produit je fais un select pour savoir s'il existe : select * from ps_product where reference='2960'Selon qu'il existe ou pas je fais un update ou un insert et....... il passe dans l'update!!!!!!!!!!!!!! Ce qui est encore plus étonnant c'est que dans ce cas il n'est pas sensé créer les image et les traces le montrent bien!! aucun affichage de la création des images! le script n'y passe pas!!!!!! ou du moins uniquement pour quelques produits epars... !! et pour tant lorsque le script est terminé j'ai bien de nouveau tous les produits avec des images! Que le pb se pose sur la db ok mais les images!!???? elles étaient supprimé du disque (vérif par ftp) et sans passer dans la création elles sont de nouveau visibles... !! c'est à devenir fou!!! demain je vire tout! drop tables et réinstallation! Ca éliminera tout pb éventuel de cache aussi! Pour les sceptiques : je ne suis pas tombé de la dernière pluie et j'ai vérifié par de multiples moyens... le plus surprenant : - je supprime un produit dans l'admin prestashop - je vérifie par phpmyadmin qu'il est bien sucré - je fais via un script de 3 ligne un UPDATE where reference='lareferencesucrée' ....... LE PRODUIT EST DE NOUVEAU VISIBLE DANS PS !!!!!!!!!!!!!!!!!!!!!!! COMPLET !!!!!!! avec images etc...!!!!!!!! non! je n'ai plus de moquette chez moi! Edited April 1, 2014 by csid (see edit history) Link to comment Share on other sites More sharing options...
csid Posted April 4, 2014 Author Share Posted April 4, 2014 je deviens fou et j'avance pas...... Bref je vais laisser tomber car il se passe des choses complètement dingues avec ce script. qui n'ont plus rien à voir avec PS. Je trace de deux manières différentes : -affichage date et heure de début (echo) -ecriture dans un fichier en de multiples endroits stratégiques - Première anomalie : je lance le script dans mon navigateur à 9h25 il se termine à 10h19 (constat visuel heure affichée par mon PC) Le script m'affiche : Debut du script: 09:51:02Fin du script: 10:19:01Script execute en 1,679.178 sec Dans le fichier trace sur disque j'ai : 04/04/2014 09:24:54 Debut recup produits(correspond avec l'heure réelle de lancement mais pas celle affichée) - Deuxième anomalie : j'ai dans mon fichier trace deux fois la ligne de début de script!!!!!!!!!!! 04/04/2014 09:24:54 Debut recup produits... 04/04/2014 09:51:02 Debut recup produitsAlors que cette ligne est générée en tout début de script qu'une seule fois ! : <?php error_reporting(E_ALL); ini_set("display_errors", 1); set_time_limit(0); mb_internal_encoding("UTF-8"); // indique d'utiliser l'encodage UTF-8 //--------------------------------------------------------------------------- //----- init diverses $timedebut=microtime(true); $trace='N'; //-- affiche trace $log='O'; if ($log=='O'){ $idfic_log=fopen('/home/XXX/www/.../trace_recup_produits.log','a'); fwrite($idfic_log, '-----------------------------'."\r\n".date('d/m/Y H:i:s').' Debut recup produits'."\r\n"); } - Troisième anomalie : Dans mon fichier trace la ligne de fin y est deux fois à la fin alors qu'elle ne peut y être qu'une fois. 04/04/2014 10:19:01 ---- Fin du traitement04/04/2014 10:19:01 Init nouvelle ref :................traitement de cette ref 04/04/2014 10:19:01 ---- Fin du traitement alors que cette ligne de fin est la dernière chose faite par le script : //--- affichage du temps d'execution $timeend=microtime(true); $time=$timeend-$timedebut; $page_load_time = number_format($time, 3); echo "Debut du script: ".date("H:i:s", $timedebut); echo "<br>Fin du script: ".date("H:i:s", $timeend); echo "<br>Script execute en " . $page_load_time . " sec"; if ($log=='O'){ fwrite($idfic_log, date('d/m/Y H:i:s').' ---- Fin du traitement'."\r\n"); } ?> Et je pourrais continuer comme ca longtemps... par exemple le deuxième début n'est pas précédé par un "fin". J'ai pensé un moment que le script était exécuté deux fois (en partie à cause de l'heure de début affichée) mais non... Bref si qq1 peut m'expliquer comment un script PHP peut redémarrer à ses première ligne en plein milieu du traitement... et reprendre ou il en etait la lecture des produits... Ou alors... il rééxécute alléatoirement des instructions précédement déjà traitées... Je lâche l'affaire pour l'instant car j'ai vraiment d'autres choses à faire. Link to comment Share on other sites More sharing options...
buzionweb Posted August 10, 2014 Share Posted August 10, 2014 Salut, As tu réussi à venir à bout du problème ? J'ai le même besoin que toi et ton histoire me fait peur du coup... Link to comment Share on other sites More sharing options...
csid Posted August 11, 2014 Author Share Posted August 11, 2014 Oups! Je pensais avoir mis la solution... Je n'ai aucune explication au problème et encore moins aux traces très bizarres. Il faut lancer une réindexation des produits. Soit par l'admin dans le menu "Préférences"/"Recherche" et lancer une réindexation soit dans un script : Search::indexation(true); Et comme par miracle dans l'admin les images correspondent bien aux produits etc... J'ai viré toutes mes traces/logs dans le code pour éviter de m'auto stresser! Je passe le thread en résolu. Link to comment Share on other sites More sharing options...
buzionweb Posted August 11, 2014 Share Posted August 11, 2014 Merci pour ta réponse. Donc, quel est le script qui fonctionne finalement alors ? Tu dois appeler des fonctions prestashop particulière pour faire tourner ton script ? Link to comment Share on other sites More sharing options...
csid Posted August 11, 2014 Author Share Posted August 11, 2014 C'est un script maison qui lit le fichier CSV et traite les données qu'il lit pour générer les infos nécessaires à la création d'un produit. Ensuite selon que le produit existe déjà ou pas je l'ajoute ou je modifie seulement certaines infos. Etant donné que les traitements sont très spécifiques je ne peux pas mettre le script en entier mais grosso modo je fais moi même les opérations sur la base de données à part pour les images où j'utilise certaines fonctions de PS. Je ne peux te mettre ca en détail maintenant car je dois partir mais si ca t'intéresse je peux te faire une liste des trucs que je fais avec qq bouts de code. Ca pourrait aider en aider d'autres aussi. 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