Améliorer la rapidé d'une requete

Mammouth du PHP | 643 Messages

22 mai 2017, 15:41

Bonjour à toutes et à tous !
Voila j'ai un code qui fonctionne bien cependant ma page mais longtemps à s'affiché ( temps de réponse lent 4 à 5 sec)
Donc vous voyez le problème.

Voici ma requete elle me permet en gros d'affiché mes entrées selon ville, departement, région .... parmis environ 5000 résultats.
$sql = 'SELECT * FROM `loisirs` JOIN regions ON regions.region_id = loisirs.id_region WHERE loisirs.date_fin_sortie >= NOW() AND loisirs.valide = 1';
		if (!empty($_GET['region'])) {
			$sql .= ' AND regions.url = \''.$_GET['region'].'\'';
		}
		if (!empty($_GET['departement'])) {
			$sql .= ' AND loisirs.id_departements = '.$_GET['departement'];
		}
		if (!empty($_GET['loisir'])) {
			$sql .= ' AND loisirs.genre_loisir = \''.$_GET['loisir'].'\'';
		}
		
		if (!empty($_GET['ville'])) {
			$sql .= ' AND loisirs.city = \''. getRealValue($_GET['ville']). '\'';
		}
J'ai donc essayé de supprimer * est de remplacé uniquement par les champs demandé .... mais ça ne suffit pas.
Que puis je faire de mieux ?
PS : J'affiche 24 résultat à la fois

Merci à vous

