Mettre en cache le résultat d'une fonction

Eléphant du PHP | 168 Messages

03 nov. 2008, 04:29

Bonjour,

J'ai créé une petite fonction me permettant de créer le lien correspondant à la vidéo selon tel ID.
Jusqu'a là tout va bien, ca marche etc..
function getUrlVideos($id) {
	if(empty($id) && !is_numeric($id)) {
		$url = '#';
	}
	else 
	{
		$id_video = sql_protect($id);
		$req_getVideos = 'SELECT v.id,v.nom AS nom_video,j.nom AS nom_jeu FROM videos v 
						RIGHT JOIN jeux j ON  v.jeux_id = j.id
						WHERE v.id = "'.$id_video.'"';
		$res_getVideos = sql_query($req_getVideos,'AFFICHE NOM VIDEO');
		$nbre_getVideos = mysql_num_rows($res_getVideos);
		
		if($nbre_getVideos < 1) {
			$url = '#';
		}
		else
		{
			$video = mysql_fetch_assoc($res_getVideos);
			$url = URL_SITE.'videos/'.rewriting($video['nom_jeu']).'/'.rewriting($video['nom_video']).'-'.$video['id'].'.htm';
		}
	}
	return $url;
}
Là ou je m'inquiète, c'est quand sur une page de recherche, je me retrouve avec >200 liens vidéos donc 200 reqs !!

C'est pas possible, ca me donne froid dans le dos de laisser ça comme ca :lol:

Je pense que la solution d'économie serai de mettre dans un fichier les resultas de chaque ID, et si il est déja on recup son nom ! sinon on l'ajoute.

Et si par apres, je devai renommer le nom d'une video, je vois que la suppression de ce fichier comme solution.

Pensai vous déjà que c'est une bonne solution ? oui ? non ?
Si oui, sous quel format serai il le plus adapté et rapide en ajout, et recherche ?

Si non, quel solution je peux mettre en place ?


Merci d'avance.

Eléphant du PHP | 353 Messages

03 nov. 2008, 08:31

c'est une solution en effet.

Une autre possibilité est de cacher l'ensemble des résultats pour une recherche données selon le même système.

En fait tu peux soit stocker les résultats de la recherche en session, et là cela se fera par utilisateur distinct, soit stocker dans un fichier le resultat de la recherche et là cela se fera pour tous les utilisateurs.

Après, à toi de définir une durée de vie pour ce cache (en général rarement plus de quelques heures, mais cela peu varier selon le type de page et surtout le type de contenu).

ViPHP
ViPHP | 4039 Messages

03 nov. 2008, 11:28

Ou bien tu utilises le cache APC, intégré à PHP, pour stocker tout ça dans la mémoire vive:

http://www.phpfrance.com/forums/voir_sujet-239649.php
(vers le bas)

C'est bien mieux qu'un fichier: de un tu ne n'encombres pas le disque avec des fichiers inutiles, de deux c'est bien plus rapide (c'est lent, un disque dur) et de trois c'est partage: tous les visiteurs y ont accès.
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Eléphant du PHP | 168 Messages

03 nov. 2008, 13:57

Ou bien tu utilises le cache APC, intégré à PHP, pour stocker tout ça dans la mémoire vive:

http://www.phpfrance.com/forums/voir_sujet-239649.php
(vers le bas)

C'est bien mieux qu'un fichier: de un tu ne n'encombres pas le disque avec des fichiers inutiles, de deux c'est bien plus rapide (c'est lent, un disque dur) et de trois c'est partage: tous les visiteurs y ont accès.
Fatal error: Call to undefined function memcache_connect() in /var/www/.../test.php on line 2

Surement pas dispo sur mon mutu !
c'est une solution en effet.

Une autre possibilité est de cacher l'ensemble des résultats pour une recherche données selon le même système.

En fait tu peux soit stocker les résultats de la recherche en session, et là cela se fera par utilisateur distinct, soit stocker dans un fichier le resultat de la recherche et là cela se fera pour tous les utilisateurs.

Après, à toi de définir une durée de vie pour ce cache (en général rarement plus de quelques heures, mais cela peu varier selon le type de page et surtout le type de contenu).
C'est mieux que les fichiers ? mais même si c'est plus rapide en accès, faut tout de meme qu'a chaque visiteur unique, ca l'enregistre, ce qui reste lourd si tu as bcp de visites.

ViPHP
ViPHP | 4039 Messages

03 nov. 2008, 14:35

Ou bien tu utilises le cache APC, intégré à PHP, pour stocker tout ça dans la mémoire vive:

http://www.phpfrance.com/forums/voir_sujet-239649.php
(vers le bas)

C'est bien mieux qu'un fichier: de un tu ne n'encombres pas le disque avec des fichiers inutiles, de deux c'est bien plus rapide (c'est lent, un disque dur) et de trois c'est partage: tous les visiteurs y ont accès.
Fatal error: Call to undefined function memcache_connect() in /var/www/.../test.php on line 2

Surement pas dispo sur mon mutu !
1) j'ai dit APC, pas memcache.
2) tu sais modifier le php.ini ?
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Eléphant du PHP | 168 Messages

03 nov. 2008, 18:48

Pareil absent ! et non j'ai pas assez au php.ini ou via htaccess, c'est un hebergeur de serveurs de jeux et propose de l'hebergement de sites, donc ca reste assez limité dès que ca sort de l'ordinaire.

Eléphant du PHP | 353 Messages

03 nov. 2008, 19:00

c'est pour cela que je n'ai pas proposé apc.
APC est une excellente solution de cache mais pour s'en servir correctement il faut :
- la main sur le serveur
- un bon niveau.

Donc en effet, si tu peux avoir la main (ou demander à ton hébergeur) essaye d'installer apc.

ViPHP
ViPHP | 4039 Messages

03 nov. 2008, 20:00

Bon, sinon, si ce sont des questions de performances, tu peux aussi attaquer le problème à l'origine.

J'utiliserais l'extension mysqli plutôt que mysql (si elle est dispo). Elle est plus rapide. De plus, tu pourrais t'essayer aux requêtes préparées, pour encore accélérer le processus.

Et il te reste encore le cache de requêtes de Mysql lui-même. Faudrait voir s'il est activé.

Avec tout ça, les performances devraient être quasi les mêmes que si tu les avait en mémoire.

Pour le cache par fichier, il faudrait encore par après parser le contenu du fichier, et au fur et à mesure qu'il grandira, ça va prendre des plombes.
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.