[PHP] Copie de fichier pour cache.

[Résolu/Fermé]
Signaler
Messages postés
837
Date d'inscription
vendredi 25 juillet 2008
Statut
Membre
Dernière intervention
23 février 2016
-
Messages postés
837
Date d'inscription
vendredi 25 juillet 2008
Statut
Membre
Dernière intervention
23 février 2016
-
Bonjour,

le titre n'est pas forcément super explicite donc je m'explique, j'ai un flux serialisé externe qui me retourne des urls vers des images que je veux afficher sur mon site, en raison d'avoir suivi le cours d'optimisation des sites web sur phptv je me suis essayé aux caches...

Ceux qui ont déjà utilisé savent que la mise en cache prend pas mal de temps, mais après ça apporte de bons résultats...

J'aimerai essayer de minimiser ce temps au maximum...

Ce qu'il y a à savoir : le flux se rafraîchit toutes les 2min.
Ce que j'ai mis en place :
- Mise en cache du flux toutes les 2min.
- Mise en cache des images.

Conditions :
- Flux : A chaque appel de page, si le filemtime() du fichier est supérieur à 120 secondes à partir du time() d'appel alors écraser le cache avec la nouvelle version.
- Images : A chaque appel de page, si la dernière date de modification du dossier qui contient les images est supérieur à 120 secondes alors je rentre dans ma 2ème condition qui vérifie si l'image existe déjà et qu'elle est plus vieille que 30 minutes alors la remplacer, ensuite si l'image n'existe pas la créer.

J'ai essayé les manières suivantes et elles sont lourdes...
- Premièrement pour la condition de l'image existante, je vérifiais via file_exists();
- Ensuite comme c'était lent j'ai essayé un Glob(); pour avoir le résultat en tableau.
- De même assez lent mais tout de même plus rapide que file_exists(); à 1ère vue, alors essayé de stocké les infos images dans un fichier .txt sous forme de tableau sérialisé...
- Finalement j'ai l'impression que la lenteur ne viens pas vraiment au niveau de la vérification mais plus au niveau de la copie des fichiers sur mon serveur, donc j'opte pour la fonction copy(); qui à l'air un peu plus rapide mais toujours pas à mon goût.

Pouvez-vous me donner des idées ? Pour augmenter l'efficacité et la rapidité de mon script ?

Voici une partie de mon script :

// CACHE_CONTROL est une constante qui dit si il faut activer le cache ou non.
if(CACHE_CONTROL == true) { $cache = new cache_control(); } // activation object cache_control();
if(CACHE_CONTROL == true) { $update_cache = ($cache->getUpdate('_caches/images/', 120) == true) ? true : false; } // si le dossier /images/ à été modifié il y a plus de 2min. alors true.
if(CACHE_CONTROL == true) { $getUpdate = ($cache->getUpdate('_caches/images/', 1800) == true) ? true : false; } // si le dossier /images/ à été modifié il y a plus de 30min. alors true.
if(CACHE_CONTROL == true) { $filename = '_caches/images/models.txt'; } // Met le chemin vers le fichier où je stock les infos sur mes images dans la variable $filename;
if(CACHE_CONTROL == true) { $file = file_get_contents($filename); } // get_contents du fichier où je stock les infos sur mes images
if(CACHE_CONTROL == true) { $unserialize = unserialize($file); } // désérialise mon fichier où je stock les infos sur mes images
if(CACHE_CONTROL == true) { $update = false; } // Met la variable $update à false par défaut.

foreach($models as $model) { // boucle du flux.
	if(CACHE_CONTROL == true) { // si le cache est activé.
		$file_cache = '_caches/images/webcams/' . $model['id'] . '.jpg'; // lien vers image qui est censée être en cache
			if($update_cache == true) { // si /images/ à été modifié il y a plus de 2min.
				if(array_key_exists($model['id'], $unserialize)) { // si image existe dans le fichier sérialisé.				
					if($getUpdate == true) { // si image existante a été modifié il y a plus de 30min.
						echo (copy($model['medias']['preview'], $file_cache)) ? "copie ok" : "copie échouée"; // copie et retourne si la copie à été un succès ou non.
						$unserialize [$model['id']]= time(); // met à jour l'entrée dans le fichier sérialisé.
						$update = true;  // met update à true.
					}
			} else { // Si image n'existe pas							
				echo (copy($model['medias']['preview'], $file_cache)) ? "copie ok" : "copie échouée"; // copie image sur serveur
				$unserialize [$model['id']]= time(); // ajoute les infos images dans fichier sérialisé.
				$update = true; // met update à true.
			}

		}
	}

if(CACHE_CONTROL == true && $update == true) { file_put_contents($filename, serialize($unserialize)); } // met à jour le fichier sérialisé avec les nouvelles entrées si il y a.


J'espère que je ne suis pas trop flou avec vous, si vous avez des questions j'y répondrai :)

