Comment mettre en cache avec PHP

Statut
N'est pas ouverte pour d'autres réponses.

guslinux

Gamerz'ien
Bonjour à tous,

Je suis actuellement entrain de m'intéresser au concept Ruby on Rails, mais étant donné que j'ai un TFE à faire en PHP... je cherche le moyen de m'en rapprocher.

L'objet de ce post est donc la mise en cache des données... mais qu'est ce que c'est que ce truc me direz vous !!

Petit exemple avant de commencer :
En tant que bon programmeur, vous séparez le code de controle, le stockage des données ainsi que l'affichage des informations (Model View Controler).

Pour ma part, la partie Model et la partie Controler ca a été +/- tout seul. Mais pour la vue ... c'est pas top top (j'ai pas cherché des masses :oops: ).

Actuellement j'utilise la librairie template de phpLib car c'est la seule qui m'a réellement convaincu.

N'avez vous jamais rêvé pouvoir faire un include d'un script php contenant de l'html et récuperer le résultat dans une variable sans avoir aucun retour à l'écran... impensable me direz vous !!!

Et bien détrompez vous car c'est possible !! et ca existe depuis PHP4 :-D

En fait, l'idée c'est d'utiliser le php comme langage de template et non un autre langage avec un parseur etc etc. Bref une petite complication qui simplifie grandement le développement !

Voici donc le bout de code que je considère comme magique :
Code:
ob_start();
include($file);
$result = ob_get_contents();
ob_end_clean();
La gestion du cache peut aussi servir quand on doit donner des headers, ca évite les erreurs.

N'hésitez pas me faire part de vos réactions ;)
 

Tifox

ou pas
Wow, ça doit être vachement pratique ce truc !
Je vais tester ça, mais j'ai déjà plein d'idée qui me viennent...
 
1er
OP
guslinux

guslinux

Gamerz'ien
Tifox a dit:
Wow, ça doit être vachement pratique ce truc !
Je vais tester ça, mais j'ai déjà plein d'idée qui me viennent...
je l'ai intégré dans mon framework ... et j'en suis plus tot content !!

J'ai plusieurs couches dans mon appli :
- Routeur (selection du script à executer)
- Contrôleur : Un dossier avec des fichiers. Si on compare à RoR un fichier à moi équivaut à une methode pour un controleur RoR.
- Vues : Un fichier html contenant du code PHP inclu après le controleur par le routeur (accès aux memes variables).
- Modèle : Objet PHP qui charge, ajoute, met à jour les données pour une table.

Après deux ans de boulot, je pense que cette trouvaille me permet de rentrer dans un MVC véritablement performant !

Ps : J'ai du faire une série de fonctions pour me générer les input text,password,selectbox,checkbox ... Je vais voir à reprendre les méthodes de PEAR ca sera plus performant.

Edit: Au niveau temps de génération de la page par apache la différence n'est pas flagrante (Je travaille avec un Duron 1300Mhz)
 

Tifox

ou pas
Je dois bien avouer que je n'avais jamais penser a faire du MVC avec du php (ça ne me paraissait pas super adapté), mais l'idée est excellente. Par contre, comme tu l'a dit, arriver a un MVC performant et facilement utilisable, ça prend du temps.

C'est parce que je n'ai pas trop le temps, sinon je me serai bien penché sur la question.
 
1er
OP
guslinux

guslinux

Gamerz'ien
Tifox a dit:
Je dois bien avouer que je n'avais jamais penser a faire du MVC avec du php (ça ne me paraissait pas super adapté), mais l'idée est excellente. Par contre, comme tu l'a dit, arriver a un MVC performant et facilement utilisable, ça prend du temps.

C'est parce que je n'ai pas trop le temps, sinon je me serai bien penché sur la question.
Je dois dire que je suis plus tot comptent du résultat. Sur ma soirée d'hier j'ai fais deux modules de mon appli :-D. Certe ce sont des modules simples mais contenant pas mal de données...

Par ailleur j'ai une librairie sur laquelle je bosse depuis plus de deux ans pour la gestion de mes listings. Je donne la requete SQL, les colonnes et leur taille et hop c'est parti en AJAX avec des recherches :-D.
 

Xou

I ♥ rien
En gros si je comprends bien, on peut se servi de ces fonctions pour mettre du code HTML en cache, pour ensuite retaper tout ça à la sortie ?
Donc s'en servir comme template ?

