Jump to content

Problème création image produit à partir d'un CSV


Recommended Posts

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

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

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

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 by csid (see edit history)
Link to comment
Share on other sites

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:02
Fin du script: 10:19:01
Script 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 produits

Alors 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 traitement
04/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

  • 4 months later...

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

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...