pbm de temps d'execution pour un geocodage de masse V3

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : pbm de temps d'execution pour un geocodage de masse V3

Re: pbm de temps d'execution pour un geocodage de masse V3

par HnO » 28 août 2013, 08:36

merci @moogli pour ta réponse. Je vais modifier tous ça et je vous ferais part de mes avancées. :wink:

Re: pbm de temps d'execution pour un geocodage de masse V3

par moogli » 27 août 2013, 21:14

le web n'est pas fait pour du traitement lourd ainsi (a moins que le serveur ne soit configuré pour).

Essai avec un fichier csv, sans charger le reste du excel tu gagnera peut être en traitement.

Le but c'est d'ajouter les coordonnées GPS dans le fichier ?
Tu ne peux te connecter à la base directement je suppose ?

Avec du csv je dirais :
- file pour avoir une ligne dans une ligne de tableau (une "case" par ligne)
- str_getcsv pour "parser" la chose
- foreach pour parcourir le tableau du premier point


l’algorithme en pseudo code
charger le fichier dans un tableau
creer une variable tempo du fichier final
pour chaque ligne du tableau
récupérer sous forme de tableau la ligne csv courante
récupérer les coordonées gps
Ajouter les coordonnées au tableau courant
Ajouter la ligne sous forme csv à la variable tampon (implode et la constante php PHP_EOL pour la fin de ligne)
fin pour chaque
Mettre le contenu de la variable tampon dasn le fichier de sortie

Dans le cas d'une progression à afficher il est possible d'utiliser un fichier qui va contenir l'avancement.
Ce n'est pas très performant mais c'est une solution.
Tu peux aussi utiliser la solution des websocket qui éviterait cela.
a priori pas mal d'exemple ici http://www.developpez.net/forums/d13001 ... rveur-php/

l’algorithme en pseudo code
charger le fichier dans un tableau
creer une variable tempo du fichier final
compter le nombre de ligne du tableau et le mettre dans une variable
pour chaque ligne du tableau (prendre l'index du tableau et la valeur
créer un tableau avec un index "total" qui va contenir le nombre total de ligne et un index "current" qui va contenir le numéro d'index courant + 1
insérer dans un fichier, sous forme JSON, le tableau créer au dessus (file_put_contents et json_encode)
récupérer sous forme de tableau la ligne csv courante
récupérer les coordonées gps
Ajouter les coordonnées au tableau courant
Ajouter la ligne sous forme csv à la variable tampon (implode et la constante php PHP_EOL pour la fin de ligne)
fin pour chaque
Mettre le contenu de la variable tampon dasn le fichier de sortie


pour la partie ajax, tu peux t'aider de JQuery, c'est relativement simple.
tu appel un fichier php qui se contente de retourner le contenu du fichier alimenté dans la boucle.
en gros
<?php
echo file_get_contents('le fichier qui contient le tableau JSON');
?>
Je script JS alimente une jauge à partir d'un simple calcule de pourcentage (avec html 5 tu peux utiliser le tag html progress).

et la le tour est joué.

ah oui à l'affichage de la page tu utilise exec pour lancer le script php qui mouline le reste ;) (lit bien la doc pour ne pas attendre la fin du script).

C'est bien sur des idées, mais il faut bien penser que le web n'est pas vraiment prévu pour attendre des traitements super long :)
Attention aussi aux coûts en mémoire des fichiers chargé, peuvent être gênant ;)


@+

Re: pbm de temps d'execution pour un geocodage de masse V3

par HnO » 27 août 2013, 15:31

bon j'ai refait le test avec un fichier beaucoup, beaucoup plus court (30 lignes pour tester). Le script fonctionne. J'ai essayé de lancer le plus de lignes possible et ça bloque lorsque le fichier contient plus de 45 lignes. Etant donné que le fichier original compte plus de 8700 lignes aujourd'hui, et qu'il se met à jour à peu près tous les mois, je me demande si le fait de rajouter un traitement pour tronquer le fichier d'origine ne rendera pas le traitement plus lourd?? des propositions?

Re: pbm de temps d'execution pour un geocodage de masse V3

par HnO » 27 août 2013, 11:33