Ou mieux, s'en servir afin de mettre des données retirées de bases mysql par exemple ?

Valable seulement pour une fois ou est ce qu'on peut récupérer ce cache par pointeurs ?

Désolé il est tard, bêtes questions quoi :oops:
 
1er
OP
guslinux

guslinux

Gamerz'ien
.Xyo a dit:
En gros si je comprends bien, on peut se servi de ces fonctions pour mettre du code HTML en cache, pour ensuite retaper tout ça à la sortie ?
Donc s'en servir comme template ?

Ou mieux, s'en servir afin de mettre des données retirées de bases mysql par exemple ?

Valable seulement pour une fois ou est ce qu'on peut récupérer ce cache par pointeurs ?

Désolé il est tard, bêtes questions quoi :oops:
Euu je comprend pas bien tes questions ...

Ce qui est sur c'est que après ob_start(); tout ce qui est envoyé sur la sortie (print,echo,print_r, etc ...) est mis en cache et n'est pas transmis.
Une fois que on execute $result = ob_get_contents();, tout ce qui à été envoyé vers la sortie est placé dans la variable $result.

Pour ce qui est de l'utilisation, libre à toi d'imaginer ^^
 

Xou

I ♥ rien
En fait, ce à quoi je pensais, c'est une page A et une page B

La page A interroge la BD, qui lui transmet donc les données.
Une fois l'execution de la page A terminée, les données sont détruites ou sont elles encore accessibles par pointeurs ou la fonction en question, pour une autre page par exemple.
 
1er
OP
guslinux

guslinux

Gamerz'ien
.Xyo a dit:
En fait, ce à quoi je pensais, c'est une page A et une page B

La page A interroge la BD, qui lui transmet donc les données.
Une fois l'execution de la page A terminée, les données sont détruites ou sont elles encore accessibles par pointeurs ou la fonction en question, pour une autre page par exemple.
Non, ici c'est la mise en cache d'une seule page... pas sur plusieurs.
 

Ahava

Revenant
Est-il possible de mettre en cache des données uniquement ?


Je m'explique, j'aimerai que des modifications sur une table mysql ne soient effectifs pour les users que le lendemain.


Donc j'aimerai une fois par jour générer les réponses sur les requêtes faites par les users sur une table, et les utilisateurs ne pourront jamais interroger la BD directement mais uniquement ce "cache"...


est-ce faisable ?
 
1er
OP
guslinux

guslinux

Gamerz'ien
Ahava a dit:
Est-il possible de mettre en cache des données uniquement ?


Je m'explique, j'aimerai que des modifications sur une table mysql ne soient effectifs pour les users que le lendemain.


Donc j'aimerai une fois par jour générer les réponses sur les requêtes faites par les users sur une table, et les utilisateurs ne pourront jamais interroger la BD directement mais uniquement ce "cache"...


est-ce faisable ?
Ca tu dois implémenter ca toi meme ... un fichier contenant les données généré tous les jours.

La mise en cache ne concerne que la sortie ecran (echo,print...) et sur le temps d'execution d'une seule page.
 

Soulsight

Elite
ob_end_flush pour ma part car ca envoit les données en sortie ...
 

Tifox

