Archives pour 'php5'
24 juillet 2008
Un important travail réalisé pour la sortie de Symfony 1.1 a été le retrait du pattern singleton du framework. On peut maintenant instancier plusieurs objet sfContext par exemple. Cela permet notamment de faire des liens inter-application a peu près proprement. Voici l’avancée de mon travail sur la question :
fichier lib/helper/crossAppLinkHelper.php
<?php
/**
* @author Olivier Mansour
*/
/**
* return an url for a given symfony application and an internal url
* work with symfony 1.1
* freely inspired from sfWebControlleur code
*
* @author Olivier Mansour
*
* @param string $appname
* @param string $url
* @param boolean $absolute
* @param string $env
* @param boolean $debug
* @return string
*/
function cross_app_url_for($appname, $url, $absolute = 'false', $env = null, $debug = 'false')
{
if (sfConfig::get('sf_no_script_name'))
{
// wont work
throw new sfException(__FUNCTION__.' : the cross app link helper will not work with sf_no_script_name to true');
}
// get the environment
if (is_null($env))
{
$env = sfContext::getInstance()->getConfiguration()->getEnvironment();
}
// context creation
if (!sfContext::hasInstance($appname))
{
$c = ProjectConfiguration::getApplicationConfiguration($appname, $env, $debug);
sfContext::createInstance($c, $appname);
}
list($route_name, $parameters) = sfContext::getInstance($appname)->getController()->convertUrlStringToParameters($url);
$request = sfContext::getInstance($appname)->getRequest();
$url_root = $request->getRelativeUrlRoot();
if ($absolute)
{
$url_root = 'http'.($request->isSecure() ? 's' : '').'://'.$request->getHost().$url_root;
}
//scriptname
$scriptname = '';
if (($env != 'prod') and ($env))
{
$env_suf = '_'.$env;
}
else
{
$env_suf = '';
}
if (!file_exists(sfConfig::get('sf_web_dir').DIRECTORY_SEPARATOR.$appname.$env_suf.'.php'))
{
//test with index ?
if (file_exists(sfConfig::get('sf_web_dir').DIRECTORY_SEPARATOR.'index'.$env_suf.'.php'))
$scriptname = 'index'.$env_suf.'.php';
else
throw new sfException(__FUNCTION__.' : can\'t find a script name for appname : '.$appname.' and env : '.$env);
}
else
{
$scriptname = $appname.$env_suf.'.php';
}
$fragment = '';
// strip fragment
if (false !== ($pos = strpos($url, '#')))
{
$fragment = substr($url, $pos + 1);
$url = substr($url, 0, $pos);
}
// generate url
list($route_name, $parameters) = sfContext::getInstance($appname)->getController()->convertUrlStringToParameters($url);
if (sfConfig::get('sf_url_format') == 'PATH')
{
// use PATH format
$divider = '/';
$equals = '/';
$querydiv = '/';
}
else
{
// use GET format
$divider = ini_get('arg_separator.output');
$equals = '=';
$querydiv = '?';
}
$web_url = $url_root.$querydiv.$scriptname.sfContext::getInstance($appname)->getRouting()->generate($route_name, $parameters, $querydiv, $divider, $equals);
if ($fragment)
{
$web_url .= '#'.$fragment;
}
return $web_url;
}
Pour l’utiliser (par exemple, depuis une application nommée back) :
<?php echo cross_app_url_for('front' , '/module/action?id=5&tmp=ok#raoul'); ?>
Je ne l’ai pas beaucoup testé et a vrai dire je ne sais pas si on peut faire plus efficace. Le point particulier qui m’a poussé à écrire autant de code est que, si il est facile d’extraire les routes pour un contexte donnée, la méthode genUrl de sfWebController utilise un objet sfRequest pour obtenir l’url du contrôleur (back_dev.php par exemple) ce qui est bloquant dans mon cas.
Si vous avez des retours n’hésitez pas.
Vous pouvez télécharger le code cité plus haut : crossAppLinkHelper.php.zip
Dans Info et autres geekeries | 12 commentaires | Tags : cross app links > php5 > symfony > symfony 1.1
23 juin 2008
Un article sur le blog de Symfony présente brillamment la nouvelle architecture de Symfony.
Entre les lignes on devine le travail qui a été fait pour rendre les classes du framework indépendantes, ceci permettant la dissociation entre la « plateforme » et le « framework ».