@xTG : Sur mon serveur WAMP, il se trouve que je n'ai qu'une seule version de php (5.3.13) et c'est le php.ini général du serveur que j'ai modifié et le phpForApache.ini.
@moogli : "Task-force is back!" lol merci de me répondre moogli.
mon phpinfo() indique que le fichier de configuration chargé est celui de la vers. 5.3.13 : C:\wamp\bin\apache\apache2.2.22\bin\php.ini.
Pour le problème d'origine c'est excel excel ou tu peux avoir du csv ?
En ce qui concerne le problème d'origine, je peux egalement avoir du csv puisque c'est un export de BD à la base.
Est ce que tu dois forcément avoir un retour du traitement ?
Il doit forcément avoir un retour de traitement puisque je veux avoir, à partir de l'adresse client formatée, les coordonnées GPS (latitude, longitude). Ces coordonnées, une fois récupérés, les enregistrer dans ce même fichier.
Tu peux aussi imaginer que le script compte le nombre de ligne et fournit une indication d'avancée (par exemple dans un fichier tu met le pourcentage d'avancement et côté front une requête Ajax qui lit le contenu du fichier et affiche une jauge de progression ;) ).
comme je le disait @erraprod_ufm quelques posts plus haut, j'ai pensé à cette solution mais étant donné que je ne maitrise pas assez l'ajax, je ne sais pas exactement comment m'y prendre. J'ai quant même regardé quelques tutos mais en vain, ça ne rentre pas... :/

Re: pbm de temps d'execution pour un geocodage de masse V3

par xTG » 27 août 2013, 10:42

Dans WAMP tu as une foule de php.ini
Tu en as une par dossier de version de PHP et un normalement global au serveur exécuté.
Ce dernier est écrasé par celui de la version PHP mais seulement sur changement de version.
Donc trouves le général. ;)

Re: pbm de temps d'execution pour un geocodage de masse V3

par moogli » 27 août 2013, 10:27

Salut,

Plusieurs php.ini c'est possible, rien qu'avec la possibilité d'avoir un php.ini par répertoire :)

Ensuite tu peux voir l'emplacement du fichier chargé dans un phpinfo ;)

Pour le problème d'origine c'est excel excel ou tu peux avoir du csv ?

Est ce que tu dois forcément avoir un retour du traitement ?
Sinon tu lance en batch avec un time out illimité.
Tu peux aussi imaginer que le script compte le nombre de ligne et fournit une indication d'avancée (par exemple dans un fichier tu met le pourcentage d'avancement et côté front une requête Ajax qui lit le contenu du fichier et affiche une jauge de progression ;) ).

@+

Re: pbm de temps d'execution pour un geocodage de masse V3

par HnO » 27 août 2013, 09:32

Code : Tout sélectionner

Dans ce cas c'est que tu as modifié le mauvais php.ini car le message est on ne peut plus clair sur la configuration actuellement exécutée. :)
j'aurais deux fichier php.ini (comme quoi on en append tous les jours)?? Alors est ce que tu pourrais m'éclairer s'il te plait xTG, parce que moi, j'ai modifier le fichier 'php.ini' se trouvant dans le serveur à "C:\wamp\bin\php\php5.3.13\php.ini" et je n'en voit pas d'autre. Désolé, je fait un peu le boulet mais il y a des choses qui m'échappent et je voudrait comprendre (a ce qu'il parrait, on apprend de ses erreurs...)

Re: pbm de temps d'execution pour un geocodage de masse V3

par xTG » 27 août 2013, 09:02

j'ai redémarré le serveur mais après plusieurs 'refresh' il m'affiche une autre erreur avec la classe writer de PHPExcel :
Dans ce cas c'est que tu as modifié le mauvais php.ini car le message est on ne peut plus clair sur la configuration actuellement exécutée. :)

Re: pbm de temps d'execution pour un geocodage de masse V3

par HnO » 27 août 2013, 08:40

Vu le message je dirai que la configuration que tu as changé n'a pas été appliquée. ;)
As-tu redémarré le serveur ?
j'ai redémarré le serveur mais après plusieurs 'refresh' il m'affiche une autre erreur avec la classe writer de PHPExcel :

Code : Tout sélectionner