EDIT:
Je ne pense pas que ça vient de ça mais voici ma pagination ( peut etre un peu barbare je l'avoue )
// Valeur de pagination
		if (empty($_GET['region']) && empty($_GET['loisir']) && empty($_GET['departement'])  && empty($_GET['ville'])){
		$valeur_paginate =  'sortie';
		}
		
		// Si il n y a que la région de demandée
		else if (!empty($_GET['region']) && empty($_GET['loisir']) && empty($_GET['departement'])  && empty($_GET['ville'])){
		$valeur_paginate =  'region-'.$_GET['region'];
		}
		
		// Si il y a une région de demandée et un loisir
		else if (!empty($_GET['region']) && !empty($_GET['loisir']) && empty($_GET['departement']) && empty($_GET['ville']))  {
		$valeur_paginate =  'region-'.$_GET['region'].'-loisir-'.$_GET['loisir'];
		}
		
		// Si il y a une région de demandée et un loisir
		else if (empty($_GET['region']) && !empty($_GET['loisir']) && empty($_GET['departement']) && empty($_GET['ville']))  {
		$valeur_paginate =  'type-'.$_GET['loisir'];
		}
		
		// Si il y a une région de demandée et un loisir
		else if (!empty($_GET['departement']) && empty($_GET['loisir']) && empty($_GET['ville'])) {
		$valeur_paginate =  'departement-'.$_GET['departement'];
		}
		
		// Si il y a une région de demandée et un loisir
		else if (!empty($_GET['departement']) && !empty($_GET['loisir']) && empty($_GET['ville'])) {
		$valeur_paginate = 'departement-'.$_GET['departement'].'-loisir-'.simplification($_GET['loisir']);
		}
		
		// Si il y a une région de demandée et un loisir
		else if (!empty($_GET['loisir']) && !empty($_GET['ville']) && empty($_GET['departement'])) {
		$valeur_paginate = 'sortir-'.simplification($_GET['ville']).'-loisir-'.$_GET['loisir'];
		}
		
		// Si il y a une région de demandée et un loisir
		else if (empty($_GET['region'])  && !empty($_GET['ville']) && empty($_GET['departement']) && empty($_GET['loisir'])) {
		$valeur_paginate = 'sortir-'.simplification($_GET['ville']);	
		}
		
		// Si il y a une région de demandée et un loisir
		else if (!empty($_GET['ville']) && !empty($_GET['loisir'])) {
		$valeur_paginate = 'sortir-'.simplification($_GET['ville']).'-loisir-'.simplification($_GET['loisir']);	
		}
		
		// Pagination
		$parPage = 12;
  		$page = !empty($_GET['page']) ? $_GET['page'] : 1;
		$nbre_annonces_par_page = 12;
		$nbre_pages_max_gauche_et_droite = 3;
		$last_page = ceil($nb / $nbre_annonces_par_page);
		if(isset($_GET['page']) && is_numeric($_GET['page'])){
		$page_num = $_GET['page'];
		} else {
		$page_num = 1;
		}
		if($page_num < 1){
		$page_num = 1;
		} else if($page_num > $last_page) {
		$page_num = $last_page;
		}
		$limit = 'LIMIT '.($page_num - 1) * $nbre_annonces_par_page. ',' . $nbre_annonces_par_page;
		$pagination = '';
		if($last_page != 1){
		if($page_num > 1){
		$previous = $page_num - 1;
		$pagination .= '<li><a href="'.$valeur_paginate.($previous > 1 ? '-page-'.$previous : null).'.html">Prec</a></li> &nbsp; &nbsp;';
		for($i = $page_num - $nbre_pages_max_gauche_et_droite; $i < $page_num; $i++){
		if($i > 0){
		$pagination .= '<li><a href="'.$valeur_paginate.($i > 1 ? '-page-'.$i : null).'.html">'.$i.'</a></li> &nbsp;';
		}
		}
		}
		$pagination .= '<li class="page-active">'.$page_num.'</li>&nbsp;';
		for($i = $page_num+1; $i <= $last_page; $i++){	
		$pagination .= '<li><a href="'.$valeur_paginate.'-page-'.$i.'.html">'.$i.'</a></li> ';
		if($i >= $page_num + $nbre_pages_max_gauche_et_droite){
		break;
		}
		}
		if($page_num != $last_page){
		$next = $page_num + 1;
		$pagination .= '<li><a href="'.$valeur_paginate.'-page-'.$next.'.html">Suiv</a><li> ';
		}
		}

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

22 mai 2017, 18:54

Bonjour,
Teste ta requête dans phpmyadmin et regarde combien de temps elle mets à être exécutée pour savoir si tu dois optimiser ton code PHP ou ta table/requête SQL.
Quand tout le reste a échoué, lisez le mode d'emploi...

Mammouth du PHP | 643 Messages

22 mai 2017, 19:30

Donc voilà le retour:

Affichage des lignes 0 - 11 (total de 12, Traitement en 0.0044 sec) [date_debut_sortie: 2017-06-23 00:00:00 - 2017-12-01 00:00:00]

Ca l'air d'etre correct mais en testant la page dans https://developers.google.com/speed/pag ... noble.html

Réponse lente server 2.5 sec.

Ps : tester avec l'affichage d'une seule entrée, Réponse lente 0.5sec.

Mammouth du PHP | 2703 Messages

22 mai 2017, 20:14

la lenteur dépend du nombre de sorties, donc ce ne doit pas être cette requête qui pose problème mais la suite du traitement.

Mammouth du PHP | 643 Messages

22 mai 2017, 20:34

Ca serait donc une mauvaise construction du code plutot que la requete elle même
Le total de sorties est de 5000 actuellement

Je fait donc une boucle comme vous vous en doutez pour afficher le tout.
Je pense que mon code est simple mais vu que je l'ai fait moi même forcément c'est plus clair pour moi que pour vous

Le problème vient de ce code la selon vous ?
	while($ligne = $req->fetch(PDO::FETCH_ASSOC)){  
	
	$date_event = $ligne['date_debut_sortie'];
	$date = DateTime::createFromFormat('Y-m-d H:i:s', $ligne['date_debut_sortie']);

	
	$image = !empty($ligne['photo']) && file_exists('annonce/img-big-format/miniature/'.$ligne['photo']) ? '../annonce/img-big-format/miniature/'.$ligne['photo'] : '../annonce/remplacement/'.simplification($aLoisirs[$ligne['id_type_loisirs']]).'.jpg';



	
	
	$dated = DateTime::createFromFormat('Y-m-d H:i:s', $ligne['date_debut_sortie']);
	$datef = DateTime::createFromFormat('Y-m-d H:i:s', $ligne['date_fin_sortie']);
	$la_variable_qui_vas_bien = "";
	if($ligne['date_debut_sortie'] != "0000-00-00 00:00:00") {
	$la_variable_qui_vas_bien = $ligne['date_debut_sortie'] = ucfirst($jour[$dated->format('N')]).' '.$dated->format('d').' '.ucfirst($mois[$dated->format('n')]);
	} else {
	$la_variable_qui_vas_bien = "Jusqu'au " .ucfirst($jour[$datef->format('N')]).' '.$datef->format('d').' '.ucfirst($mois[$datef->format('n')]).' '.$datef->format('Y');
	}

	// Si il y a une heure de renseignée
	if (!empty($ligne['horaire'])){
		$heure = '- '.$ligne['horaire'];
	}else {$heure = NULL;}
	
	// Si il y a une salle de renseignée
	if (!empty($ligne['manufacturer']) && $ligne['manufacturer'] != $ligne['titre']){
	$salle_de_spectacle = '('.ucfirst($ligne['manufacturer']).')';
	}else { $salle_de_spectacle = NULL;}
	
	// Si il y a de ville de renseignée
	$info_event = '<i class="icon-location-6"></i> '.ucfirst(strtolower($aLoisirs[$ligne["id_type_loisirs"]])).' - '.$salle_de_spectacle.' - <span itemprop="name">'.$ligne['city'].'</span> '.$ligne['postcode'];
	
	if (!empty ($ligne['tracker'])) {
		
	$url_inexistante = get_headers($ligne['photo'], 1);
	
	if (!empty($ligne['photo']) && $ligne['id_simply_user'] = '1000' && preg_match("#Not Found#i", $url_inexistante[0])) {
			$ligne['photo'] = 'http://tripday.fr/annonce/img-big-format/defaut.jpg';
			  }	
	
	echo '
	<div class="tr-post col-sm-3">
									<div class="entry-header">
										<div class="entry-thumbnail">
											<a href="../annonce/'.simplification($ligne["titre"]).'/'.$ligne["id_loisirs"].'.html"><img class="img-responsive post-img" src="'.$ligne['photo'].'" alt="'.ucfirst(strtolower($ligne['titre'])).'" title="'.strtolower($ligne['titre']).' - '.ucfirst(strtolower($ligne['city'])).'"></a>
										</div>
									</div>
									<div class="post-content">
                                        <h3 itemprop="name"><a href="../annonce/'.simplification($ligne["titre"]).'/'.$ligne["id_loisirs"].'.html" title="'.ucfirst(strtolower($ligne['titre'])).'-'.ucfirst(strtolower($ligne['city'])).'" itemprop="url">'.ucfirst($ligne['titre']).'</a></h3>
                                      <ul class="list-unstyled">
									  	<li>'.$la_variable_qui_vas_bien.' à '.str_replace(':', 'H',$ligne['horaire']).' </li>
										<li class="information">'.ucfirst(strtolower($ligne["manufacturer"])).' - '.ucfirst(strtolower($ligne["city"])).'</li>
									  </ul>
								  </div>
							  </div>';
		}else{
			
			echo'
			<div class="tr-post col-sm-3">
									<div class="entry-header">
										<div class="entry-thumbnail">
											<a href="../annonce/'.simplification($ligne["titre"]).'/'.$ligne["id_loisirs"].'.html"><img class="img-responsive post-img" src="'.$image.'" alt="'.ucfirst(strtolower($ligne['titre'])).'" title="'.strtolower($ligne['titre']).' - '.ucfirst(strtolower($ligne['city'])).'"></a>
										</div>
									</div>
									<div class="post-content">
                                        <h3 itemprop="name"><a href="../annonce/'.simplification($ligne["titre"]).'/'.$ligne["id_loisirs"].'.html" title="'.ucfirst(strtolower($ligne['titre'])).'-'.ucfirst(strtolower($ligne['city'])).'" itemprop="url">'. ucfirst(strtolower(cutTexte($ligne['titre'], 40, '...'))).'</a></h3>
									  <ul class="list-unstyled">
									  <li>'.$la_variable_qui_vas_bien.'</li>
									  </ul>
                                      <p>'. stripslashes(ucfirst(strtolower(cutTexte($ligne['description'], 60, '...')))).'</p>
								  </div>
							  </div>';
		}
	}
	
	// Si il y a plus de 12 résultat on affiche une pagination
	echo '
	<div class="col-md-12">
        <ul class="pagination">
				'.$pagination.'
				 </ul>
			</div>';
			$req->closeCursor();
	
	
		} else {
		// Si pas d'annonce
		echo  '<div class="pad15"><div class="alert alert-danger" role="alert"> <i class="fa fa-frown-o"></i>

		 Actuellement aucune sortie ne correspond à votre recherche</div></div>';
	   } 

