Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/07/2006, 00h09   #1
dcz
Invité régulier
 
Inscription : mars 2006
Messages : 29
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 29
Points : 6
Points : 6
Par défaut [SQL] Cycle SQL et cache php

Bonjour,

Je suis en train de developper un petit script pour faire des plans de site Google Sitemaps pour les forums phpBB et je me pose un petite question à propos du format à employer pour mettre en place un système de cache.

Le problème est assez générale, c'est pour quoi je poste ici.
L'intérêt d'éviter de lister 5000 éléments sans cache toutes les 3 minutes est assez évident.

Principe :
Le script sort une liste d'url (jusqu'à 50 000, mais 5000 est déjà beaucoup).

Du coup, j'ai découpé l'énorme requête SQL en cycles.
Disons que l'on configure un cycle de 200 éléments par requête.
Le script les récupère et les envois directement par echo.

Du coup, il est assez simple de créer un fichier de cache correspondant à un cycle et de le mettre à jour tous les jours.

Question :
Donc, j'ai procédé par étapes. J'ai tout d'abord simplement mis en cache un var_export(), puis un serialize() du résultat de la requête.
Plus rapide.
Puis, j'ai carrément essayé de mettre en cache un tableau contenant le résultat mis en forme plutôt que simplement le résultat de la requête SQL, en me disant que c'était toujours ça de moins à refaire.

Ce qui veut dire que j'ai des trucs comme :
Code :
1
2
3
4
5
6
<url>
<loc>http://localhost/forums/viewtopic.php?t=6</loc>
<lastmod>2006-03-16T04:51:31+00:00</lastmod>
<changefreq>always</changefreq>
<priority>1.0</priority>
</url>
Dans chaque cellule du tableau.

Les fichier caché sont de cette forme :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php 
//mx Google sitemaps www.phpBB-SEO.com 
// Gen Stats : 0.02244 s - 9 sql 
// datas 
if ( !defined('IN_PHPBB') && !defined('IN_PORTAL') ) 
{ 
	die('Hacking attempt'); 
} 
 $cached = unserialize('a:3:{i:77;s:178:"	<url>
		<loc>http://localhost/forums/viewtopic.php?t=4</loc>
		<lastmod>2006-03-16T04:50:19+00:00</lastmod>
		<changefreq>always</changefreq>
		<priority>1.0</priority>
	</url>
";i:78;s:178:"	<url>
		<loc>http://localhost/forums/viewtopic.php?t=3</loc>
		<lastmod>2006-03-15T22:38:24+00:00</lastmod>
		<changefreq>always</changefreq>
		<priority>1.0</priority>
	</url>
";}'); 
 $increment =  50; 
?>
En plus long.

Et je dois donc ajouter une petit boucle pour afficher les éléments du tableau.

Et là, c'est semble t il beaucoup plus rapide que de seulement mettre en cache la requête.

Du coup, je me suis dit qu'il était encore possible d'éviter de faire travailler php en utilisant un cache de cette forme :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php 
//mx Google sitemaps www.phpBB-SEO.com 
// Gen Stats : 0.02244 s - 9 sql 
// datas 
if ( !defined('IN_PHPBB') && !defined('IN_PORTAL') ) 
{ 
	die('Hacking attempt'); 
} 
?>
   <url>
      <loc>http://localhost/forums/viewtopic.php?t=4</loc>
      <lastmod>2006-03-16T04:50:19+00:00</lastmod>
      <changefreq>always</changefreq>
      <priority>1.0</priority>
   </url>
   <url>
      <loc>http://localhost/forums/viewtopic.php?t=3</loc>
      <lastmod>2006-03-15T22:38:24+00:00</lastmod>
      <changefreq>always</changefreq>
      <priority>1.0</priority>
   </url>
<?php 
 $increment =  50; 
?>
Et de simplement l'afficher avec un include, mais quelle n'as pas été ma surprise! Sur une centaine d'éléments, séparés en deux fichiers, c'est deux fois plus long que la première méthode qui emplois pourtant une boucle supplémentaire pour l'affichage et un unserialize dans l'include.

Alors je me demande si c'est normal, si cela pourrait être différent sur des cache de genre 250 éléments.
Je pensait que le xml ne serait pas interprété et que l'on ne pouvait espérer aller plus vite. La c'est carrément deux fois plus long d'inclure le deuxième cache que de traiter le second.

Voilà donc ma question je sais elle est longue, mais cela à gravement titillé ma curiosité donc si vous en êtes à lire la fin de ce message vous avez sûrement un début d'idée

++
dcz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/07/2006, 11h16   #2
dcz
Invité régulier
 
Inscription : mars 2006
Messages : 29
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 29
Points : 6
Points : 6
Bon et ben après de plus ample tests, il se confirme que l'include de xml "plat" est plus lent que l'include d'un tableau sérialisé, voir c'est même plus lent que le SQL en testant sur 500 éléments en deux cycles, alors que la méthode sérialisée va au moins deux fois plus vite que sans cache.

Donc j'ai ma réponse sur la marche à suivre, mais je ne comprend toujours pas.

++
dcz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/07/2006, 17h16   #3
dcz
Invité régulier
 
Inscription : mars 2006
Messages : 29
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 29
Points : 6
Points : 6
lol, en fait, c'est bien ce que je pensait au début, hehe, mon premier cache était bien complet, mais pas en sortie donc, plus rapide c'est clair lol.

Mais bon, pas si simple de faire la difference entre 1047 et 618 url listé sur un explorateur

Donc tout est normal.

++
dcz est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h38.


 
 
 
 
Partenaires

Hébergement Web