( ! ) Fatal error: Maximum execution time of 30 seconds exceeded in C:\wamp\www\prj\Classes\PHPExcel\Cell.php on line 352 Call Stack # Time Memory Function Location 1 0.0051 391384 {main}( ) ..\getClients_cacheTest_soft90.php:0 2 29.7324 11445080 PHPExcel_Writer_Excel2007->save( ) ..\getClients_cacheTest_soft90.php:89 3 29.9264 11488232 PHPExcel_Writer_Excel2007_Worksheet->writeWorksheet( ) ..\Excel2007.php:253 4 29.9279 11488480 PHPExcel_Writer_Excel2007_Worksheet->_writeSheetData( ) ..\Worksheet.php:83 5 30.0073 11591416 PHPExcel_Writer_Excel2007_Worksheet->_writeCell( ) ..\Worksheet.php:1025 6 30.0074 11591416 PHPExcel_Cell->getDataType( ) ..\Worksheet.php:1067
c'est l'écriture du fichier qui met trop de temps à présent. J'ai déjà eu cette erreur mais je n'arrive pas ou plutôt je n'ose pas modifier le code afin d'éviter de plus grosses...
J'ai rencontré le même probleme il y a quelques mois avec une fonction qui devait exporter des milliers de clients.
J'ai pu ruser en mettant de l'ajax dans la page et en découpant le traitement en tranches de 100. Tu même implémenter une progressbar en temps réel pour suivre l'évolution du processus. La grande classe
L'ajax j'y ai pensé, fait quelques recherches dessus et essayé de l'implémenter mais je crois qu'il me faut encore un peu de temps pour maitriser. A vrai dire, je ne sait pas exactement, dans le cadre de ce projet si il faut faire passer l'appel du webservice ou bien le traitement dans la fonction ajax??

Re: pbm de temps d'execution pour un geocodage de masse V3

par erraprod_ufm » 26 août 2013, 21:22

J'ai rencontré le même probleme il y a quelques mois avec une fonction qui devait exporter des milliers de clients.
J'ai pu ruser en mettant de l'ajax dans la page et en découpant le traitement en tranches de 100. Tu même implémenter une progressbar en temps réel pour suivre l'évolution du processus. La grande classe

Re: pbm de temps d'execution pour un geocodage de masse V3

par xTG » 26 août 2013, 20:03

Vu le message je dirai que la configuration que tu as changé n'a pas été appliquée. ;)
As-tu redémarré le serveur ?

Re: pbm de temps d'execution pour un geocodage de masse V3

par HnO » 26 août 2013, 19:15

RE! bon ben après test, j'ai toujours le même souci.
voilà mon message d'erreur :

Code : Tout sélectionner

( ! ) Fatal error: Maximum execution time of 30 seconds exceeded in C:\wamp\www\prj\getClients_cacheTest_soft90.php on line 22 Call Stack # Time Memory Function Location 1 0.0044 391144 {main}( ) ..\getClients_cacheTest_soft90.php:0 2 29.9751 13421816 lookup( ) ..\getClients_cacheTest_soft90.php:72
je précise que max_execution_time dans le php.ini est à 60s. le timeout du navigateur est 240s. j'ai l'impression que c'est l'appel au webservice google et le traitement effectué dans la function lookup qui met le plus de temps mais je ne sais pas comment rendre cette fonction plus rapide en exécution

Re: pbm de temps d'execution pour un geocodage de masse V3

par HnO » 26 août 2013, 17:30

salut, merci de me répondre.
Pour le navigateur, il est vrai que je n'y ai pas pensé. Je partait du principe que l'appel du webservice n'avait pas besoin que je touche à la config du navigateur. Je test ça et je re.

Re: pbm de temps d'execution pour un geocodage de masse V3

par xTG » 26 août 2013, 17:17

Et le timeout de ton navigateur tu l'as configuré ?

pbm de temps d'execution pour un geocodage de masse V3

par HnO » 26 août 2013, 17:12