Mammouth du PHP | 643 Messages

23 mai 2017, 07:15

Re,
J'ai donc trouvé mon problème mais je cherche encore à comment le corrigé, il s'agit juste d'un tout petit bout de code que voici:
$url_inexistante = get_headers($ligne['photo'], 1);
	if (!empty($ligne['photo']) && $ligne['id_simply_user'] = '1000' && preg_match("#Not Found#i", $url_inexistante[0])) {
			$ligne['photo'] = 'http://tripday.fr/annonce/img-big-format/defaut.jpg';
			  }	
je demande à PHP de controle le code http de la page si il renvoi une 404 alors on affiche une photo par defaut.

La partie ou se trouve le code dans ma boucle:
if (!empty ($ligne['tracker'])) {
		
	$url_inexistante = get_headers($ligne['photo'], 1);
	
	if (!empty($ligne['photo']) && $ligne['id_simply_user'] = '1000' && preg_match("#Not Found#i", $url_inexistante[0])) {
			$ligne['photo'] = 'http://tripday.fr/annonce/img-big-format/defaut.jpg';
			  }	
	
	echo '
	<div class="tr-post col-sm-3">
									<div class="entry-header">
										<div class="entry-thumbnail">
											<a href="../annonce/'.simplification($ligne["titre"]).'/'.$ligne["id_loisirs"].'.html"><img class="img-responsive post-img" src="'.$ligne['photo'].'" alt="'.ucfirst(strtolower($ligne['titre'])).'" title="'.strtolower($ligne['titre']).' - '.ucfirst(strtolower($ligne['city'])).'"></a>
										</div>
									</div>
									<div class="post-content">
                                        <h3 itemprop="name"><a href="../annonce/'.simplification($ligne["titre"]).'/'.$ligne["id_loisirs"].'.html" title="'.ucfirst(strtolower($ligne['titre'])).'-'.ucfirst(strtolower($ligne['city'])).'" itemprop="url">'.ucfirst($ligne['titre']).'</a></h3>
                                      <ul class="list-unstyled">
									  	<li>'.$la_variable_qui_vas_bien.' à '.str_replace(':', 'H',$ligne['horaire']).' </li>
										<li class="information">'.ucfirst(strtolower($ligne["manufacturer"])).' - '.ucfirst(strtolower($ligne["city"])).'</li>
									  </ul>
								  </div>
							  </div>';
		}
Comment puis je faire ce controle sans avoir le soucis de temps de réponse ? Si je supprime cette partie de code ( temps de réponse 0.17s )

Merci à vous

Eléphant du PHP | 65 Messages

23 mai 2017, 09:02

Mets des index (si ce n'est pas déjà fait) aux points stratégiques dans tes tables et utilise EXPLAIN en ligne de commande pour améliorer tes requêtes

Mammouth du PHP | 2703 Messages

23 mai 2017, 13:00

Comment puis je faire ce controle sans avoir le soucis de temps de réponse ? Si je supprime cette partie de code ( temps de réponse 0.17s )
ajouter un champ dans la table pour sauver le résultat de cette recherche, afin de ne plus avoir à chaque fois dans la boucle.
faire un script qui va mettre, une fois pour toute, la bonne valeur dans ce champ.