Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
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 29/11/2011, 15h33   #1
Invité régulier
 
Homme
Développeur Web
Inscription : novembre 2011
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : novembre 2011
Messages : 7
Points : 6
Points : 6
Par défaut PHP et la POO, optimisation des classes

Bonjour a tous,

voila sans plus attendre mon problème.
Je travaille sur un site qui va servir a ressencer les votes d'utilisateurs au sujet de fichiers .doc .
Quand je me suis lancer dans ce projet j'ai tout de suite commence a reflechir en poo.
J'ai commence par faire un petit diagrame uml pour representer les principales classes.

UML simplifie du projet

Voila en gros comment ca fonctionne : pour chaque classe list on a une classe associee et lors de l'instanciation de la classe list on va aller chercher dans la bdd toute les donnees et pour chaque entree on va instancier la classe "non liste" et l'ajoutee a la liste.

Le probleme c'est la vitesse de chargement des pages.
J'ai une page par exemple ou je ressence tout les fichier et pour chaque fichier je ressence le vote et le commentaire de chaque utilisateur. Cette page ave ma poo se charger en 10sec environs et sans en 2 sec environs. Sans poo je veux dire en mettant directement les requettes dans la page.

Je met une partie du code de ces deux pages :

Code avec la poo
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
 
<?php
	include '../class/ConnexionPDO.class.php';
	//include '../php/fonctions.php';
	date_default_timezone_set('America/Montreal');
	$date = date('m/j/Y'); 
 
	include '../class/Ballot.class.php';
	include '../class/BallotsList.class.php';
	include '../class/Comment.class.php';
	include '../class/CommentsList.class.php';
	include '../class/Standard.class.php';
	include '../class/StandardsList.class.php';
	include '../class/User.class.php';
	include '../class/UsersList.class.php';
 
	$bList = new BallotsList();
	$cList = new CommentsList();
	$sList = new StandardsList();
	$uList = new UsersList();
	$pdo = null;
?>
 
 
...
 
 
<?php
foreach($sList->getStandards() as $s) {
	$yes = 0;
	$no = 0;
	echo '<h2>'.$s->getName().'</h2>';
	echo '
	<div id = "wasSend'.$s->getNum().'" class="notification notification_green hide">
		<b>GREAT! Your email was send.</b><div class="notification_close"> Close </div>
	</div>
	';
	echo '<table id="tablo" style = "width : 99%;margin-right:1%;">
	<tr><th>Name</th><th>Vote</th><th>Comment</th><th></th></tr>';
	foreach($uList->getList() as $u) {
		if($u->getCommitee() == 'subcommitee') {
			$b = $bList->getByStandName($s->getNum(), $u->getNum());
			if(!$b) {
				$b = ' - ';
				$c = 0;
			}
			else {
				$c = $cList->getByTargetNameType($b->getNum(), $u->getNum(), 1);
				switch($b->getValue()) {
					case 0 :
						$b = 'No';
						$no++;
						break;
					case 1 :
						$b = 'Yes';
						$yes++;
						break;
					case 2 :
						$b = 'Yes';
						$yes++;
						break;
					case 3 :
						$b = 'Abstain';
						$yes++;
						break;
				}
			}
 
			if(!$c) {
				$c = '';
			}
			else {
				$c = $c->getText();
				if(strlen($c) > 100) {
					$c = substr($c, 0, 100). ' [...]';
				}
			}
			echo '<tr><td>'.$u->getName().'</td><td><center>'.$b.'</center></td><td style = "text-align : justify;">'.$c.'</td><td><center><a href = "fichePerso.php?id='.$u->getNum().'">Details</a></center></td></tr>';
		}
	}
	echo '<tr><td><b>Result</b></td><td style = "width : 100px;">Positive : <span style = "color : green;">'.$yes.'</span><br /> Negative : <span style = "color : red;">'.$no.'</span></td><td> </td><td><center><input type = "button" value = "Send" id = "'.$s->getNum().','.$yes.','.$no.'" name = "'.$s->getNum().'" onClick = "sendEmail(this)"/></center></td></tr>';
	echo '</table>';
}
?>
Code sans poo
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
 
