Conseils pour une architecture PHP5 simple et efficace

Consultez la formation au référencement naturel Google de WebRankInfo / Ranking Metrics


kalagan
Nouveau WRInaute
 
Messages: 13
Inscription: Mer Mai 21, 2008 9:02

Conseils pour une architecture PHP5 simple et efficace

Message le Mer Oct 29, 2008 11:32

Bonjour à tous.

Dans le cadre d'un projet de site web développé en PHP5, j'aimerais recueillir quelques avis sur l'architecture de mon code. Je désire avant tout un code simple, performant et maintenable. Pour informations, mon site doit être traduit en plusieurs langues.

serveur :
- Debian/Apache/PHP5/mysql

Base de données :
- schéma classique avec une table par entité + table association.
- une base de données par langue
- tables texte_menu, texte_footer, ... contenant les textes du site

Acces aux données :
- une classe Connect.class.php qui prend en parametre $_GET("lg"), correspondant à la langue (www.example.com/fr, www.example.com/us,...), pour attaquer la bonne base
- des Manager.class.php qui ont pour attribut la connection et qui font des requetes SQL, grâce à des méthodes de classes

Code: Tout sélectionner
public function getNews($i) {
$sql = "SELECT * FROM news ORDER BY date limit $i";
$res = mysql_query($sql, $this->connect);
return $rew;
}


Affichage dynamique :
- des pages php dans /inc

Code: Tout sélectionner
<?php>
include_once "/core/ManagerNews.php";
$mng = new ManagerNews();
$news = $mng->getNews(10);
?>

<div class="recent-news">
   <div class="news">
      <?php while ($row = mysql_fetch_assoc($res)) {
      echo '<p>'.$row["title"].'</p>';
      echo '<p>'.$row["description"].'</p>';
      ?>
   </div>
</div>



Page html/php
index.php


Code: Tout sélectionner
<body>
   <?php include_once 'inc/menu.php' ?>
   <?php include_once 'inc/home_news.php' ?>
   <?php include_once 'inc/footer.php' ?>
</body>




Arborescence des fichiers :

index.php
error.php
news.php
.htaccess
robots.txt
...

/inc/menu.php
/inc/footer.php
/inc/home_news.php
...

/core/db/Connect.class.php
/core/mng/Manager_News.class.php
/core/mng/Manager_Client.class.php
/core/utils/GenerateSitemap.class.php

/script/generateSitemap.php
/script/testServeur.php

Concernatn l'URl rewritting, est-il plus judicieux d'utiliser l'url comme index (SELECT * FROM news WHERE url="nouveautes-google"), de mettre l'id dans l'URL (SELECT * FROM news WHERE id substr(19, 2, "nouveautes-google-25") ou de faire une requete suppléméentaire pour retrouver l'identifiant ?

Merci d'avance pour vos réponse et l'analyse de mon architecture.
Dernière édition par kalagan le Mer Oct 29, 2008 13:33, édité 3 fois.


Bacteries
WRInaute accro
WRInaute accro
 
Messages: 1333
Inscription: Jeu Mai 27, 2004 13:04

Message le Mer Oct 29, 2008 11:46

Pour avoir un code maintenable déjà préfère l'utilisation de template (et donc d'un moteur de template) et pas mixer HTML avec le PHP (dur à lire, pas vraiment évolutif, ...).
Ensuite, si tu es en PHP5 tu as la librairie PDO pour l'accès à la base. C'est plus propre que faire des mysql_query() dans ton code.

Et pour tes méthodes de classe : pourquoi renvoyer un retour de base plutôt qu'une collection de news? Autant profiter des méthodes de classe et séparer données et code métier.

Ensuite evite les include_once() pour inclure un fichier de classe. Utilise la méthode __classLoader() pour automatiser ça.

Pour avoir un truc bien cadré et propre tu peux aussi te pencher sur un framework (Zend, Synfony, Cake, ...).


dmathieu
Modérateur
Modérateur
 
Messages: 6920
Inscription: Ven Jan 09, 2004 16:21

Message le Mer Oct 29, 2008 12:00

Je ne vois pas l'intérêt du titre totalement en majuscule, mis à part nous faire passer l'envie de lire ton sujet et d'y répondre.