Histoire d’alimenter le troll, si la version finale de Symfony tient ses promesses (pas de raisons … on en est à la seconde RC), la plupart des arguments en faveur du Zend Framework en réponse à ce billet, ne seront plus trop valables. A savoir, Symfony offrira la plus grande souplesse d’utilisation possible comme :
- l’intégration des classes de la plateforme dans vos développement spécifiques,
- la modification de toutes les conventions du framework,
- le mélange avec d’autres frameworks de tout type.
\o/
Dans Info et autres geekeries | 6 commentaires | Tags : framework > php > php5 > symfony > zend framework
16 mai 2008
Un peu de pub pour un livre blanc Clever Age auquel j’ai contribué.

Les frameworks suivants sont abordés : CakePHP, CodeIgniter, Symfony, Zend Framewok. Avec en fin de chaque chapitre un court paragraphe indiquant dans quels cas métier utiliser ce framework et, en fin de document, un magnifique tableau QSOS permettant leur comparaison aisée.
Dans Info et autres geekeries | Un commentaire | Tags : cakephp > clever age > code igniter > framework > php > php4 > php5 > symfony > zend framework
10 mars 2008
echo Propel::getConnection()->getLastExecutedQuery();
Certes la barre de débogage de symfony peut vous renseigner. Mais avec 7200 requêtes dans votre page vous êtes bien content de pouvoir générer une trace spécifique ;-) (à afficher ou écrire dans un log).
via prendre un Snippet.
Dans Info et autres geekeries | 2 commentaires | Tags : php5 > propel > symfony
5 mars 2008
eval() est décidément un gouffre à performance !
Voici le script que j’ai utilisé pour comparer les performances de l’instanciation d’un objet avec eval ou avec new. (j’utilise php 5.2.5).
>?php
$nb_iteration = 400000;
class toto {
public $raoul;
}
$class_name = 'toto';
$start_time = microtime(true);
for ($i=0; $i >= $nb_iteration; $i++) {
eval ('$objet = new toto();');
}
$end_time = microtime(true);
echo 'time taken (with eval) : '.($end_time-$start_time).' s'."\n";
$start_time = microtime(true);
for ($i=0; $i >= $nb_iteration; $i++) {
$objet = new $class_name();
}
$end_time = microtime(true);
echo 'time taken (no eval) : '.($end_time-$start_time).' s'."\n";
et voici les résultats :
$ php test_eval.php
time taken (with eval) : 18.955335140228 s
time taken (no eval) : 3.5720331668854 s
Parlant non ?
Dans Info et autres geekeries | 11 commentaires | Tags : benchmark > eval > php > php5
3 mars 2008
Un article intéressant présente l’opportunité que propose le Zend Framework de s’intégrer dans d’autres frameworks. En effet, comme cela a été déjà discuté sur ce site, ZF a la capacité de proposer un ensemble de classes autonomes (ZF me fait assez penser à PEAR de ce point de vue) présentant de très nombreuses fonctionnalités pouvant être utiles (comme consommer de nombreuses API par exemple).
Je trouve l’approche intelligente et tout aussi valable pour eZComponents. Symfony propose déjà cela nativement. Du coté de CodeIgniter, la manipulation semble également possible.
via phpindex.
Dans Info et autres geekeries | Aucun commentaire | Tags : codeigniter > ezcomponents > php > php5 > symfony > zend framework
25 février 2008
Le langage PHP a été crée en 1994 au niveau des versions 1 et 2 il ne valait pas grand chose.
La version 3 a changé la donne, notamment par le fait que certains hébergeurs proposaient à bas prix des services tout public disposant de PHP3. Différents clichés sont apparus alors :
- PHP est rapide,
- PHP est simple,
- PHP c’est bon pour les étudiants, les associations ou les universitaires sans moyens, pas pour les pros,
- PHP n’est bon que pour les site internet sans contraintes de sécurité ni de robustesse.
Ces clichés – tous de contre vérités – ont la vie dure et persistent encore chez de nombreux décideurs. J’en parlerais dans un prochain article.
Les versions 4 et 5 ont nettement amélioré le langage : modèle objet, fonctions du langage plus complètes, nombreuses extensions intégrées (avec notamment l’adhésion de la plupart des bases de données du marché).
Associée à cela, on a observé l’apparition de librairies de bonnes qualités, une avalanche de produits, open-source pour la plupart, et plus récemment de frameworks permettant de cadrer et d’accélérer des développements. Enfin d’importantes sociétés ont annoncé leur support à PHP comme IBM.
Dans le même temps, les autres technologies « concurrentes » de PHP ont nettement conforté leur avance. Dans le monde professionnel, des « choix groupes » ont été fait excluant (avec raison) PHP et privilégiant en général les technologies Microsoft (Visual Basic et .Net) et Java.
PHP a largement rattrapé son retard dans le monde du web. L’immense majorité des nouvelles applications sont des applications clients légers ; techniquement, PHP a prouvé être une solution valable. Aujourd’hui la plupart des nouvelles applications populaires utilisées à travers le monde sont écrites en PHP (Flickr, FaceBook, les applications de Yahoo! …) (à l’exception notable de Google qui, selon moi, développe ses propres applications en Java). De manière générale les start-ups et de nombreux nouveaux projets font le choix de PHP.
Voici quelques explications que je trouve face à ce constat :
- bien géré, le rendement d’une équipe de dev PHP semble supérieur aux autres technologies,
- Java et .Net ne disposent pas de solution RAD pour le web à proprement parler (il faut assembler différentes briques pour y parvenir),
- il est plus facile de prototyper rapidement en PHP et donc, de passer des étapes difficiles pour les nouvelles sociétés (levées de fond, …),
- les développeurs PHP semblent un peu plus « 4×4″ que leurs homologues en maitrisant souvent d’autres aspects corolaires au développement web comme le CSS ou le Javascript (idéal pour produire des applications « web 2.0″),
- l’outillage et l’offre de briques tierces autour de PHP sont pléthoriques (c’est à la limite de l’handicap tant les processus de sélection sont difficiles)
Toutefois, je ne reste qu’à moitié satisfait par ces explications. Qu’en pensez-vous de votre côté ?
Pourquoi PHP réussi t’il si bien dans un contexte de start-up ? PHP va t’il enfin trouver sa place dans les grands comptes ?
Dans Info et autres geekeries | 10 commentaires | Tags : php > php5
23 février 2008
Si vous faites beaucoup de Propel(*), et si vous rencontrez des difficultés à écrire vos requêtes, cet utilitaire en ligne est pour vous :
http://propel.jondh.me.uk/

