Précédent   Forum des professionnels en informatique > PHP > Langage > Fichiers
Fichiers Forum d'entraide sur les fichiers avec PHP. Avant de poster -> FAQ fichiers et Sources fichiers
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 19/11/2010, 10h07   #1
Nouveau Membre du Club
 
Inscription : décembre 2008
Messages : 48
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 48
Points : 26
Points : 26
Par défaut Mise en cache [exemple de cas]

Bonjour, je prépare un nouveau système de mise en cache et je me pose une légère question concernant la gestion des fichiers.
J'explique le cas ci-dessous afin de rendre ma question plus compréhensible :

On créer une actualité :
_ elle s'ajoute dans la base de données.

Un utilisateur demande la page qui contient cette actualité :
  • php vérifie s’il y a un fichier dans le dossier cache/actualite/44200.html
  • Si le fichier existe on l'inclus dans la page.
  • Sinon, on écrase le fichier (si existant) par la nouvelle actualité
  • On l'inclut dans la page.

L'actualité est modifer :
_ On supprime le fichier 44200.html, après avoir effectué la modification dans la base de données

Ma question est :
Si plusieurs utilisateurs accèdent simultanément à une même actualité (numéro 44200) alors que le fichier 44200.html est supprimé à ce même moment. L'affichage de la page risque t'elle d'être altérer ?
Sachant que je vérifie si le fichier existe bien juste avant l'inclusion :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if (!isset($_GET["id"]) or is_array($_GET["id"]) or !preg_match("#^[1-9]{1}[0-9]{0,9}$#", $_GET["id"])) {
	// erreur 404
	exit;
}
$file = 'cache/actualite/'.$_GET["id"].'html';
 
if (file_exists($file)) {
	include($file);
	exit;
}
else {
	// on verifie si l'actualité existe dans la base de donnée
	// on genere la nouvelle actaulité dans le fichier si l'actu existe
	// sinon 404
}
Pourquoi cette méthode ? :
Si je devais choisir de modifier le fichier, je devrais forcement demander à la base de données la date de la dernière modification et la comparer avec le fichier existant (donc 2 vérifications supplémentaires) !
Mais en supprimant le fichier, on s'assure donc que le fichier est périmer.
Donc l'affichage d'une actualité 99,9% du temps ne requière aucune connexion à la base de données.

Avec une forte affluence cette méthode risque t'elle de causer quelques soucis ?
Si un fichier est supprimer pendent l'inclusion de php, l'affichage se fais t'il correctement ou risque t'il d'être altéré.
PS : je préfère créer le script moi même pour plus de flexibilité

Qu'en pensez-vous ? Auriez-vous une meilleure méthode que celle présenter ?
nasuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 10h29   #2
Membre éprouvé
 
Avatar de Sayrus
 
Inscription : décembre 2005
Messages : 818
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : décembre 2005
Messages : 818
Points : 456
Points : 456
As-tu jeté un oeil au niveau des variables LOCK UNLOCK de PHP?

Je pense que la solution est là...
__________________
Solutions pour concessions et garages automobiles =>
http://www.fastback.be
Sayrus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 10h51   #3
Nouveau Membre du Club
 
Inscription : décembre 2008
Messages : 48
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 48
Points : 26
Points : 26
Je te remercie de ta réponse, mais elle reste très flou vis-à-vis de mes connaissances.

Quand tu dis : "variable de php lock ou unlock", sa ne me dis rien et je ne trouve rien à se sujet sur google.

Par contre, je pense que tu fais peu être allusion à la fonction flock(); mais je n'ai jamais chercher à comprendre cette fonction.
J'ai fait quelques recherches à ce propos.

Peux-tu me dire si j'ai bien compris la fonction :
On ouvre le fichier puis l'on créer un verrou pour le fermer une fois la lecture terminer. Ce qui empêche d'obtenir un fichier incomplet. C'est bien cela ?

À supposer que j'ai bien compris le procédé, cette méthode n'empêchera pas la suppression du fichier alors qu'un verrou est posé dessus au même moment ?
nasuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 11h38   #4
Membre éprouvé
 
Avatar de Sayrus
 
Inscription : décembre 2005
Messages : 818
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : décembre 2005
Messages : 818
Points : 456
Points : 456
Citation:
Envoyé par nasuu Voir le message
Je te remercie de ta réponse, mais elle reste très flou vis-à-vis de mes connaissances.

Quand tu dis : "variable de php lock ou unlock", sa ne me dis rien et je ne trouve rien à se sujet sur google.

Par contre, je pense que tu fais peu être allusion à la fonction flock(); mais je n'ai jamais chercher à comprendre cette fonction.
J'ai fait quelques recherches à ce propos.