Hi everyone!
Je viens vers vous car j'ai un os qui me barre la route depuis quelques semaines déjà et je n'arrive pas à m'en sortir. Je vous expose le problème : au boulot, on me demande à partir d'un listing d'adresses de clients (au format excel .xlsx ou .csv) de générer les coordonnés de géocodage de chaque adresse qui serait enregistré dans ce fichier. Après quelques recherches, je décide d'utiliser la superbe classe PHPExcel de codeplex pour manipuler le fichier et avec l'APV V3 de Google Map pour accéder au webservice de géocodage. Sauf que le fichier en question dispose actuellement de + de 8700 lignes!!! et je suis confronté a la limite d'execution du traitement (qui est par défaut de 30 seconde). Alors je vous voir venir en me proposant de modifier ce temps d'execution. Ce que j'ai déjà testé mais qui ne change à rien. J'ai également pensé à passé par un système de cache mais qui ne résout pas le problème également. Je vous présente mon code :
<?php
	$address = "";

		//-- on charge la classe PHPExcel --
	require_once'Classes/PHPExcel.php';
	require_once 'Classes/PHPExcel/Writer/Excel2007.php';

	$inputFileName = 'sources/Clients_soft90.xlsx';

	$objPHPExcel = PHPExcel_IOFactory::load($inputFileName);
	$objWorkSheet = $objPHPExcel ->getActiveSheet();

	/******	Fonction de geocodage en utilisant le Webservice geocode API *********/
	function lookup($string)
	{
            $string = str_replace (" ", "%20", urlencode($string));
            $details_url = "http://maps.googleapis.com/maps/api/geocode/json?address=".$string."&sensor=false";

           $ch = curl_init();
           curl_setopt($ch, CURLOPT_URL, $details_url);
           curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
           $response = json_decode(curl_exec($ch), true);
         
           // If Status Code is ZERO_RESULTS, OVER_QUERY_LIMIT, REQUEST_DENIED or INVALID_REQUEST
           if ($response['status'] != 'OK') {
            return  'ERREUR : '.$response['status'];
           }
         
           print_r($response);
           $geometry = $response['results'][0]['geometry'];
         
            $longitude = $geometry['location']['lng'];
            $latitude = $geometry['location']['lat'];
         
            $array = array(
                'latitude' => $geometry['location']['lat'],
                'longitude' => $geometry['location']['lng'],
                //'location_type' => $geometry['location_type'],
            );

            //sleep(1); //-- temporisation -- 

            /*echo "la latitude : ".var_dump($latitude); //-- DUMP!! --
            echo "la longitude : ".var_dump($longitude); //-- DUMP!! --
            echo "le type de localisation : \t".var_dump($array['location_type']);*/ //-- DUMP!! --
            
            
            return $array;
	}


	$row = 0;

	$handle = fopen("sources/Clients_soft90.csv", 'r'); //-- commande d'ouverture du fichier en mode lecture --

	$cache = 'cache/tmp.html';
	$expire = time() -3600;
	$content_file = "";

	$start = microtime(true);

	ob_start();

	while (($data = fgetcsv($handle, 1000, ';')) !== FALSE) {
		$num = count($data);

		$row++;


			$address = $data[1].' '.$data[2].' '.$data[3];

			$tabPhp = lookup($address); //-- geocodage de l'adresse et retourne un tableau --

			
			$content_file .= "<div id=tab".$row."><br /><br />";
			$content_file .= "- ".$row." : ".$address."<br />";
			$content_file .= "Coordon&eacute;es GPS : (".$tabPhp['latitude'].', '.$tabPhp['longitude'].")";
			$content_file .= "</div>";

			
		


		$objPHPExcel->getActiveSheet() ->setCellValue('F'.$row, $tabPhp['latitude'].' | '.$tabPhp['longitude']);

		$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
		$objWriter->save("rst\Clients_coords_90.xlsx");

		//echo var_dump($tabPhp);
		//echo "latitude et longitude enregistr&eacute; : ".var_dump($tabPhp['latitude'])."|".var_dump($tabPhp['longitude'])."\n";*/
		
	}
	fclose($handle);

	echo $content_file;
			

			$page = ob_get_contents();
			@ob_end_clean();
			file_put_contents($cache, $page);
			echo $page;

	$end = microtime(true); $laps = $end - $start;
	echo "Script execut&eacute; en : ".$laps." secondes.";		
?>
Ce qu'il faut savoir aussi c'est que j'ai testé tout ces applications qui permettent de faire du géocodage de masse mais ce sont toutes des anciennes version qui sont obsolète aujourd'hui.
En espérant que vous puissiez m'aider.