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é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é : ".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é 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.