<?php
$pdo = new PDO(HOST, USERNAME, PASSWORD);
foreach($pdo->query('SELECT * FROM standards') as $s) {
	$yes = 0;
	$no = 0;
	echo '<h2>'.$s['name'].'</h2>';
	echo '
	<div id = "wasSend'.$s['id'].'" class="notification notification_green hide">
		<b>GREAT! Your email was send.</b><div class="notification_close"> Close </div>
	</div>
	';
	echo '<table id="tablo" style = "width : 99%;margin-right:1%;">
	<tr><th>Name</th><th>Vote</th><th>Comment</th><th></th></tr>';
	foreach($pdo->query('SELECT * FROM users') as $u) {
		if($u['commitee'] == 'subcommitee') {
			$b = $pdo->query('SELECT * FROM ballots WHERE standard = '.$s['id'].' AND name = '.$u['id']);
			if(!$b = $b->fetch()) {
				$b = ' - ';
				$c = 0;
			}
			else {
				$c = $pdo->query('SELECT * FROM comments WHERE commentOf = '.$b['id'].' AND commentBy = '.$u['id'].' AND type = 1');
				switch($b['value']) {
					case 0 :
						$b = 'No';
						$no++;
						break;
					case 1 :
						$b = 'Yes';
						$yes++;
						break;
					case 2 :
						$b = 'Yes';
						$yes++;
						break;
					case 3 :
						$b = 'Abstain';
						$yes++;
						break;
				}
			}
 
			if($c === 0) {
				$c = '';
			}
			else {
				$c = $c->fetch();
				$c = $c['text'];
				if(strlen($c) > 100) {
					$c = substr($c, 0, 100). ' [...]';
				}
			}
			echo '<tr><td>'.$u['firstName'].' '.$u['lastName'].'</td><td><center>'.$b.'</center></td><td style = "text-align : justify;">'.$c.'</td><td><center><a href = "fichePerso.php?id='.$u['id'].'">Details</a></center></td></tr>';
		}
	}
	echo '<tr><td><b>Result</b></td><td style = "width : 100px;">Positive : <span style = "color : green;">'.$yes.'</span><br /> Negative : <span style = "color : red;">'.$no.'</span></td><td> </td><td><center><input type = "button" value = "Send" id = "'.$s['id'].','.$yes.','.$no.'" name = "'.$s['id'].'" onClick = "sendEmail(this)"/></center></td></tr>';
	echo '</table>';
}
?>
Et un exemple des classe (elle sont toute plus ou moins semblable) :
Liste
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
 
<?php
 
class BallotsList {
 
	private $bList = array();
	private $nb;
 
	function __construct() {
		$this->creerList();
	}
 
	private function creerList() {
		$pdo = new PDO(HOST, USERNAME, PASSWORD);
		$nb = 0;
		foreach($pdo->query('SELECT * FROM ballots') as $b) {
			$ballot = new Ballot($b['id'], $b['standard'], $b['name'], $b['value']);
 
			array_push($this->bList, $ballot);
			$nb++;
		}
		$this->nb =  $nb;
	}
 
	function getList() {
		return $this->bList;
	}
 
	function getByNum($n) {
		foreach($this->bList as $b) {
			if($b->getNum() == $n) return $b;
		}
	}
 
	function getByStandard($s) {
		$resultats = array();
		foreach($this->bList as $b) {
			if($b->getStandard() == $s) {
				array_push($resultats, $b);
			}
		}
		return $resultats;
	}
 
	function getByName($n) {
		$resultats = array();
		foreach($this->bList as $b) {
			if($b->getName() == $n) {
				array_push($resultats, $b);
			}
		}
		return $resultats;
	}
 
	function getByStandName($s, $n) {
		foreach($this->bList as $b) {
			if($b->getName() == $n && $b->getStandard() == $s) {
				return $b;
			}
		}
 
		return false;
	}
}
 
?>
"non Liste"
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
 
<?php
 
class Ballot {
 
	private $num;
	private $standard;
	private $name;
	private $value; // 0 = no with comment, 1 = yes, 2 = yes with comment, 3 = abstain
 
	function __construct($n, $s, $na, $v) {
		$pdo = new PDO(HOST, USERNAME, PASSWORD);
		if($n == '') {
			$insert = 1;
			$n = $pdo->query('SELECT max(id) as id FROM ballots');
			$n = $n->fetch();
			$this->num = $n['id'] + 1;
		}
		else {
			$insert = 0;
			$this->num = $n;
		}
		$this->standard = $s;
		$this->name = $na;
		$this->value = $v;
		if($insert)  {
			$pdo->query('INSERT INTO ballots (id, standard, name, value) VALUES ('.$this->num.', '.$this->standard.', '.$this->name.', '.$this->value.')');
		}
	}
 
	function getNum() {
		return $this->num;
	}
 
	function getStandard() {
		return $this->standard;
	}
 
	function getName() {
		return $this->name;
	}
 
	function getValue() {
		return $this->value;
	}
 