ou pas
J'ai un peu tripoter l'idée de faire du mvc en php (je tripote ce que je veux d'abord :p ) avec un bete petit chat à la IRC, et ça m'a effectivement pas l'air mal du tout.
Niveau view, j'ai opté pour php (pour le template) et javascrit/ajax (très sympa ajax pour interroger directement le controleur)
Niveau controleur, du php "brut".
Mais niveau model, la j'avoue que je suis pas super satisfait, car ça se résume finalement a un classe pour faire plus facilement des requete sql. Quelqu'un a t'il un solution plus "sexy" pour cette partie. J'ai pensé a essayer de faire un truc qui mapperait directement du contenu sql dans des objets, et la modif des objets modifierait directement la DB, mais le boulot me parait assez énorme (surtout pour mon petit chat)
 
1er
OP
guslinux

guslinux

Gamerz'ien
Tifox a dit:
J'ai un peu tripoter l'idée de faire du mvc en php (je tripote ce que je veux d'abord :p ) avec un bete petit chat à la IRC, et ça m'a effectivement pas l'air mal du tout.
Niveau view, j'ai opté pour php (pour le template) et javascrit/ajax (très sympa ajax pour interroger directement le controleur)
Niveau controleur, du php "brut".
Mais niveau model, la j'avoue que je suis pas super satisfait, car ça se résume finalement a un classe pour faire plus facilement des requete sql. Quelqu'un a t'il un solution plus "sexy" pour cette partie. J'ai pensé a essayer de faire un truc qui mapperait directement du contenu sql dans des objets, et la modif des objets modifierait directement la DB, mais le boulot me parait assez énorme (surtout pour mon petit chat)
Pour ce qui est de la partie Modèle j'ai deux couches distinctes.

Une couche spécialisée qui est le Modèle à proprement parlé. Cet objet hérite toujours d'un objet de référence. Son but est de pouvoir charger les données de l'objet suivant une requete par defaut, ou une requete perso.

Ensuite il fait aussi les enregistrement/update en selectionnant automatique le type d'action à effectuer.

La 3e partie concerne l'acquisition des données via un tableau (type $_POST), tu passes le tableau à l'objet, il ne prend que les éléments qui ont le meme nom que les champs présents dans la table à laquelle l'objet est lié (par configuration).

Ca c'est pour la couche principale.

La deuxième couche concerne les accès à la BD.
L'objet est toujours chargé en mémoire et accessible via une variable globale ($GLOBALS[]). Cet objet a différente méthode de type Select, Insert etc.
La ligne de conduite est la suivante : on lui donne une requete, et il renvoie la donnée via une variable de type de base (string,array,int ...)

Je ne sais pas si j'ai été clair ^^
 

Ahava

Revenant
pas vraiment...


Moi perso pour PHP j'adhere pas au MVC : c'est pratique pour un programme à plusieurs fenetres, plusieures vues.

A quoi rime le fait d'avoir un MVC si c'est pour ne pas avoir une réaction en "temps réel"... Enfin soit, je trouve que le MVC ne correspond pas à la technologie de "demande de page" -> "envoie de page"...

Pour moi le MVC est bien pratique pour un jeu par exemple, en C++ ou Java. Pour les applications de type gestion d'une bd ou autre, je préfere de loin le modèle DAO :love: :love: :love:
 
1er
OP
guslinux

guslinux

Gamerz'ien
Ahava a dit:
pas vraiment...


Moi perso pour PHP j'adhere pas au MVC : c'est pratique pour un programme à plusieurs fenetres, plusieures vues.

A quoi rime le fait d'avoir un MVC si c'est pour ne pas avoir une réaction en "temps réel"... Enfin soit, je trouve que le MVC ne correspond pas à la technologie de "demande de page" -> "envoie de page"...

Pour moi le MVC est bien pratique pour un jeu par exemple, en C++ ou Java. Pour les applications de type gestion d'une bd ou autre, je préfere de loin le modèle DAO :love: :love: :love:
Perso je trouve que ca représente une certaine facilité de programmation. Tu sépares routage/controle/données/template.

Meme si le but final est de faire une seule fenetre ... ca sert quand meme !! De puis avec AJAX on sait faire des popups virtuels... ca devient intéressant ^^
 

Tifox

ou pas
J'adhère aussi au MVC, même pour les site web/application web, pour la même raison que guslinux : la séparation des concepts et la facilité de maintenance/réutilisation.
Ceci dit, j'admets que le php s'y prète moins bien que le java par exemple.

Pour Guslinux, ton explication du modèle correspond a peu près a ce que j'avais en tete : un couche pour les objets et une autre pour les lier à la BD.
 
1er
OP
guslinux

guslinux

Gamerz'ien
Tifox a dit:
Pour Guslinux, ton explication du modèle correspond a peu près a ce que j'avais en tete : un couche pour les objets et une autre pour les lier à la BD.
C'est la seule manière de faire si on veut que le programme puisse utiliser plusieurs BD. Tu changes l'objet BD et hop c'est parti.

bien sur il faut faire attention aux requetes et aux fonctions supportées par le SGBD ... mais là on sait pas faire de miracle je crois. De toute facon, en faisant gaffe je crois qu'il y a moyen de faire qqch de portable.

Tant que j'y suis, ma dernière trouvaille :-D :
http://devel.edoplan.be/AJAX/popup/ (ne marche que sous FireFox ou client Gecko)
 
Statut
N'est pas ouverte pour d'autres réponses.
Haut