JeuWeb - Crée ton jeu par navigateur
Petite solution pour alléger le code de certains - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Petite solution pour alléger le code de certains (/showthread.php?tid=4322)

Pages : 1 2 3


RE: Petite solution pour alléger le code de certains - QuentinC - 10-09-2009

Citation :APC est propre à PHP, il cache l'opcode de manière totalement automatique. Tu gagnes environ 25% de performances sur les traitements PHP rien qu'en l'installant.
tu veux dire... sans rien toucher d'autre ?


Citation :Un connect à une base prend bien le temps de 10 à 15 requêtes... Méditez déjà cela avant de compter votre nombre de ligne
Ca, c'est pas nouveau et je le savais. Mais à ce que je sache, les connexions permanentes ne sont pas possibles. A moins qu'on puisse stocker un objet PDO dans un des cache mentionnés ci-dessus ? mais je n'y crois pas trop.

P.s. celui qui a pensé mysql_pconnect doit sortir... ça n'a jamais marché chez moi, pas plus que pfsockopen d'ailleurs, et de toute façon c'est de la deprecated API.


RE: Petite solution pour alléger le code de certains - Anthor - 10-09-2009

(10-09-2009, 01:48 PM)QuentinC a écrit :
Citation :APC est propre à PHP, il cache l'opcode de manière totalement automatique. Tu gagnes environ 25% de performances sur les traitements PHP rien qu'en l'installant.
tu veux dire... sans rien toucher d'autre ?

Oui ^^

(10-09-2009, 01:48 PM)QuentinC a écrit :
Citation :Un connect à une base prend bien le temps de 10 à 15 requêtes... Méditez déjà cela avant de compter votre nombre de ligne
Ca, c'est pas nouveau et je le savais. Mais à ce que je sache, les connexions permanentes ne sont pas possibles. A moins qu'on puisse stocker un objet PDO dans un des cache mentionnés ci-dessus ? mais je n'y crois pas trop.

P.s. celui qui a pensé mysql_pconnect doit sortir... ça n'a jamais marché chez moi, pas plus que pfsockopen d'ailleurs, et de toute façon c'est de la deprecated API.

C'est surtout pour dire que ca sert à rien de te demander si tu fais 5 requêtes ou 7... en plus avec APC la question ne se posera plus.

Et effectivement ces fonctions ne marchent pas de base, elle ne fonctionne que si php est exécuté en module. M'enfin je vois pas ce qu'elle viennent foutre ici.


RE: Petite solution pour alléger le code de certains - QuentinC - 10-09-2009

Je change peut-être un peu de sujet mais j'avais une question à propos d'APC.
Je viens de l'installer et je voulais savoir s'il y avait moyen d'exécuter une certaine action juste avant qu'une variable ne soit supprimée à cause de son TTL. Un genre de destructeur ultime, si on veut bien.


RE: Petite solution pour alléger le code de certains - Sephi-Chan - 10-09-2009

Merci de poser les questions relatives à l'optimisation dans le sujet Optimiser une application Web. Wink

L'optimisation est un sujet très intéressant, surtout que ça peut servir à pas mal de gens, on peut voir que certains ne savent pas vraiment quoi optimiser, l'expérience des autres peut sans doute les aider.


Sephi-Chan


RE: Petite solution pour alléger le code de certains - zeppelin - 11-09-2009

Voilà une petite ressource qui gére les ressources ( *smile* )

En gros ça simplifie pas mal la gestion dans les scripts, ça update seulement en cas de besoin etc, bref on économise beaucoup de lignes de codes et un peu de ressource serveur :-)


Code PHP :
<?php

class Ressources {

private static
$instance = null;

private
$ressource;
private
$startRessource;

private
$message = array();
private
$debugging = array();


private function
__construct()
{
$ressourcesExistantes = array('bois', 'metal', 'pierre'); // en principe déjà définit dans la conf...

foreach($ressourcesExistantes as $key => $value)
{
$this->ressource[$value] = $_SESSION['ressources'][$value];
}

$this->startRessource = $this->ressource;
}


public static function
getInstance()
{
if(
is_null(self::$instance)) self::$instance = new Ressources();
return
self::$instance;
}


public function
__set($ressource, $value)
{
if(
array_key_exists($ressource, $this->ressource))
{
$this->ressource[$ressource] = $value;
}
else
$this->debugging[] = 'erreur lors du __set. la ressource '. $ressource .' existe pas';
}


public function
__get($ressource)
{
if(
array_key_exists($ressource, $this->ressource))
{
return
$this->ressource[$ressource];
}
else
$this->debugging[] = 'erreur lors du __get. la ressource '. $ressource .' existe pas';
}


public function
buy($array) // exemple de l'array: array('wood' => 6, 'stone' => 2)
{
foreach(
$array as $key => $value)
{
if(
$this->ressource[$key] < $value)
{
$this->message[] = 'pas assez de '. $key .'. votre achat coute '. $value .' mais vous ne disposez que de '. $this->ressource[$key]; // je vous laisse faire la mise en forme tout seul comme des grands ^^
}
}

if(
size_of($this->message > 0))
{
return
false;
}
else return
true; // ou message genre: achat effectué avec succès
}


public function
getMessages()
{
// affichage des messages
}


public function
getDebugging()
{
// affichage des messages OU (mieux en prod ^^) enregistrement dans un log file
}


public function
__destruct()
{
if(
$this->startRessource != $this->ressource)
{
// update des valeurs SESSION / MYQSL
}
}
}