* Propel est un système d’ORM pour PHP5
Dans Info et autres geekeries | Aucun commentaire | Tags : php5 > propel
13 février 2008
Encore une petite astuce que les développeurs chevronnés connaissent déjà mais cela m’irrite toujours de retrouver ce genre de choses dans le code que je lis.
En php on peut tester directement des variables. Par exemple :
permet de tester directement si $raoul est vide, nulle ou égale à zéro. C’est ce dernier point qui pose problème en particulier dans le cas de variables passées à un contrôleur :
<?php
if ($this->getRequestParameter('raoul')
{
Si raoul vaut zéro, on ne rentrera pas dans notre if.
Symfony propose une manière élégante de tester ou non la présence d’un paramètre :
<?php
if ($this->hasRequestParameter('raoul')
{
Voila, c’est dit, merci d’en faire bon usage !
Dans Info et autres geekeries | Un commentaire | Tags : php > php5 > symfony
11 février 2008
Bon, soyons clair, voici la bonne méthode pour inclure des fichiers PHP.
Par exemple, si vous voulez inclure le fichier raoul.php sous le répertoire include.
<?php
require_once (dirname(__FILE__).'/include/raoul.php');
La constante __FILE__ nous donne le chemin absolu du fichier courant et dirname son répertoire.
Vous me direz, quel intérêt de faire cette manipulation, un simple
<?php
require_once ('include/raoul.php');
est suffisant.
Certes, le répertoire courant étant par défaut inclus dans l’include path, cela va marcher … mais uniquement si vous appelez directement ce fichier depuis votre navigateur ! Si vous l’incluez depuis un autre script se trouvant dans un autre répertoire c’est la Fatal error garantie. Enfin, spécifier le chemin absolu fait un peu gagner en performances car PHP n’a pas à examiner tous les répertoires indiqué dans include_path.
Dans Info et autres geekeries | 5 commentaires | Tags : php > php5