3 réponses

Messages postés
565
Date d'inscription
mercredi 15 avril 2009
Statut
Membre
Dernière intervention
28 décembre 2009
84
Salut,

La première chose qui me choque dans ton code, ce sont tes multiples conditions CACHE_CONTROL == true...

Une seule contenant ton code global est suffisante.

Ensuite :

« Ce qu'il y a à savoir : le flux se rafraîchit toutes les 2min.
Ce que j'ai mis en place :
- Mise en cache du flux toutes les 2min.
- Mise en cache des images. »


Pourquoi faire un rafraichissement périodique automatique ?
Ce n'est pas de cette façon que l'on utilise un système de cache.

Une mise à jour d'un cache ne doit avoir lieue que lorsqu'il y a eu modification (ajout/suppression/édition) de données, et pas de manière automatique ne s'appuyant sur aucun critère valable/concret, donc sur ce que tu contrôles.

Sinon, je n'ai pas compris non plus ce que fait ta boucle foreach et tes copy ?
Tu copies quoi exactement ?
Messages postés
837
Date d'inscription
vendredi 25 juillet 2008
Statut
Membre
Dernière intervention
23 février 2016
174
En faite c'est un flux distant... Il ne m'appartient pas mais est prévu pour qu'on l'utilise... Donc je ne sais pas voir si il y a modification... Je sais juste qu'il s'actualise toutes les 2min. et de toute manière il se modifie sans arrêt... Car ça affiche des informations sur des modèles webcams pour site de rencontre... Donc il y a toujours des connexions/déconnexions.

Oui c'est vrai je le fait plusieurs fois le CACHE_CONTROL, je ne devrais le faire qu'une fois, d'habitude je le fais mais là je sais pas pourquoi j'ai fait ça :-s

Je copie en faite les images distantes car dans le flux sérialisé il y a des urls vers des images distantes... Mais comme le temps du script s'élevait à 3, 4 seconde pour contacter le flux + afficher les images, j'ai voulu toutes les copier sur mon hébergement pour futurs chargements plus rapide...

Finalement mon problème est résolu, j'ai assez bien réfléchis et tenté plusieurs trucs... La solution est que sur OVH tu peux faire des "tâches planifiées" aussi appellées "CRON", j'ai donc créé un fichier ".php" qui faisait les copies des images sur mon hébergement toutes les heures, tous les jours.

Et lorsque j'appel mon flux et que l'image n'est pas dispo je l'a prend à distance (pour 1 ou 2 images manquante c'est pas grave), donc maintenant mon script se charge en moins d'une seconde, 0,06sec ici pour mon test pour afficher 36 images de 160*120...

Merci d'avoir essayé de m'aider :)
Messages postés
837
Date d'inscription
vendredi 25 juillet 2008
Statut
Membre
Dernière intervention
23 février 2016
174
En faite c'est un flux distant... Il ne m'appartient pas mais est prévu pour qu'on l'utilise... Donc je ne sais pas voir si il y a modification... Je sais juste qu'il s'actualise toutes les 2min. et de toute manière il se modifie sans arrêt... Car ça affiche des informations sur des modèles webcams pour site de rencontre... Donc il y a toujours des connexions/déconnexions.

Oui c'est vrai je le fait plusieurs fois le CACHE_CONTROL, je ne devrais le faire qu'une fois, d'habitude je le fais mais là je sais pas pourquoi j'ai fait ça :-s

Je copie en faite les images distantes car dans le flux sérialisé il y a des urls vers des images distantes... Mais comme le temps du script s'élevait à 3, 4 seconde pour contacter le flux + afficher les images, j'ai voulu toutes les copier sur mon hébergement pour futurs chargements plus rapide...

Finalement mon problème est résolu, j'ai assez bien réfléchis et tenté plusieurs trucs... La solution est que sur OVH tu peux faire des "tâches planifiées" aussi appellées "CRON", j'ai donc créé