?>

J'ai vite tappé le codeà l'instant même, si ça se trouve il reste quelques fautes de frappes! Pas testé donc mais ça doit être fonctionnel (en tout cas l'idée de gérer les ressources comme ça est correct je pense).

Je vais poster des exemples dès que j'ai un moment... si vous utilisez cette classe et l'améliorez pensez à la re-poster :-)

tout commentaires est le bienvenue sur mon code!!

EDIT: l'exemple promis :-)

Code PHP :
<?php 
//Dans la conf on aurait donc:

$building['maison']['bois'] = 30;
$building['maison']['fer'] = 10;
$building['maison']['pierre'] = 12;

// et dans le script pour un achat:
Ressources::getInstance()->buy($building['maison']);

et le tour est joué, on est informé si il manque quelque chose, ça nous dis ce qu'il manque etc. En cas de succès ça affiche également un message etc. En cas de problème on a tout dans notre logfile, et les ressources sont automatiquement updaté si requis (et seulement si), avec une seule petite ligne de code. Si on ajoute une ressource, un seul endroit à modifier, pareil pour les messages etc. :-)

Bref un bon exemple de puissance pour les sceptique de l'OOP, et également un bon exemple pour motiver ceux qui veulent s'y lancer (surtout qu'avec l'arrivé de PHP 6, ça va être encore plus de bonheur :-p)

Enjoy!


RE: Petite solution pour alléger le code de certains - Ter Rowan - 11-09-2009

je vais poser une question con mais ...

pourquoi les underscore devant __set et __get ?

est ce juste une convention de nommage ou est ce que cela a un sens particulier pour php ?


RE: Petite solution pour alléger le code de certains - zeppelin - 11-09-2009

Oui ça a un sens particulier, il s'agit la de deux fonctions magiques, comme le constructeur ou le destructeur. Il en existe encore d'autres, comme __call par exemple, qui est appelé si aucune fonction portant le nom désiré est déclaré.

Il serait d'ailleurs judicieux de l'ajouter à ma classe, de la manière suivante:

Code PHP :
<?php 
public function __call($method, $arguments)
{
$errorMessage = '<p>la methode '. $method .' n\'existe pas</p><p>Les arguments suivants ont été envoyé avec:</p><ul>';

foreach(
$arguments as $key => $value)
{
$errorMessage .= '<li>'. $value .'</li>';
}
$errorMessage .= '</ul>';
$this->debugging[] = $errorMessage;
}

Je te laisse te documenter sur ces méthodes, qui sont vraiment puissantes ;-)

D'ailleurs je te conseil également cette fonction si tu ne la connais pas encore, à inclure lors de l'initialisation de ton code (tout en haut donc).

Code PHP :
<?php 
/**
* Class autoloader
* Include la bonne classe automatiquement. Exemple : en faisant new Mysql, la classe Mysql.php dans le dossier library est automatiquement include dans le script!
* @param string
*/
function __autoload($className)
{
$path = library . $className . '.php';

if(
file_exists($path))
{
include_once(
$path);
}
else
{
echo
'can\'t find the class '. $className .'<p>full path : '. $path . '.php</p>';
if(...)
// si session d'admin ou ayant droits, on affiche tous les fichiers présent dans le dossier (pour controller rapidement si c'est une faute de frappe! :-))
{
echo
'
<h3>listing of files in this dir : </h3><br />
<ul>
'
;

$dirs = scandir(library);

foreach(
$dirs as $key => $value)
{
if(!
is_dir( $dir .'/'. $value ))
{
echo
'<li>'. $value .'</li>';
}
}
echo
'</ul>';
}
}

}