Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > Templates > Smarty
Smarty Forum d'entraide sur le moteur de templates Smarty. Avant de poster -> FAQ Smarty et Cours Smarty
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 08/06/2007, 23h06   #1
Rédacteur
 
Avatar de Arnaud F.
 
Homme Arnaud Feltz
Développeur .NET
Inscription : août 2005
Messages : 5 204
Détails du profil
Informations personnelles :
Nom : Homme Arnaud Feltz
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Développeur .NET
Secteur : Transports

Informations forums :
Inscription : août 2005
Messages : 5 204
Points : 6 113
Points : 6 113
Par défaut Mise en cache

Salut tout le monde,

dans le souci d'optimisation de mon site, j'aimerai mettre une partie de ma page en cache. En effet, c'est la base commune de toutes mes pages, juste le contenu change.

Ma page :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
{include file="header.tpl" css="$css" js="$js" isGoogleMap="$isGoogleMap" cle="$cle"}
 
<div id="banniere">
    <strong><h2><img src="banniere.png" alt="Banni&egrave;re de Buchsy.fr" /></h2></strong>
</div>
<ul id="menu">
    <li><a href="index.php">Accueil</a></li>
    <li><a href="CV.pdf" target="_blank">CV</a></li>
    <li><a href="GoogleMaps.php">GoogleMaps</a></li>
</ul>
{include file="$contenu"}
{include file="footer.tpl"}

Comme vous pouvez le voir, c'est juste le contenu qui change, et j'aurai aimé savoir comment mettre tout ça dans le cache ( sans le contenu bien évidemment vu qu'il change tout le temps ).

J'ai lu que c'était possible, mais n'est pas du tout compris comment je devais faire pour m'y prendre

Il n'y a que très peu de documentations sur ce sujet et c'est regrettable... ( le forum fr de smarty étant plus ou moins mort, ce n'est même pas la peine d'attendre une réponse, y a un post par jour... )
__________________
C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

Installation de Code::Blocks sous Debian à partir de Nightly Builds
Arnaud F. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2007, 23h21   #2
Membre éclairé
 
Avatar de makmaoui
 
Développeur Web
Inscription : mai 2007
Messages : 282
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mai 2007
Messages : 282
Points : 361
Points : 361
Salut,

c'est plus en Javascript que tu peux gérer ça mais je pense que les navigateurs gérent la mise en cache lors du premier chargement de ta page .
makmaoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2007, 01h22   #3
Inscrit
 
Avatar de is_null
 
Inscription : octobre 2006
Messages : 637
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 637
Points : 690
Points : 690
Ca-est peu ?
http://smarty.php.net/manual/fr/caching.php
Par contre, je crains que de mettre en cache l'exterieur ne previennent de compiler l'interieur ... Je vous propose de regarder dans le dossier de compilation de smarty ...

EDIT : fonction {set_cache_lifetime}
__________________
Q: Dois-je haïr et cogner sur Microsoft ?
R: Non, vous n'êtes pas obligé. Non pas que Microsoft n'est pas écoeurant, mais il y avait une culture hacker bien avant Microsoft et il y en aura une bien après que Microsoft aura été de l'histoire ancienne. Toute énergie dépensée à haïr Microsoft serait mieux employée par vos compétences et votre passion. Écrivez du bon code, cela brisera suffisamment Microsoft sans polluer votre karma.
Comment devenir un hacker ? par Eric Steven Raymond
is_null est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2007, 14h21   #4
Rédacteur
 
Avatar de Arnaud F.
 
Homme Arnaud Feltz
Développeur .NET
Inscription : août 2005
Messages : 5 204
Détails du profil
Informations personnelles :
Nom : Homme Arnaud Feltz
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Développeur .NET
Secteur : Transports

Informations forums :
Inscription : août 2005
Messages : 5 204
Points : 6 113
Points : 6 113
Je ne veux pas gérer cela en JS pusique je peux le faire avec Smarty et que ça fait même partie de ces avantages, quant à is_null, je te remercie mais j'ai déjà lu et relu la doc, je vois pas comment ça marche

__________________
C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

Installation de Code::Blocks sous Debian à partir de Nightly Builds
Arnaud F. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2007, 20h10   #5
Membre Expert
 
Avatar de eric.pommereau
 
Homme ERIC POMMEREAU
Ingénieur intégration
Inscription : décembre 2004
Messages : 683
Détails du profil
Informations personnelles :
Nom : Homme ERIC POMMEREAU
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Ingénieur intégration
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : décembre 2004
Messages : 683
Points : 1 294
Points : 1 294
Bonjour,

As-tu "simplement" essayé de:
  • Mettre caching à 1
  • Règler le cache_life time
  • Puis faire ton display

Code :
1
2
3
$smarty->caching = 1;
$smarty->cache_lifetime = 3600;
$smarty->display('mapage.tpl');
@+
eric.pommereau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/06/2007, 18h39   #6
Rédacteur
 
Avatar de Arnaud F.
 
Homme Arnaud Feltz
Développeur .NET
Inscription : août 2005
Messages : 5 204
Détails du profil
Informations personnelles :
Nom : Homme Arnaud Feltz
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Développeur .NET
Secteur : Transports

Informations forums :
Inscription : août 2005
Messages : 5 204
Points : 6 113
Points : 6 113
Bon, j'ai réussi à ne plus avoir les Warnings

Et il rentre bien dans la fonction insert_getContenu()

Mon index.php est dorénavant comme ça :
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
<?php
    include('configs/smarty.class.php');
    require_once('configs/mysql.class.php');
 
    $mysql = new MySQL;
    $smarty = new MySmarty;
 
    function insert_getContenu(){
        $liste_news= $mysql->getNews();
    $entetes= array();
    $contenus= array();
    $pieds= array();
    foreach ($liste_news as $news) {
        array_push($entetes, $news->entete);
        array_push($contenus, $news->contenu);
        array_push($pieds, $news->pied);
    }
    $smarty->assign('entetes', $entetes);
    $smarty->assign('contenus', $contenus);
    $smarty->assign('pieds', $pieds);
    $smarty->assign('contenu', 'accueil.tpl');
    }
 
 
    $smarty->display('index.tpl');
?>
Seul souci, c'est que j'ai cette erreur :
Citation:
Fatal error: Call to a member function getNews() on a non-object in C:\wamp\www\Site_sync\index.php on line 11
je penche pour une question de portée de variable, de plus, je ne sais pas si c'est bien comme ça qu'il faut gérer la mise en cache !

Cette fonction à l'air d'être appelée tout le temps lors de chaque raffraichissement de page

__________________
C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

Installation de Code::Blocks sous Debian à partir de Nightly Builds
Arnaud F. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/06/2007, 21h30   #7
Membre éprouvé
 
Inscription : mars 2002
Messages : 516
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 516
Points : 483
Points : 483
Envoyer un message via MSN à Sylvain James
Là le compilo veut dire que ta variable $mysql n'est pas un objet, donc ça revient à dire que le "new MySQL" n'a pas fonctionné.

Je pense que c'est parce que tu as oublié les parenthèses derrière MySQL :

Au passage il est préférable de donner des noms de variable plus explicite (ex. $mesNewsDB ou $mesNewSQL etc et surtout éviter d'éventuels mot clés du langage ($mysql serait un bon candidat).

En espérant que ça fonctionnera mieux, bon courage !

Sylvain
__________________
.NET / ASP.NET MVC / Delphi / XMLRAD / XSL / Technos Web

Mon Blog : http://blog.developpez.com/index.php?blog=89
Mes Articles : http://sjames.developpez.com/
Rubrique XMLRAD: http://xmlrad.developpez.com
Sylvain James est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/06/2007, 22h48   #8
Rédacteur
 
Avatar de Arnaud F.
 
Homme Arnaud Feltz
Développeur .NET
Inscription : août 2005
Messages : 5 204
Détails du profil
Informations personnelles :
Nom : Homme Arnaud Feltz
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Développeur .NET
Secteur : Transports

Informations forums :
Inscription : août 2005
Messages : 5 204
Points : 6 113
Points : 6 113
Au passage, quand je sors tout ça de la fonction, ça fonctionne très bien ! C'est vrai, j'avais oublié de le préciser, désolé d'avoir oublié

En gros, si je fais pas mon insert et que je fais pas de mise en cache, tout roule comme sur des roulettes, je pense plus pour une histoire de portée de variables qu'autre chose

++
__________________
C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

Installation de Code::Blocks sous Debian à partir de Nightly Builds
Arnaud F. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/06/2007, 23h26   #9
Inscrit
 
Avatar de is_null
 
Inscription : octobre 2006
Messages : 637
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 637
Points : 690
Points : 690
global $smarty, $mysql; // n'est ce pas
Au fait, pour regler la mise en cache individuellement par fichier, c'est a 2 qu'il faut regler $oSmarty->caching
EDIT : fonction {set_cache_lifetime}
__________________
Q: Dois-je haïr et cogner sur Microsoft ?
R: Non, vous n'êtes pas obligé. Non pas que Microsoft n'est pas écoeurant, mais il y avait une culture hacker bien avant Microsoft et il y en aura une bien après que Microsoft aura été de l'histoire ancienne. Toute énergie dépensée à haïr Microsoft serait mieux employée par vos compétences et votre passion. Écrivez du bon code, cela brisera suffisamment Microsoft sans polluer votre karma.
Comment devenir un hacker ? par Eric Steven Raymond
is_null est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2007, 17h16   #10
Membre Expert
 
Avatar de eric.pommereau
 
Homme ERIC POMMEREAU
Ingénieur intégration
Inscription : décembre 2004
Messages : 683
Détails du profil
Informations personnelles :
Nom : Homme ERIC POMMEREAU
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Ingénieur intégration
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : décembre 2004
Messages : 683
Points : 1 294
Points : 1 294
Je me demande comment on peut faire pour activer le cache individuellement (indépendament selon le fichier de template)... et en gardant la souplesse des includes:

Code :
{include file="footer.tpl"}
Je n'ai rien trouvé là dessus...
eric.pommereau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2007, 18h36   #11
Inscrit
 
Avatar de is_null
 
Inscription : octobre 2006
Messages : 637
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 637
Points : 690
Points : 690
Pareil, j'ai demande sur #smarty@irc.freenode.net mais je n'ai eu aucune reponse ...
Je chercherais dans le code de smarty des que j'en arriverais la (selon mon planning, probablement pas avant la semaine prochaine, d'autant qu'on tente de me noyer sous une avalanche de rapports de bugs).
Au pire, il est probablement pas trop dur de faire une petite fonction/classe pour smarty pour emuler un {include} avec souplesse de cache.

Mais depuis que j'ai appris au sujet de tokenizer, je brule d'envie de passer a Flexy...
__________________
Q: Dois-je haïr et cogner sur Microsoft ?
R: Non, vous n'êtes pas obligé. Non pas que Microsoft n'est pas écoeurant, mais il y avait une culture hacker bien avant Microsoft et il y en aura une bien après que Microsoft aura été de l'histoire ancienne. Toute énergie dépensée à haïr Microsoft serait mieux employée par vos compétences et votre passion. Écrivez du bon code, cela brisera suffisamment Microsoft sans polluer votre karma.
Comment devenir un hacker ? par Eric Steven Raymond
is_null est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/06/2007, 11h26   #12
Rédacteur
 
Avatar de Arnaud F.
 
Homme Arnaud Feltz
Développeur .NET
Inscription : août 2005
Messages : 5 204
Détails du profil
Informations personnelles :
Nom : Homme Arnaud Feltz
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Développeur .NET
Secteur : Transports

Informations forums :
Inscription : août 2005
Messages : 5 204
Points : 6 113
Points : 6 113
Le seul article trouvé sur le net au sujet de la gestion du cache se trouve ici, enfin qui parle de gestion individuelle...

Sinon, merci, je tenterai tout ça

Au pire pour l'include du footer, je fais un fetch dans mon script PHP de ce dernier et remplace mon include par le résultat du fetch via une variable

__________________
C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

Installation de Code::Blocks sous Debian à partir de Nightly Builds
Arnaud F. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/06/2007, 15h20   #13
Inscrit
 
Avatar de is_null
 
Inscription : octobre 2006
Messages : 637
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 637
Points : 690
Points : 690
Visilbelement, c'est {insert} qu'il faut utiliser a la place d'{include} :
Citation:
Envoyé par http://smarty.php.net/manual/fr/language.function.insert.php
Les balises {insert} fonctionnent à peu près comme les balises {include}, à l'exception que leur sortie n'est PAS placée en cache lorsque le cache du template est activé. Les balises {insert} seront exécutées à chaque appel du template.
EDIT : fonction {set_cache_lifetime}
/EDIT

Mais j'ai ajoute une petite methode smartInclude() a Smarty pour gerer mes caches de sortie & caches de code php. Je n'ai pas termine de tester mais ca donne ca pour l'instant :
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
$aSmartyCacheLifetime = array('home'              => 0,
                              'checkout'          => 0,
                              'details'           => -1,
                              'index'             => -1,
                              'recover_password'  => -1,
                              'results'           => 3600,
                              'search_form'       => -1,
                              'search'            => 0,
                              'shopping_cart'     => 0,
                              'standalone_results' => 0,
                              'thumbnails'        => -1,
                              'thumbnail'         => -1,
                              'user_controls'     => -1,
                              'wishlist_email'    => -1,
                              'wishlists'         => 600,
                              'wishlist'          => 600,);
 
$aSmartyCacheIdCallback = array('details' => 'cacheid_template',
                                'results' => '/[0-9]{1,9}/',
                                'thumbnail' => 0,
                                'wishlist' => '/[0-9]{1,12}/',);
$aSmartyCacheIdCallback['thumbnail'] = $aSmartyCacheIdCallback['details'];
 
require_once 'smarty/Smarty.class.php';
 
class Smarty_Site extends Smarty {
 
   function Smarty_Site()
   {
      /* [...] */
   }
 
  public function smartInclude($params, &$smarty) {
    global $aSmartyCacheLifetime, $aSmartyCacheIdCallback;
    if(empty($params['file'])) {
      return '';
    }
    $file                   = str_replace('.tpl', '', $params['file']);
    if (isset($aSmartyCacheLifetime[$file])&&empty($params['lifetime'])) {
      $params['lifetime'] = $aSmartyCacheLifetime[$file];
    }
    $smarty->caching        = 2;
    $smarty->cache_lifetime = $params['lifetime'];
    $action                 = (isset($aSmartyCacheIdCallback[$file]))
                            ? $aSmartyCacheIdCallback[$file] : false;
    if(empty($params['id'])||!$action) {
      return $smarty->fetch($file.'.tpl');
    } elseif (@preg_match($action, $params['id'])) {
      return $smarty->fetch($file.'.tpl', $params['id']);
    } elseif (function_exists($action)) {
      return $smarty->fetch($file.'.tpl',
                            $action($params['id']));
    } else {
      return 'Invalid : $aSmartyCacheIdCallback['.$file.']';
    }
  }
 
}
 
function cacheid_template($id_tm) {
  global $TM_Cart, $TM_Wishlist;
  $id_cache = (isset($TM_Wishlist->aWishlist[$id_tm])) ? 'y' : 'n';
  $id_cache .= (isset($TM_Cart->aCart[$id_tm])) ? 'y' : 'n';
  $id_cache .= $id_tm;
  return $id_cache;
}
/* [...] */
$oSmarty->register_function('smart_include', array(&$oSmarty, 'smartInclude'));
Ca permet aussi de passer un id de cache directement en tant qu'argument et de le valider par un regexp ou de le passer dans une fonction de callback ...
On voit l'interet quand on sait qu'il y a 10000 $id_tm statiques (on va economiser un paquet de requetes ...)
__________________
Q: Dois-je haïr et cogner sur Microsoft ?
R: Non, vous n'êtes pas obligé. Non pas que Microsoft n'est pas écoeurant, mais il y avait une culture hacker bien avant Microsoft et il y en aura une bien après que Microsoft aura été de l'histoire ancienne. Toute énergie dépensée à haïr Microsoft serait mieux employée par vos compétences et votre passion. Écrivez du bon code, cela brisera suffisamment Microsoft sans polluer votre karma.
Comment devenir un hacker ? par Eric Steven Raymond
is_null est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/06/2007, 15h45   #14
Rédacteur
 
Avatar de Arnaud F.
 
Homme Arnaud Feltz
Développeur .NET
Inscription : août 2005
Messages : 5 204
Détails du profil
Informations personnelles :
Nom : Homme Arnaud Feltz
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Développeur .NET
Secteur : Transports

Informations forums :
Inscription : août 2005
Messages : 5 204
Points : 6 113
Points : 6 113
J'ai pas trop compris ce que tu cherches à faire is_null, en tout cas, je sais qu'il faut utiliser la fonction insert puisque je l'ai fais!

L'include de mon footer sera statique, ( pas le header car pour la GoogleMap, il faut rajouter des choses )

En fait je comprend pas la différence entre la balise insert qui renvoi vers une fonction php du type insert_NAME et la méthodes is_cached de Smarty..

Bref comment faire pour les utiliser quoi...

Je trouve Smarty relativement puissant seulement la doc et les explications ne courent pas les rues et je trouve ça dommage ! Surtout pour le cache qui est quand même un des points forts de Smarty...

Enfin bref, je trouverai déjà comment faire,

__________________
C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

Installation de Code::Blocks sous Debian à partir de Nightly Builds
Arnaud F. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2007, 10h49   #15
Inscrit
 
Avatar de is_null
 
Inscription : octobre 2006
Messages : 637
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 637
Points : 690
Points : 690
En fait je comprend pas la différence entre la balise insert qui renvoi vers une fonction php du type insert_NAME et la méthodes is_cached de Smarty..

Bref comment faire pour les utiliser quoi...

Je trouve Smarty relativement puissant seulement la doc et les explications ne courent pas les rues et je trouve ça dommage ! Surtout pour le cache qui est quand même un des points forts de Smarty...

L'example 14.4 demontre simplement l'interet de is_cached pour preserver le serveur de requetes inutiles.
==

Ca peut vous interresser ...
http://smarty.php.net/manual/en/sect...ndler.func.php
==

J'ai trouvé, on est vraimment trop bete.
Il suffit d'ajouter :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function set_cache_lifetime($params, &$smarty = false) {
  if (is_array($params) && isset($params['time'])) {
    $smarty->cache_lifetime = $params['time'];
  } elseif (is_numeric($params)) {
    $smarty->cache_lifetime = $params;
  }
  else {
    return 'Invalid cache lifetime (); Usage : {set_cache_lifetime time=$iSeconds}';
  }
}
set_cache_lifetime(3600, $oSmarty);
// Et pour dans le template
$oSmarty->register_function('set_cache_lifetime', 'set_cache_lifetime');
/*
{set_cache_lifetime time=3600}
*/
==
Update du code précédent
Code php :
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
 
class Me extends Smarty {
  /**
   * Array[file] = cacheid_regexp_or_callback_function
   * @access          public
   * @var             array
   */
  public $aIdCallback = array('details'     => '/[0-9]{3,5}/',
                              'results'     => '/[0-9]{1,9}/',
                              'thumbnail'   => '/[0-9]{3,5}/',
                              'thumbnails'  => '/([0-9]{3,5}\.?)*/',
                              'wishlist'    => '/[0-9]{1,12}/',);
  /**
   * Function to set and control/process the cache_id
   *
   * Example usage :
   * <code>{smart_include file='foo.tpl' cacheid=$id_foo}</code>
   * Don't forget to :
   * <code>$oSmarty->register_function('smart_include', array(&$oSmarty, 'smartFetch'));</code>
   * @uses aIdCallback
   * @uses fetch
   * @return  bool
   */
  public function smartFetch($params, &$smarty = false) {
    $aIdCallback = $this->aIdCallback;
    if(!isset($params['file'])||empty($params['file'])) {
      return '';
    } else {
      $params['file'] = str_replace('.tpl', '', $params['file']);
    }
    $file = $params['file'];
    $action = (array_key_exists($file, $aIdCallback))
              ? $aIdCallback[$file] : false;
    $action = (isset($aIdCallback[$file]))
              ? $aIdCallback[$file] : false;
    if(empty($params['cacheid'])&&!$action) {
      return $this->fetch($file.'.tpl');
    } elseif (@preg_match($action, $params['cacheid'])) {
      return $this->fetch($file.'.tpl', $params['cacheid']);
    } elseif (function_exists($action)) {
      return $this->fetch($file.'.tpl',
                            $action($params['cacheid']));
    } else {
      return 'Invalid : $aIdCallback['.$file.']';
    }
  }
}
$oSmarty->register_function('smart_include', array(&$oSmarty, 'smartFetch'));
__________________
Q: Dois-je haïr et cogner sur Microsoft ?
R: Non, vous n'êtes pas obligé. Non pas que Microsoft n'est pas écoeurant, mais il y avait une culture hacker bien avant Microsoft et il y en aura une bien après que Microsoft aura été de l'histoire ancienne. Toute énergie dépensée à haïr Microsoft serait mieux employée par vos compétences et votre passion. Écrivez du bon code, cela brisera suffisamment Microsoft sans polluer votre karma.
Comment devenir un hacker ? par Eric Steven Raymond
is_null 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 11h40.


 
 
 
 
Partenaires

Hébergement Web