spout
WRInaute accro
WRInaute accro
 
Messages: 1295
Inscription: Mer Mai 14, 2003 11:05

Message le Mer Oct 29, 2008 12:08

Etant utilisateur de CakePHP, je te conseille d'y jeter un oeil.


OTP
Modérateur
Modérateur
 
Messages: 12890
Inscription: Ven Déc 16, 2005 22:41

Message le Mer Oct 29, 2008 12:39

Merci d'utiliser example.com comme URL d'exemple.


kalagan
Nouveau WRInaute
 
Messages: 13
Inscription: Mer Mai 21, 2008 9:02

Message le Mer Oct 29, 2008 13:36

J'ai remis le titre en minuscules et utilisé www.example.com

Je vous avourais que j'ai une mauvaise expérience des frameworks (notamment en Java, Spring, Hibernate, EJB, ...) et je pense que la mise en place d'un Frameworks est intéressante pour de gros projets avec beaucoup de développeurs, mais peut-être pas pour les sites que je développe.

Je ne comprends pas l'intèrêt du classeLoader.
include_once(/core/ManagerNews.class.php) ne prend qu'une ligne et ne demande aucune installation.

require 'classloader.php';
ClassLoader::addPath('/my/class/dir');
prend 2 lignes, requiert de créer une classe et doit être "lègérement" plus gourmand en mémoire.

Concernant PDO, ça à l'air d'être intéressant, mais full object.
Je me renseigne


julienr
WRInaute passionné
WRInaute passionné
 
Messages: 866
Inscription: Mar Aoû 05, 2003 14:49

Message le Mer Oct 29, 2008 13:53

+1 pour un système de template surtout avec de l'internationalisation,
une arbo avec tes templates par pays
/template/fr/
/template/en/

et même pour bien faire il te faudrait tenir compte de la culture :

/template/fr-FR/
/template/en-US/

ensuite l'archi controller / view / model c'est quand même bien pour du web

après zend, cake, et autre symphony je te conseillerais pas tout comme utiliser de l'objet pour des raisons de performances...


Bacteries
WRInaute accro
WRInaute accro
 
Messages: 1333
Inscription: Jeu Mai 27, 2004 13:04

Message le Mer Oct 29, 2008 14:22

kalagan> le classloader (en fait plutôt autoload, me suis trompé de nom) ça permet quand tu fais
$taClasse = new taClasse();

Là tu n'as pas l'import du fichier à faire.
Mais oui en haut de page tu as un fichier importé, mais de toute façon tu en aura forcément un que tu inclu sur toutes tes pages pour les variables de connexion à la BDD ou des variables "globales", non?

Ensuite ton code pour le autload ça sera plus qqchose comme ça :
Code: Tout sélectionner
<?php
function __autoload ($className)
{   
    $fileName = str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';   
    $status = (@include_once $fileName);   
   
    if ($status === false) {
        // TODO : gestion erreur
    } 
}

Plus besoin de faire d'include ou require, ce fichier fera tout le boulot.
(là mes classes ont un nom de ce type com_metalorgie_utils_String, par exemple).

Et les framework : Zend est pratique car tu peux utiliser que des parties des fonctionnalités, pas forcément rentrer dans leur architecture, ...
Et codant en java aussi, j'ai bcp de mal avec les framework java, mais là c'est vraiment bénéfique.


kalagan
Nouveau WRInaute
 
Messages: 13
Inscription: Mer Mai 21, 2008 9:02

Message le Mer Oct 29, 2008 17:55

Merci pour toutes ces infos.

J'ai tester __autoload. ça marche bien et ça diminue le nombre de lignes de codes :D


Bool
WRInaute accro
WRInaute accro
 
Messages: 1290
Inscription: Jeu Fév 26, 2004 15:59

Message le Mer Oct 29, 2008 18:03

Note : si le chargement est géré par __autoload (ou l'équivalent via la SPL) on peut remplacer include_once() par include().
D'autant plus que include_once() a bien mauvaise réputation coté perfs.


Formation recommandée sur ce thème :

Formation Référencement naturel Google : apprenez une méthode efficace pour optimiser à fond le référencement naturel dans Google de façon durable... Formation animée par Olivier Duffez et Fabien Facériès, experts en référencement naturel.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités