C'est la saison des benchmarks autour d'eZ Publish :) Bertrand a fait une intéressante comparaison entre le mode cluster et le mode classique, suivi de près par un article sur ez.no mettant en évidence le gain apporté par le fameux Stale Cache dans la génération du cache de contenu. De mon côté, j'ai adapté les scripts de mon benchmark entre eZ Publish 3.10 et eZ Publish 4 pour comparer cette fois uniquement les performances sur une page en cache de ce site (/blog) avec eZ Publish 4.0.1, eZ Publish 4.1 sans optimisation et eZ Publish 4.1 avec un fichier config.php ; le but étant de déterminer le gain apporté par les différentes améliorations de performances pour un site sur un seul serveur.
Le fichier config.php :
<?php define( 'EZP_USE_BUNDLED_COMPONENTS', true ); define( 'EZP_INI_FILEMTIME_CHECK', false ); ?>
Le résultat est plutôt spectaculaire. La simple mise à jour en 4.1 donne un gain de presque 30% dans la distribution d'une page en cache ! Avec la configuration ci-dessus dans le fichier config.php le gain est même de 50% ! Pendant les phases de tests, j'ai également constaté que la charge de la machine est bien plus faible. Comme d'habitude ces chiffres sont à prendre avec des pincettes, ils représentent le gain sur un site bien optimisé (enfin j'espère) sur un serveur bas de gamme. Un test sur un serveur plus haut de gamme serait vraiment intéressant.
CrawlTrack 3.0.0 est enfin disponible au téléchargement.
CrawlTrack avec cette nouvelle version devient un véritable tableau de bord du webmaster.
Fini le temps ou le script ne s'intéressait qu'aux robots; il est maintenant capable de vous donner une vue complète de l'activité sur votre site. Que ce soit, les visiteurs (combien? d'où viennent-ils?), les robots, l'indexation, les téléchargements de fichiers, les erreurs 404 et les tentatives de piratages.
Vous trouverez plus d'informations, une démonstration et le lien de téléchargement en suivant ce lien: www.crawltrack.net/fr
Proposé par Jean-Denis Brun
Zend a annoncé il y a quelques jours la sortie du Zend Framework 1.7.8. Cette nouvelle version mineure apporte son lot de corrections de bugs.
La liste des corrections est disponible dans le changelog.
Il n'y a pas que des améliorations de performances dans eZ Publish 4.1. L'annonce de la sortie de la version 4.1 liste les plus grosses nouveautés (stale cache, object states, ...) et d'autres améliorations attendues depuis un bon moment. Je pense en particulier à l'ajout de déclencheurs sur d'autres opérations que l'affichage d'un objet (content/read), la publication (content/publish) ou ceux dédiés au module de boutique. Mais eZ Publish 4.1 apporte aussi d'autres améliorations qui sont passées pour le moment un peu inaperçues comme l'amélioration des content edit handler ou les extensions de type output filter.
Jusqu'à eZ Publish 4.0 un content edit handler permettait uniquement lancer un bout de PHP au moment de la publication d'un contenu. Il s'agit d'un mécanisme apparu dans eZ Publish 3.8 qui permet d'implémenter tout un tas de fonctionnalités comme la mise à jour d'un cache spécifique, la publication à partir d'une date renseignée dans un attribut, la création d'un espace personnel lors de l'ajout d'un utilisateur, ... J'ai toujours vu ce mécanisme comme une sorte d'évènement de workflow post publish en beaucoup plus simple (pas de code de retour, pas de syntaxe alambiquée, pas de possibilité de laisser le travail à script cron...).
Dans eZ Publish 4.1, il est maintenant possible d'implémenter une méthode de validation dans un content edit handler, en fonction du retour de celle-ci, l'objet part en publication, sinon le formulaire affiche le/les messages comme lorsqu'on oublie de remplir un champ obligatoire par exemple. Dans certains cas, ce nouveau mécanisme peut largement simplifier les choses notamment en permettant la vérification de règles syntaxiques supplémentaires sans nécessiter le développement d'un datatype spécifique ce qui est parfois un peu lourd pour juste ajouter une validation simple (validation d'un code postal, d'une longueur minimale d'une ligne de texte, d'un domaine particulier pour un email, ...)
Il s'agit d'un nouveau type d'extension qui permet d'ajouter un traitement sur le code de la page entière. La documentation dans le SVN de cette nouvelle fonctionnalité donne comme exemple la réécriture des URL des composants de la page en fonction de la position géographique. Pour les validatorophiles, on peut aussi imaginer corriger les éventuels problèmes de validation (X)HTML grâce à un filtre utilisant l'extension php-tidy ou encore remplacer des tags prédéfinis par des éléments générés par un autre système (une version PHP des SSI ou d'ESI simpliste). Bien évidemment comme cette fonctionnalité permet de traiter l'ensemble du code de la page, il faut se méfier des effets néfastes sur le temps de génération des pages.
Il n'y a pas que des améliorations de performances dans eZ Publish 4.1. L'annonce de la sortie de la version 4.1 liste les plus grosses nouveautés (stale cache, object states, ...) et d'autres améliorations attendues depuis un bon moment. Je pense en particulier à l'ajout de déclencheurs sur d'autres opérations que l'affichage d'un objet (content/read), la publication (content/publish) ou ceux dédiés au module de boutique. Mais eZ Publish 4.1 apporte aussi d'autres améliorations qui sont passées pour le moment un peu inaperçues comme l'amélioration des content edit handler ou les extension de type output filter.
Jusqu'à eZ Publish 4.0 un content edit handler permettait uniquement lancer un bout de PHP au moment de la publication d'un contenu. Il s'agit d'un mécanisme apparu dans eZ Publish 3.8 qui permet d'implémenter tout un tas de fonctionnalités comme la mise à jour d'un cache spécifique, la publication à partir d'une date renseignée dans un attribut, la création d'un espace personnel lors de l'ajout d'un utilisateur, ... J'ai toujours vu ce mécanisme comme une sorte d'évènement de workflow post publish en beaucoup plus simple (pas de code de retour, pas de syntaxe alambiquée, pas de possibilité de laisser le travail à script cron...).
Dans eZ Publish 4.1, il est maintenant possible d'implémenter une méthode de validation dans un content edit handler, en fonction du retour de celle-ci, l'objet part en publication, sinon le formulaire affiche le/les messages comme lorsqu'on oublie de remplir un champ obligatoire par exemple. Dans certains cas, ce nouveau mécanisme peut largement simplifier les choses notamment en permettant la vérification de règles syntaxiques supplémentaires sans nécessiter le développement d'un datatype spécifique ce qui est parfois un peu lourd pour juste ajouter une validation simple (validation d'un code postal, d'une longueur minimale d'une ligne de texte, d'un domaine particulier pour un email, ...)
Il s'agit d'un nouveau type d'extension qui permet d'ajouter un traitement sur le code de la page entière. La documentation dans le SVN de cette nouvelle fonctionnalité donne comme exemple la réécriture des URL des composants de la page en fonction de la position géographique. Pour validatorophile, on peut aussi imaginer corriger les éventuels problèmes de validation (X)HTML grâce à un filtre utilisant l'extension php-tidy ou encore remplacer des tags prédéfinis par des éléments générés par un autre système (une version PHP des SSI ou d'ESI simpliste). Bien évidemment comme cette fonctionnalité permet de traiter l'ensemble du code de la page, il faut se méfier des effets néfastes sur le temps de génération des pages.
| test | chrono secondes | ratio 'hello' | ratio time() | ratio sprintf('a %s', time()) | ratio sprintf('a %s', 'hello') |
|---|---|---|---|---|---|
| $a = time(); | 0.06343 | 1.86853 | 1.00000 | 0.31449 | 0.41980 |
| $a = sprintf('a %s', time()); | 0.20170 | 5.94150 | 3.17977 | 1.00000 | 1.33487 |
| $a = str_replace('%s', time(), 'a %s'); | 0.21558 | 6.35046 | 3.39864 | 1.06883 | 1.42675 |
| $a = strtr('a %s', array('%s'=> time() )); | 0.28658 | 8.44190 | 4.51793 | 1.42084 | 1.89663 |
| $a = str_replace('%t', time(), str_replace('%u', time(), str_replace('%s', time(), 'a %s %t %u')); | 0.55867 | 16.45710 | 8.80751 | 2.76985 | 3.69740 |
| $a = str_replace(array('%t','%u','%s'), array(time(),time(),time(),), 'a %s %t %u'); | 0.68971 | 20.31712 | 10.87331 | 3.41953 | 4.56463 |
| $a = strtr('a %s %t %u', array('%s'=> time(), '%t'=> time(), '%u'=> time(), )); | 0.49643 | 14.62383 | 7.82637 | 2.46130 | 3.28552 |
| $a = 'hello'; | 0.03395 | 1.00000 | 0.53518 | 0.16831 | 0.22467 |
| $a = sprintf('a %s', 'hello'); | 0.15110 | 4.45099 | 2.38208 | 0.74914 | 1.00000 |
| $a = str_replace('%s', 'hello', 'a %s'); | 0.16122 | 4.74905 | 2.54160 | 0.79930 | 1.06696 |
| $a = strtr('a %s', array('%s'=> 'hello' )); | 0.20034 | 5.90146 | 3.15834 | 0.99326 | 1.32588 |
| $a = str_replace('%t', 'hello', str_replace('%u', 'hello', str_replace('%s', 'hello', 'a %s %t %u')); | 0.40817 | 12.02365 | 6.43481 | 2.02367 | 2.70134 |
| $a = str_replace(array('%t','%u','%s'), array('hello','hello','hello',), 'a %s %t %u'); | 0.51825 | 15.26657 | 8.17036 | 2.56948 | 3.42993 |
| $a = strtr('a %s %t %u', array('%s'=> 'hello', '%t'=> 'hello', '%u'=> 'hello', )); | 0.31929 | 9.40561 | 5.03369 | 1.58303 | 2.11315 |
[PHP]
<?php
$timeList = array();
$testTitle = array();
$testTitle [] = "\$a = time();";
$nb_occur=100000;
$time_start = microtime(true);
for ($i=0 ; $i<$nb_occur; $i++)
{
$a = time();
}
$time_end = microtime(true);
$time = $time_end - $time_start;
$timeList[]=$time;
$refTime2=$time;
$testTitle [] = "\$a = sprintf('a %s', time());";
$time_start = microtime(true);
for ($i=0 ; $i<$nb_occur; $i++)
{
$a = sprintf('a %s', time());
}
$time_end = microtime(true);
$time = $time_end - $time_start;
$refTime3=$time;
$timeList[]=$time;
$testTitle [] = "\$a = str_replace('%s', time(), 'a %s');";
$time_start = microtime(true);
for ($i=0 ; $i<$nb_occur; $i++)
{
$a = str_replace('%s', time(), 'a %s');
}
$time_end = microtime(true);
$time = $time_end - $time_start;
$timeList[]=$time;
$testTitle [] = "\$a = strtr('a %s', array('%s'=> time() ));";
$time_start = microtime(true);
for ($i=0 ; $i<$nb_occur; $i++)
{
$a = strtr('a %s', array('%s'=> time() ));
}
$time_end = microtime(true);
$time = $time_end - $time_start;
$timeList[]=$time;
$testTitle [] = "\$a = str_replace('%t', time(), str_replace('%u', time(), str_replace('%s', time(), 'a %s %t %u'));";
$time_start = microtime(true);
for ($i=0 ; $i<$nb_occur; $i++)
{
$a = str_replace('%t', time(), str_replace('%u', time(), str_replace('%s', time(), 'a %s %t %u')));
}
$time_end = microtime(true);
$time = $time_end - $time_start;
$timeList[]=$time;
$testTitle [] = "\$a = str_replace(array('%t','%u','%s'), array(time(),time(),time(),), 'a %s %t %u');";
$time_start = microtime(true);
for ($i=0 ; $i<$nb_occur; $i++)
{
$a = str_replace(array('%t','%u','%s'), array(time(),time(),time(),), 'a %s %t %u');
}
$time_end = microtime(true);
$time = $time_end - $time_start;
$timeList[]=$time;
$testTitle [] = "\$a = strtr('a %s %t %u', array('%s'=> time(), '%t'=> time(), '%u'=> time(), ));";
$time_start = microtime(true);
for ($i=0 ; $i<$nb_occur; $i++)
{
$a = strtr('a %s %t %u', array('%s'=> time(), '%t'=> time(), '%u'=> time(), ));
}
$time_end = microtime(true);
$time = $time_end - $time_start;
$timeList[]=$time;
$testTitle [] = "\$a = 'hello';";
$nb_occur=100000;
$time_start = microtime(true);
for ($i=0 ; $i<$nb_occur; $i++)
{
$a = 'hello';
}
$time_end = microtime(true);
$time = $time_end - $time_start;
$refTime1=$time;
$timeList[]=$time;
$testTitle [] = "\$a = sprintf('a %s', 'hello');";
$time_start = microtime(true);
for ($i=0 ; $i<$nb_occur; $i++)
{
$a = sprintf('a %s', 'hello');
}
$time_end = microtime(true);
$time = $time_end - $time_start;
$refTime4=$time;
$timeList[]=$time;
$testTitle [] = "\$a = str_replace('%s', 'hello', 'a %s');";
$time_start = microtime(true);
for ($i=0 ; $i<$nb_occur; $i++)
{
$a = str_replace('%s', 'hello', 'a %s');
}
$time_end = microtime(true);
$time = $time_end - $time_start;
$timeList[]=$time;
$testTitle [] = "\$a = strtr('a %s', array('%s'=> 'hello' ));";
$time_start = microtime(true);
for ($i=0 ; $i<$nb_occur; $i++)
{
$a = strtr('a %s', array('%s'=> 'hello' ));
}
$time_end = microtime(true);
$time = $time_end - $time_start;
$timeList[]=$time;
$testTitle [] = "\$a = str_replace('%t', 'hello', str_replace('%u', 'hello', str_replace('%s', 'hello', 'a %s %t %u'));";
$time_start = microtime(true);
for ($i=0 ; $i<$nb_occur; $i++)
{
$a = str_replace('%t', 'hello', str_replace('%u', 'hello', str_replace('%s', 'hello', 'a %s %t %u')));
}
$time_end = microtime(true);
$time = $time_end - $time_start;
$timeList[]=$time;
$testTitle [] = "\$a = str_replace(array('%t','%u','%s'), array('hello','hello','hello',), 'a %s %t %u');";
$time_start = microtime(true);
for ($i=0 ; $i<$nb_occur; $i++)
{
$a = str_replace(array('%t','%u','%s'), array('hello','hello','hello',), 'a %s %t %u');
}
$time_end = microtime(true);
$time = $time_end - $time_start;
$timeList[]=$time;
$testTitle [] = "\$a = strtr('a %s %t %u', array('%s'=> 'hello', '%t'=> 'hello', '%u'=> 'hello', ));";
$time_start = microtime(true);
for ($i=0 ; $i<$nb_occur; $i++)
{
$a = strtr('a %s %t %u', array('%s'=> 'hello', '%t'=> 'hello', '%u'=> 'hello', ));
}
$time_end = microtime(true);
$time = $time_end - $time_start;
$timeList[]=$time;
echo 'éxécuté '.$nb_occur.' fois <table border=1><tr><th>test<th>chrono secondes<th>ratio<br/>\'hello\'<th>ratio<br/>time()<th>ratio<br />sprintf(\'a %s\', time())<th>ratio<br/>sprintf(\'a %s\', \'hello\')</tr>';
foreach($timeList as $k=>$chrono)
{
echo '<tr><td>' . $testTitle [$k]
. '<td>'
. sprintf('%01.5f',$chrono)
. '<td />'
. sprintf('%01.5f',$chrono/$refTime1)
. '<td />'
. sprintf('%01.5f',$chrono/$refTime2)
. '<td />'
. sprintf('%01.5f',$chrono/$refTime3)
. '<td />'
. sprintf('%01.5f',$chrono/$refTime4)
;
}
echo '</table>';
?>
- Aardvark
- ColorZilla
- CSS Validator
- CSSViewer
- FireBug
- FirePHP
- Font Finder
- HTML Validator
- IE View
- Java Console
- LinkChecker
- Poster
- Style Sheet Chooser II
- Web Developer
- YSlow
Question : j'ai un tableau array('a','b','c','e','f',); je veux y ajouter le d entre 'c' et 'e';
On peut ne pas y penser mais array_splice s'en sort très bien
$mon_tableau = array_splice($mon_tableau, $position, 0, $ma_valeur);
$ma_valeur sera ajouté en position $position
(en commençant à 0) dans le tableau $mon_tableau et tous les éléments à partir de la position $position
dans le tableau d'origine seront décalés.
[php]
<?php
var_export( array_splice( array('a','b','c','e','f',), 3, 0, 'd'));
?>
[output]
array('a','b','c','d','e','f',);
En fait dans array_splice($mon_tableau, $position, 0, $ma_valeur);
Après plus d'un an de sommeil et d'attente, l'ensemble des rubriques touchant mes différentes activités sont de nouveaux affichés (php, bureautique, internet, base de données...)
L'intégralité apparaitra prochainement avec bien sur quelques surprises, mais de nombreuses rubriques existent permettant ainsi de naviguer sur ce portail.
A suivre....
En naviguant sur Internet, je suis tombé sur la photo suivante :

Le lien de la source : http://www.flickr.com/photos/garywang/193213537/
Pour ma part, Il n'y a pas photo... PHP est centre des intérêts de tous :)
Plusieurs failles de sécurité ont été signalées dernièrement.
Elles ne sont pas triviales à exploiter mais il a été décidé de sortir une nouvelle version des séries 1.9.2 et 2.0
La version stable recommandée pour un site en production est donc la version SPIP 2.0.7 (téléchargeable ici).
Si vous avez une version de la série 1.9.2 vous pouvez trouver votre bonheur ici (la version 1.9.2h)
Pour finir, voici le traditionnel passage de chinois/japonais/wolof/flamand/indou/anglais selon la langue que l'on ne connait pas :
2.0.6 -> 2.0.7 (13 avril 2009)
Revision: 13887 Le datage des urls reecrites echouait pour cause de
requette eronnee. Le suspens continue : y aura-t-il une version stable
2.0.x avec des urls reecrites non bugguees ?
Revision: 13882 patch de vincent ramos pour #1703 + report des trucs
modernes de inc/rechercher dans la branche 2.0
Revision: 13881 pas de . en dehors de celui separant l'extension,
sinon il est possible d'injecter du php dans un toto.php.txt,
qu'apache peut vouloir traiter comme un .php normal (attaque dite 'de
vlad' )
Revision: 13880 session_set() lorsqu'on renseigne son email (suite de [13878])
Revision: 13879 report [13878] afficher l'email de l'auteur connecte
si on le connait (session)
Revision: 13877 report et nettoyage de ecrire_fichier_securise()
Revision: 13876 report de ecrire_fichier_securise [13867] pour mieux
masquer le contenu de tmp/meta_cache.txt(.php) en cas d'ouverture
inopinee de tmp/ aux regards curieux
Revision: 13873 retour de la pagination dans le controle des petitions
(bug introduit en [13320])
Revision: 13872 Report de [13868] corrigeant l'aléa ancien.
Revision: 13870 revert de [13846] qui casse le fonctionnement de la
pagination AJAX
Revision: 13865 il faut securiser les appels à propre et typo hors
squelette (typiquement code php de l'espace privé), mais dans les
squelettes, la sécurisation est intégrée, et il ne faut pas en
rajouter. On utilise donc la presence du parametre connect pour
distinguer les appels des squelettes qui le comportent tous, des
appels historiques hors squelettes qui ne le mentionnent jamais.
Corrolairement, en cas d'appel hors squelette avec un parametre
connect, il convient d'appeler en plus interdire_script
Revision: 13862 Nouvelle méthode pour l'authentification LDAP, qui
devrait résoudre le bug dans certaines config d'Active Directory.
Géraud Tardif remarque qu'il est idiot de risquer des bugs avec des
champs absents pour trouver le login, puisqu'on l'a déjà. Il vaut donc
mieux se rabattre sur lui, mais on modifie les signatures des
fonctions auxilaires pour qu'il soit facile de surcharger
{{{auth_ldap}}} de sorte qu'on réclame des champs supplémentaires et
qu'on en tienne compte.
Revision: 13859 Ignorer les lignes vides dans les CSV lorsque
transformés en table HTML à la volée (Cyril).
Revision: 13858 Ne pas utiliser intval quand on fabrique une requête
SQL, celui-ci ayant des grands entiers en standard, contrairement à
PHP (Camille). Vu son logo on aurait dû se méfier: un PHP, ça tronque
énormément.
Revision: 13857 Les distributions RedHat, Fedora et CentOS ont
maintenant une installation d'Apache par défaut qui font que le
AllowOverride est à None par défaut, avec comme conséquence que les
{{{deny from all}}} installés par SPIP ne sont plus effectifs sur ces
distributions non modifiées. En conséquence, report immédiat dans la
branche stable de [13608], qui n'écrit plus dans tmp la valeur des
aleas, qui sont des informations trop sensibles. A signaler à propos
des aléas que l'alea_ancien n'est pas pris en compte pour les actions
dont l'URL comporte ecrire/, il faut renoncer à ces URLs. Enfin, il
faudrait insister dans la doc sur le fait que tmp/ et config/ doivent
être interdits à la lecture publique, idéalement en les mettant à
l'extérieur du DocumentRoot.
Revision: 13856 Bug de puce 'meme-rubrique" des sites references
Revision: 13853 un flag manquant pour preciser que l'on est dans l'espace prive
Revision: 13852 pas d'exe´cution en public non plus !
Revision: 13850 il est temps de suivre la prévision des oracles
proteger l'espace privé, donc...
Revision: 13848 eviter le die intempestif "spip_urls AS U insertion
sans description" lors de la creation de nouvelles urls ... (bug
introduit au detour de
http://zone.spip.org/trac/spip/changeset/13838#file22)
Revision: 13846 indentation + meilleure verification sr onAjaxLoad(),
pour compat crayons++
Revision: 13845 enieme correction des urls ... je vais peut-etre finir
par y arriver
Revision: 13844 report oublie de [13765] qui reparait les urls arbo
avec types renommes
Revision: 13843 permettre a la previsu de savoir ou elle se trouve
(cf. http://www.spip-blog.net/forum-spip-org-comme-base-de.html )
Revision: 13841 log plus explicite
Revision: 13839 erreur sql sur date
Revision: 13838 NOW() disparait au profit de la date php (a verifier svp)
Revision: 13836 la date d'un article c'est celle du php, pas celle du SQL
Proposé par Jacques PYRAT
Il existe plein d'options dans phpMyAdmin pas très connues.
Trois me plaisent plus particulièrement.
C'est une option liée au LeftFrameLight.
Il faut mettre à true $cfg['LeftFrameLight'] et $cfg['LeftFrameDBTree']
Puis $cfg['LeftFrameDBSeparator'] et/ou $cfg['LeftFrameTableSeparator'] doivent être modifiés pour indiquer qu'elle est le séparateur de votre convention de nommage.
Défini par défaut à '__'.
Si vous avez des tables telles que 'première__seconde__troisième' elles seront affichées comme une hiérarchie à trois niveaux telle que : premier > seconde > troisième.
Pour finaliser $cfg['LeftFrameTableLevel'] définit le nombre de sous-niveaux qui doivent être affichés quand les tables sont subdivisées par le séparateur ci-dessus.
Dans mon cas LeftFrameTableSeparator vaut _
Si je regarde la db INFORMATION_SCHEMA , j'ai 2 tables dont le nom commence par Table_

dans le frame de gauche je ne les vois pas toutes les 2 mais j'ai

Si je clique sur le +, j'obtiens

Ca ne fait pas grand chose sur INFORMATION_SCHEMA qui ne compte que quelque tables mais quand vous en avez 400 réparties dans une 10aine de sous groupe
Partie 1 - (Partie 2)
Avec l'évènement "Le Printemps de BOURGES"
Un PHP apéro est organisé pendant cet évènement à l'Ilo Victor Hugo... Dans le bar : Euro-café à 19h00 le 24 Avril 2009
Pour venir nous retrouver... c'est très facile.. un elePHPant sera présent sur la table
Avec la présence du trésorier de l'AFUP (Association des Utilisateurs de PHP)
Pour en savoir plus : [ http://www.aperophp.net/apero.php?id=382|http://www.aperophp.net/apero.php?id=382|fr]
Zend_Config et Pear::config sont conçus pour simplifier l'accès et l'utilisation des données de configuration dans les applications.
Les données de configuration peuvent venir de sources variées supportant une organisation hiérarchique des données.
Actuellement Zend_Config fournit des adaptateurs pour les données de configuration qui sont stockées dans des fichier textes avec Zend_Config_Ini et Zend_Config_Xml.
De son coté Pear::config propose Apache, GenericConf, IniCommented, IniFile, PHPArray, PHPConstants, XML.
Je ne suis pas encore à l'aise ni avec l'un, ni avec l'autre.
Ce qu'il me faut c'est :
edit : Oops c'est article a été publié inachevé.
Le fond du problème c'est de se dire qu'une config c'est avant tout une liste de valeurs variable/paramétrable dont la valeur n'est pas assignée par le développeur, mais par un utilisateur.
Pour ce dont j'ai besoin
On avait implémenté plusieurs des autres points dans Claroline mais ce dernier n'utilise ni PEAR::Config, ni Zend_Config
L'idée est d'avoir une config de config.
Avoir une liste des valeurs de config avec leur définition, contexte, type, ...
Avoir un outil d'édition des fichiers de config qui se base sur ces listes pour
Pear::Config aide à manipuler votre configuration qu'elle soie stockée dans des fichiers XML, des tableaux PHP ou tout autre genre de source de données. Il comporte les fonctionnalités suivantes :
L'objet de Config agit en tant que conteneur pour d'autres objets de Config_Container. Il ne fait pas beaucoup mais rend la tenue des opérations de E/S plus faciles. Il contient l'objet racine de Config_Container qui contient alternativement un objet enfant de Config_Container. Les objets Config_Container stockent des références à leur parent et ont un tableau d'enfants. Cette structure permet alors d'accéder à différent les conteneurs et leur contenu.
Un objet de Config_Container peut être de différents types :
En utilisant le paquet Config, la majeure partie du travail est effectuée avec les objets Config_Container .
On voit donc un petit avantage à PEAR_Config c'est qu'il propose aussi l'écriture.
Pour creuser Zend_Config : Différentes approches et sa partie 2
Les valeurs de configuration actives seront stockées dans des fichiers de config contenant de simples array php.
[php] <?php /* campus_name : Name of your campus */ $claro_config['platform_name'] = 'My campus'; /* platform_language : Select the default language of the platform */ $claro_config['platform_language'] = 'english'; /* claro_stylesheet : Set the stylesheet layout */ $claro_config['platform_stylesheet'] = 'default.css'; /* administrator_name : Complete name */ $claro_config['administrator_name'] = 'John Doe'; /* administrator_email : This email is the main contact address on the platform */ $claro_config['administrator_email'] = 'John@doe.net'; /* administrator_phone : Phone */ $claro_config['administrator_phone'] = ""; /* institution_name : Name displayed in the top banner */ $claro_config['institution_name'] = 'My institute'; ?>
Mais ce qui est particulier est en amont.
Dans claroline, on ne distribue plus jamais les fichiers de config. mais des fichiers de définition.
L'outil d'édition de config, (et d'install et d'upgrade) lit le fichier de définition et il lit les valeurs actives si elles existent dans les fichiers de config.
Ensuite il génère le forumlaire, on peut editer comme on veut puis dire, "appliquer", "restaurer les valeur par défaut", "abandonner"
Si on utilise "appliquer" il regénère tous les fichiers de conf concernés
L'avantage c'est qu'à l'upgrade on écrase les fichiers de définition pas les valeurs actives.
voici a quoi ressemble la définition d'une valeur de config.
[php]
<?php
$toolConfProperties['CONFVAL_LOG_CALENDAR_INSERT'] =
array ('label' => 'Logguer les ajouts d\'agenda'
,'default' => 'TRUE'
,'type' => 'boolean'
,'display' => TRUE
,'readonly' => FALSE
,'container' => 'CONST'
,'acceptedval' => array ('TRUE'=>'enabled'
,'FALSE'=>'dislabed'
)
);
?>
donc ici il génère un define('CONFVAL_LOG_CALENDAR_INSERT', ...)
Ces deux là permettent d'afficher ou non une valeur dans l'éditeur et de la rendre editable ou non
un autre exemple
[php]
<?php
$toolConfProperties['DEFAULT_SUFFIX_MAIL']['default'] = '@fake.zz';
$toolConfProperties['DEFAULT_SUFFIX_MAIL']['type' ] = 'regexp';
$toolConfProperties['DEFAULT_SUFFIX_MAIL']['acceptedval'] = '@(([0-9]{1,3}\.){3}[0-9]{1,3}|([0-9a-z][0-9a-z-]*[0-9a-z]\.)+[a-z]{2,4})$';
?>
Maintenant avec Zend ou Pear on pourrait transformer une partie de l'éditeur auto généré pour utiliser Zend_Form ou PEAR::Quickform2
Rien Ne me convient, je suis un difficile capricieux.
Il va falloir que je planifie tout ceci.
Spring is in the air and PHP is ready to blossom, so join the PHPBelgium meeting on Wednesday April 22 at our bi-monthly PHPBelgium meeting. We've got two valued speakers lined up and lots of goodies to give away.
schedule:
An in depth talk about using PHP on the command line and all the benefits that go along with it. In this presentation, Thijs will tackle common problems that occur when using classic PHP via the browser and he'll show you how the PHP binary allows you to create powerfull shell applications. Thijs Feryn is the support manager at COMBELL where he constantly gets into contact with real-world hosted examples of good and bad LAMP development. Being a PHP 5 ZCE he's also a talented developer and you'll be hearing plenty more of him in the community.
Juliette is a veteran PHP developer and a well respected representative for PHPWomen in the Benelux. She has already introduced herself about a year ago at one of the first PHPBelgium meetings, but is now giving a presentation where you'll learn the ins and outs of UTF-8
To list a few of the goodies:
Catering and venue for this meeting are provided by Combell Internet Solutions More information can be found at http://phpbelgium.be/events/23032009/phpbelgium-meeting-april and you can sign up for this meeting at http://upcoming.yahoo.com/event/2167970
http://framework.zend.com/manual/fr/zend.log.filters.html#zend.log.filters.all-writers
30.4. Filtres
Un objet Filter bloque les messages avant l'écriture dans le log.
[PHP]
<?php
$logger = new Zend_Log();
$redacteur = new Zend_Log_Writer_Stream('php://output');
$logger->addWriter($redacteur);
$filtre = new Zend_Log_Filter_Priority(Zend_Log::CRIT);
$logger->addFilter($filtre);
// bloqué
$logger->info("Message d'information");
// écrit dans le log
$logger->emerg("Message d'urgence");
?>
Avec cet exemple, on reçoit les messages de niveau 0,1 et 2
si on regarde le tableau des priorités
EMERG = 0; // Urgence : le système est inutilisable ALERT = 1; // Alerte: une mesure corrective doit être prise immédiatement CRIT = 2; // Critique : états critiques ERR = 3; // Erreur: états d'erreur WARN = 4; // Avertissement: états d'avertissement NOTICE = 5; // Notice: normal mais état significatif INFO = 6; // Information: messages d'informations DEBUG = 7; // Debug: messages de déboguages
On comprend que Zend_Log_Filter_Priority(Zend_Log::CRIT); signifie ne prendre que ce qui est inférieur ou égal à 2//CRIT
Comment faire pour avoir que les 4 ou que les 5, 6 et 7 ou que les 2 et 3 ?
Dans la doc api on peut voir pour le constructeur
Constructor __construct (line 54) Filter logging by $priority. By default, it will accept any log event whose priority value is less than or equal to $priority.
Zend_Log_Filter_Priority __construct (integer $priority, [string $operator = '<='])
On ne parle pas encore de string $operator = '<=' dans la doc
Donc il faut savoir que
[php] <?php $filtre = new Zend_Log_Filter_Priority(Zend_Log::CRIT, '='); $logger->addFilter($filtre); ?>
mon logger ne reprend que les niveaux CRITICAL
[php] <?php $filtre = new Zend_Log_Filter_Priority(Zend_Log::CRIT, '<='); $logger2->addFilter($filtre); $filtre = new Zend_Log_Filter_Priority(Zend_Log::NOTICE , '>='); $logger2->addFilter($filtre); // mon logger ne reprend que les niveaux CRITICAL, ERR, WARN et NOTICE ?>
Pour aller plus loin il faut savoir qu'il y a aussi 2 autres filtres à découvrir.
L'AFUP (Association Française des Utilisateurs de PHP) annonce la deuxième édition du BarCamp orientée PHP à Paris.
Ce rendez-vous se déroulera 9 mai 2009 toute le journée.
Il s'agit d'un évènement gratuit et ouvert à tous et comme la première édition, une partie « PhpCamp et TestFest » aura lieu.
Alors n'hésitez pas à consulter l'annonce officielle de ce rendez-vous.
Proposé par Christophe Villeneuve
C'est juste dans la documentation de php mais qui le connaissait ?
En gros cette directive permet d'ignorer les @.
Exemple : Activation et désactivation de scream, à l'exécution
[php]
<?php
// Affichage des erreurs
ini_set('display_errors', true);
error_reporting(E_ALL);
// Désactivation de scream : le code est silencieux
ini_set('scream.enabled', false);
echo "Opening http://example.com/not-existing-file\n";
@fopen('http://example.com/not-existing-file', 'r');
// Activation de scream : le code est verbeux
ini_set('scream.enabled', true);
echo "Opening http://example.com/not-existing-file\n";
@fopen('http://example.com/another-not-existing-file', 'r');
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
[Output] Opening http://example.com/not-existing-file Opening http://example.com/not-existing-file Warning: fopen(http://example.com/another-not-existing-file): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in example.php on line 14
Note: Généralement, on active cette extension avec une directive de configuration php.ini, au lieu de la modifier dans le code PHP Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.
Options de configuration de scream
Anaska – Alter Way Formation, l’organisme de formation dans lequel je travaille vient de lancer les PHP Days. Un nouveau concept de formation dédié à PHP :
- Des formations sur de thèmes précis et d’actualité
Une seule session, en amphithéâtre, est organisée pour chaque PHP Day, l’objectif étant de traiter un des thèmes chaud de PHP (en opposition aux formations inter-entreprises qui sont, par définition, plus généralistes).
- des sessions animées par plusieurs intervenants de renom
Chaque PHP Day est composé de plusieurs sessions, d’une demi-journée chacune, animées par des intervenants spécialistes du sujet et reconnus pour leur implication dans les communautés, l’écriture d’ouvrages ou la gestion de projets importants.
La première session de PHP Days intitulée “Industrialisez votre PHP!” se déroulera les 6 et 7 Juillet.
Au programme :
- Environnement et procédures de développement
- Utilisation d’un framework
- Sécurité de vos développements
- Optimisez vos performances
Côté intervenants, nous aurons Damien SEGUY, Cyril PIERRE de GEYER, Julien PAULI et Jean-Marc FONTAINE. La session sera animée par votre humble serviteur.
Les inscriptions sont ouvertes et le nombre de places est limité, n’hésitez donc pas à réserver votre place dés maintenant.
Une autre découverte de mon SCAN de la doc de php : inclued_get_data issu du package PECL inclued
(V0.1.0/alpha/2008-02-29)
On trouve un exemple dans la doc http://www.php.net/manual/fr/inclued.examples-implementation.php
mais il n'est pas super clair.

Par contre c'est mieux présenté sur GnuSquad. D'ailleurs je ne vais pas développer et juste conseiller d'aller lire ce post ansi que celui-ci en anglais.
L'extension inclued inclut un fichier PHP appelé gengraph.php qui crée un fichier DOT, qui peut être passé à la bibliothèque » graphviz. Cependant, cette approche n'est pas obligatoire.
[php] <?php include 'x.php'; $clue = inclued_get_data(); print_r($clue); ?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
[output]
Array
(
[includes] => Array
(
[0] => Array
(
[operation] => include
[op_type] => 2
[filename] => x.php
[opened_path] => /tmp/x.php
[fromfile] => /tmp/z.php
[fromline] => 2
)
)
)
Anaska – Alter Way Formation, l’organisme de formation dans lequel je travaille vient de lancer les PHP Days. Un nouveau concept de formation dédié à PHP :
- Des formations sur de thèmes précis et d’actualité
Une seule session, en amphithéâtre, est organisée pour chaque PHP Day, l’objectif étant de traiter un des thèmes chaud de PHP (en opposition aux formations inter-entreprises qui sont, par définition, plus généralistes).
- des sessions animées par plusieurs intervenants de renom
Chaque PHP Day est composé de plusieurs sessions, d’une demi-journée chacune, animées par des intervenants spécialistes du sujet et reconnus pour leur implication dans les communautés, l’écriture d’ouvrages ou la gestion de projets importants.
La première session de PHP Days intitulée “Industrialisez votre PHP!” se déroulera les 6 et 7 Juillet.
Au programme :
- Environnement et procédures de développement
- Utilisation d’un framework
- Sécurité de vos développements
- Optimisez vos performances
Côté intervenants, nous aurons Damien SEGUY, Cyril PIERRE de GEYER, Julien PAULI et Jean-Marc FONTAINE. La session sera animée par votre humble serviteur.
Les inscriptions sont ouvertes et le nombre de places est limité, n’hésitez donc pas à réserver votre place dés maintenant.
Le Forum PHP 2009 qui se déroulera le 12 et 13 novembre 2009 à la cité des sciences.
Si vous avez quelque chose à dire : dites leur
Si vous avez juste envie d'écouter, les inscriptions en prévente avec un tarif préférentiel (remise de 20€ jusqu'au 30 mai 2009)

Contact : bureau@afup.org Contact téléphonique : 06 73 47 40 53
Contact : inscriptions@afup.org Contact téléphonique : 06 98 27 96 52
eZ Object States Filter est une extension de type extended attribute filter. Cette extension permet de filtrer sur les object states des objets de contenu lors de la récupération d'un ensemble de nœuds en template avec la fonction fetch( content, list ) et équivalentes ou en PHP. Il s'agit d'une toute petite extension (3 fichiers !) écrite pour un projet perso en cours avec eZ Publish 4.1. Des exemples d'utilisation (template et PHP) sont disponibles sur la page du projet.
Le 9 mai prochain, un évènement qu'il ne faut pas rater...
Il s'agit du PHPCamp et TestFest organisé par l'AFUP (Association Françaises des Utilisateurs de PHP)
Ce rendez-vous unique va vous permettre de patienter jusqu'au forum PHP, et ouvert à tous et gratuit
Pour plus d'informations, consulter le lien suivant : http://www.afup.org/article.php3?id_article=385