	function setStandard($s) {
		$pdo = new PDO(HOST, USERNAME, PASSWORD);
		$pdo->query('UPDATE ballots SET standard = '.$s.' WHERE id = '.$this->getNum());
		$this->standard = $s;
	}
 
	function setName($n) {
		$pdo = new PDO(HOST, USERNAME, PASSWORD);
		$pdo->query('UPDATE ballots SET name = '.$n.' WHERE id = '.$this->getNum());
		$this->name = $n;
	}
 
	function setValue($v) {
		$pdo = new PDO(HOST, USERNAME, PASSWORD);
		$pdo->query('UPDATE ballots SET value = '.$v.' WHERE id = '.$this->getNum());
		$this->value = $v;
	}
}
 
?>
Voila, merci d'avance pour votre aide!
Coubas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2011, 15h48   #2
Rédacteur
 
Avatar de Halleck
 
Développeur PHP & Architecte logiciel
Inscription : mars 2003
Messages : 562
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Loiret (Centre)

Informations professionnelles :
Activité : Développeur PHP & Architecte logiciel

Informations forums :
Inscription : mars 2003
Messages : 562
Points : 1 379
Points : 1 379
Rien a voir avec la POO

Tu instancie n fois PDO, avec à chaque fois une nouvelle connexion vers ta base de données, donc évidemment tu as un goulot d'étranglement...

De plus si tu as vraiment des soucis de perf, enlève tes "Select *", exploite PDO (requêtes préparées...). Une fois que tu seras bon de ce côté là, là tu pourras regarder du côté de PHP.

Et avant ça je te conseille fortement de suivre quelques cours sur la poo. Le code que tu indique "avec poo" est en réalité du procédural ; Programmer Objet ne consiste pas à utiliser le mot "class" mais à penser ton code de manière Objet. Tu trouveras ce qu'il te faut ici : http://php.developpez.com/cours/

Pour info je bosse sur des applications avec des milliers d'objets, il n'y a aucun problème. Rassure toi, le moteur Objet de PHP est très performant

Bon courage !
__________________
Zend PHP Certified Engineer
tutoriels : tutos PHP, Web & SEO blog : blog.lepine.pro
membre de l'AFUP (Association des Utilisateurs de PHP)
Halleck est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 29/11/2011, 16h16   #3
Invité régulier
 
Homme
Développeur Web
Inscription : novembre 2011
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : novembre 2011
Messages : 7
Points : 6
Points : 6
Merci pour ta réponse.
Et oui je me doute bien que j'ai encore pas mal de boulot.
Pour l'instanciation de pdo j'utilise une classe que j'ai cree et qui herite de pdo dans laquelle la connexion est stokee dans une variable statique, je pensais que du coup je n'avais pas de probleme d'instanciation multiple.
Je te met le code :
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
25
26
27
28
<?php 
class ConnexionPDO extends PDO
{
	private static $_instance;
 
	function __construct()
	{}
 
	static function getInstance()
	{
		if (!isset(self::$_instance)) {
 
			try {
 
				self::$_instance = new PDO(HOST, USERNAME, PASSWORD);
 
			} catch (PDOException $e) {
 
				echo $e;
			}
		} 
		return self::$_instance; 
 
	}
 
 
}
?>
Apres pour la cote POO qui n'en est pas, je crois que je comprend ce que tu veux dire mais c'est mon premier projet proffessionnel et j'ai encore un peu de mal a faire face :p.

Pour en revenir a ma question de vitesse de chargement, c'est possible que ca soit causer par l'instanciation de PDO? Meme avec la variable statique?

En ce qui concerne les requettes prepaprees je vais les mettre en place pour voir si il y a du changement.

edit : pour les requetes preparees, dans les classes liste je ne fais qu'une requete dans le constructeur pour recuperer tout les champs (j'ai vraiment besoin du SELECT * d'ailleurs) donc la requete preparee n'apporterai rien ici il me semble.
Coubas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2011, 17h40   #4
Invité régulier
 
Homme
Développeur Web
Inscription : novembre 2011
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : novembre 2011
Messages : 7
Points : 6
Points : 6
Bon j'ai revu toute mes classes pour supprimer les instanciation multiple de la connection a la bdd en passant en parametre au constructeur une instance qui sert pour toute la page.
Des 10 sec de chanrgement je suis passe a un peu moins de 2sec.
Donc probleme resolu.
Merci pour votre aide et pour le prochain projet je j'ai bosser mes concept d'objet (si le client me laisse le temps).
Coubas est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h31.


 
 
 
 
Partenaires

Hébergement Web