Peux-tu me dire si j'ai bien compris la fonction :
On ouvre le fichier puis l'on créer un verrou pour le fermer une fois la lecture terminer. Ce qui empêche d'obtenir un fichier incomplet. C'est bien cela ?

À supposer que j'ai bien compris le procédé, cette méthode n'empêchera pas la suppression du fichier alors qu'un verrou est posé dessus au même moment ?

Oui bien sûr flock() etc.

Ca te permet lorsque tu tentes de modifier un fichier, d'empêcher d'autres script de modifier ce fichier... Ainsi, ça évitera justement le problème que tu souhaites éviter...
__________________
Solutions pour concessions et garages automobiles =>
http://www.fastback.be
Sayrus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 11h46   #5
Nouveau Membre du Club
 
Inscription : décembre 2008
Messages : 48
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 48
Points : 26
Points : 26
Je suis content d'avoir compris le principe de la fonction. Apès avoir poster j'ai continué à rechercher et ta réponse me ramène au problème que je pense.

Admettons que je modifie une actualité, je ne pourrais donc pas supprimer le fichier si php à poser un verrou pendent se temps là ?
Je devrais donc faire une boucle while avec un usleep et vérifier plusieurs fois jusqu'a que le fichier n'est plus verrouillé pour le supprimer ?

Voici un exemple de code (pourrais tu me dire si j'ai bien compris) :
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
if (!isset($_GET["id"]) or is_array($_GET["id"]) or !preg_match("#^[1-9]{1}[0-9]*$#", $_GET["id"])) {
	// erreur 404
	exit;
}
$file = 'cache/actualite/'.$_GET["id"].'html';
 
if (file_exists($file)) {
	if (flock($file, LOCK_SH)) { // on demande un verou pour une lecteur
		if ($fp = fopen($file,"w")) {
			echo $fp;
		}
		else {
			// probleme d'ouverture on met page temporairement indisponible
		}
    flock($fp, LOCK_UN); // libère le verrou
	} else {
		// probleme d'ouverture on met page temporairement indisponible
	}
}
else {
	// on verifie si l'actualité existe dans la base de donné
	// on genere la nouvelle actaulité dans le fichier si l'actu existe
	// sinon 404
}
nasuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 11h55   #6
Membre éprouvé
 
Avatar de Sayrus
 
Inscription : décembre 2005
Messages : 818
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : décembre 2005
Messages : 818
Points : 456
Points : 456
Citation:
Envoyé par nasuu Voir le message
Je suis content d'avoir compris le principe de la fonction. Apès avoir poster j'ai continué à rechercher et ta réponse me ramène au problème que je pense.

Admettons que je modifie une actualité, je ne pourrais donc pas supprimer le fichier tant que php l'ouvre ? Je devrais donc faire une boucle avec un usleep ?

Voici un exemple de code (pourrais tu me dire si j'ai bien compris)
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
if (!isset($_GET["id"]) or is_array($_GET["id"]) or !preg_match("#^[1-9]{1}[0-9]*$#", $_GET["id"])) {
	// erreur 404
	exit;
}
$file = 'cache/actualite/'.$_GET["id"].'html';
 
if (file_exists($file)) {
	if (flock($file, LOCK_SH)) { // on demande un verou pour une lecteur
    	if ($fp = fopen($file,"w")) {
			echo $fp;
		}
		else {
			// probleme d'ouverture on met page temporairement indisponible
		}
    flock($fp, LOCK_UN); // libère le verrou
	} else {
		// probleme d'ouverture on met page temporairement indisponible
	}
}
else {
	// on verifie si l'actualité existe dans la base de donné
	// on genere la nouvelle actaulité dans le fichier si l'actu existe
	// sinon 404
}
Si tu regardes sur php.net pour la fonction flock() dans les commentaires, on présente des exemples d'utilisation... Apparemment utiliser un usleep dans une boucle semble être une bonne solution...

Maintenant si quelqu'un connait une meilleure solution...
__________________
Solutions pour concessions et garages automobiles =>
http://www.fastback.be
Sayrus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 12h00   #7
Nouveau Membre du Club
 
Inscription : décembre 2008
Messages : 48
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 48
Points : 26
Points : 26
Je pense créer une table dans la base de données qui liste les fichiers à supprimer.
Je donnerais à ce fichier php une limite de temps d'exécution assez haut. Il essayera de supprimer les fichiers avec une boucle while. Il sera lancer à chaque modificaiton à faire. Mais c'est barbare je trouve

Mais en cas de forte affluence, le fichier peut attendre longtemps avant d'être modifié ?

Si quelqu'un à une meilleure solution je suis preneur également.

En tout cas merci Sayrus, j'en aurais appris un peu plus sur la gestion des fichiers.
nasuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h55.


 
 
 
 
Partenaires

Hébergement Web