Kamelot Blog

Aller au contenu | Aller au menu | Aller à la recherche

lundi 12 mars 2012

lun
12
mar '12

Rétrospective php de Février ( partie 2 )

suite de mes tweet à propos de php en février

  • Cube (a qui on doit une bonne présentation au #fosdem) engage (en flandre) #php http://awe.sm/5eylz
  • PHP Bug Lost - A debug console and monitor tool for PHP scripts. http://awe.sm/5fEQy
  • List Of PHP String Functions Programmer Need To Know | Techno Tab http://awe.sm/5fEAs
  • Comment utiliser l'outil Zend_Tool en ligne de commande | LyRiX Blog http://awe.sm/5fCc8 #zendframework
  • Pascal Martin: Dommage d’utiliser #Ant, dans un projet #PHP,j’ai tendance à lui préférer #Phing
  • CakePHP evolves to 2.0 | Refulz PHP http://awe.sm/5f1Fu
  • #PHP 5.4 Built In Webserver http://awe.sm/5f4rW
  • PHP 5.4.0 RC8 released http://bit.ly/zfrMtc
  • j'ai commenté le dernier post de @mageekguy42 et je vais me faire descendre (vidéo)
  • #php 5.4 <?= is now always available regardless of the short_open_tag setting http://bit.ly/yibJIh
  • URL rewriting in PHPCloud | ESchrade - Pure PHP Goodness http://awe.sm/5ezV9
  • taint pour #php , une release tous les 2 jours http://awe.sm/5gEMM1 (vidéo)
  • Rafael Dohms - Your code sucks, let's fix it PHPBenelux Meeting February 28, 201 (vidéo) http://awe.sm/5gB3r2
  • Zend Framework / Nouveau View Layer pour ZF (vidéo) http://bit.ly/x7efQG2
  • Créer un moteur de recherche avec Sphinx et PHP http://awe.sm/5fxea #sphinxsearch #php
  • If you missed Michelangelo van Dam's webinar on Unit Testing Zend Framework Apps last week, you can now watch the... http://fb.me/1JVg1ROHT
  • Codeception a full-stack testing PHP framework. Inspired by BDD, for writing acceptance, functional and even unit tests http://awe.sm/5fsS3
  • PHP's development visualized by gource through svn commit logs http://awe.sm/5fsNO (vidéo)

lundi 27 février 2012

lun
27
fév '12

Rétrospective php de Février (partie 1 )

samedi 25 février 2012

sam
25
fév '12

Zend_Amf: surveiller et tester son service.

mercredi 25 janvier 2012

mer
25
jan '12

5 petites choses qui ne prennent pas beaucoup de temps pour s'investir dans la communauté php

original : http://devzone.zend.com/article/12450-Get-involed-in-the-PHP-community-5-easy-steps-that-take-less-than-5-minutes-each

1 ° Mettez en place un tag "PHP" sur votre Blog

Si vous parlez de php sur votre blog mais aussi d'autres choses.

  • Proposez un tag ou une catégorie dédiée à PHP
  • Proposez un feed rss de ce tag ou catégorie
  • Soyez actif dans cette catégorie
  • Portez cette catégorie à la connaissance des "planets"
    • http://www.planete-php.fr/
    • http://www.planet-php.net/blog/

vendredi 30 décembre 2011

ven
30
dec '11

Rétrospective php de Décembre

Tout ce que j'ai twetté en Décembre à propos de php.


mercredi 14 décembre 2011

mer
14
dec '11

limit negatif dans explode depuis PHP 5.1.0

Depuis PHP 5.1.0

array explode ( string $delimiter , string $string , int $limit  )

Si le paramètre limit est négatif, tous les éléments, excepté les -limit derniers éléments sont retournés.

$str = 'one|two|three|four';
print_r(explode('|', $str, -1));

résultat

Array
(
    [0] => one
    [1] => two
    [2] => three
)

ref :

PHP: explode - Manual

lundi 16 mai 2011

lun
16
mai '11

Le saviez vous ? PHP_EOL & REQUEST_TIME

Pour ne pas devoir utiliser "\n"

J'avais pour habitude de faire

defined('NL') || define('NL',"\n");

et j'avais du code du style

echo 'foo' . NL
.      'bar';

En fait depuis PHP 4.3.10 et PHP 5.0.2, la constante PHP_EOL existe nativement pour cela.

echo 'foo' . PHP_EOL
.      'bar';

Et l'intérêt principal, est dans les commentaires.

La valeur de PHP_EOL dépends de l'OS. On peut avoir \n, \r\n ou \r comme valeurs.

Ca vaut le coup de relire la liste des constantes préétablies. Ca peut donner des idées.

Dans le même ordre d'idée, un timestamp représentant le début de la demande est disponible dans la variable $_SERVER['REQUEST_TIME'] depuis PHP 5.1.

lundi 2 mai 2011

lun
02
mai '11

Plusieurs boutons "submit" dans un formulaire

En réponse au post "Plusieurs boutons " submit " dans un formulaire" publié sur Programmation Web|, je ressors un vieux post que j'ai écrit il y a 6 ans.

Je ne le recopie pas, je conseille d'aller le lire parce que les commentaires sont tout aussi intéressants.

Mais en pratique mon idée à l'époque était d'utiliser la même technique que pour les checkbox ou les radio.

On mets un name de la forme name="action[nom_de_mon_action]"

Cela donne 2 avantages

  1. on ne s'occupe que de action et puis on regarde ce qu'il y a dedans.
  2. on a pas du tout à s'inquiéter du contenu de value, ce qui est intéressant pour les formulaires internationalisés.

mercredi 16 mars 2011

mer
16
mar '11

memcached 2.0.0 en beta

PECL :: Package :: memcached :: 2.0.0b1

  • Change the return value for non-existing keys to be NULL rather than 'false', affects simple get only
  • Add fastlz library that provides better/faster payload compression
  • Add configure switch to enable/disable JSON serialization support
  • Add getAllKeys() method
  • Add deleteMulti() and deleteMultiByKey() methods
  • Add isPristine() and isPersistent() methods
  • Add setOptions() method to set multiple options at once
  • Add SERIALIZER_JSON_ARRAY type that decodes JSON payloads as arrays instead of objects
  • Add support for Unix domain socket connections
  • Add memcached.compression_threshold INI setting
  • Add memcached.compression_factor INI setting
  • Add memcached.compression_type INI setting
  • Implement a few speed optimizations
  • Many bug fixes and memory leaks plugged
  • Add several more tests
  • Add constants for libmemcached 0.37+:
  • Memcached::OPT_NUMBER_OF_REPLICAS
  • Memcached::OPT_RANDOMIZE_REPLICA_READ
  • Add 'on_new' callback to constructor
  • Add SASL support

jeudi 10 février 2011

jeu
10
fév '11

PHPBenelux User Group Meeting de février

Heure

mardi 22 février · 19:00 - 23:00

Lieu

PHPro
Veldkant 33A
Kontich, Belgium

Plus d'infos sur http://phpbenelux.eu/en/2011_Feb_meeting .

Présentations par

  • Jeroen Keppens (PHP in the dark),
  • Toon Keppens (Enterprise Drupal integration)
  • Koen Eelen (Enterprise Magento integration).

Au programme

  • 19h00 : Welcome & drinks
  • 19h30 : Puntavista case
  • 20h00 : Casestudy: linking IngramMicro to Magento
  • 20h30 : pause
  • 21h00 : PHP in the dark
  • 22h00 : Drinks & social

vendredi 21 janvier 2011

ven
21
jan '11

PHPBenelux Conference January 2011

Plus de 20 orateurs pour 24 présentations pendant les 2 jours de la PHPBenelux Conference January 2011

En effet, c'est déjà dans une semaine que PHPBenelux propose cette deuxième édition les 28 & 29 janvier 2011, à Anvers.


Achetez votre ticket

vendredi 12 novembre 2010

ven
12
nov '10

L'auto completion Zend Studio comprend le camel case

Si vous utilisez la notation Zend Framework, Mylibrary_Brol_Machin_Truc, vous pouvez en profiter pour accelerer votre utilisation de l'auto-completion dans Zend Studio

En effet pour Mylibrary_Brol_Machin_Truc, vous pouvez utiliser MBM.

Voici un exemple avec Zend_L*

Si vous voulez acceder à Zend_Loader qui est plus loin, vous pouvez utiliser les premières voyelles

Si ca ne suffit pas vous pouvez revenir aux consonnes après

samedi 6 novembre 2010

sam
06
nov '10

Comment voir les fichiers .htaccess dans l'explorateur de Zend Studio (ou Eclipse) ?

Vous cliquez sur la flèche en haut a droite de l'explorateur


puis il faut décocher la case qui dit de ne pas afficher les fichier de type .*


source : chrismacpherson.com

Screenshots réalisés avec FastStone Capture pas "libre" mais dispo sur liberkey

lundi 4 octobre 2010

lun
04
oct '10

Zend Studio 8.0 : @deprecated biffe les fonctions

Encore une autre petite découverte sympathique dans la beta de Zend Studio 8

Voyez cet exemple. J'ai 2 fonctions.

La première, foo(), que je documente simplement, et une autre, bar(),que je documente avec un @deprecated

On remarque que là où on utilise la fonction @deprecated, ligne 20, elle est biffée.

Je trouve que ca renforce l'utilité de ce tag.

Et donne envie de refactorer :-)

Il s'agit en fait d'une des nouvelles possibilités de coloration syntaxiques. En effet la finesse des réglage est accrue.

On peut aussi définir séparément le style des task tag, des éléments statiques, des commentaires multilignes, des Heredoc, des fonctions internes, des méthodes, des fonctions déclarées, ...

dimanche 3 octobre 2010

dim
03
oct '10

Zend Studio 8 : servers distants expliqués en vidéo.

Une vidéo intéressante au même propos que mon post précédent

dim
03
oct '10

Zend Studio 8.0 : enfin l'upload ftp même sur un projet svn; (avec un bug et une solution)

Il était temps.

Zend Studio 8 apporte finalement une solution utilisable pour combiner ftp et versionning sur le même projet.

Zend Studio 8.0 est basé sur la version Eclipse Helios.

Tout comme avant, on a remote server pour définir les serveurs ftp et ssh dont on dispose.

Ce qu'il y a de neuf c'est qu'on ne doit plus faire le choix entre svn et ftp.

En effet malgré la configuration svn, on peut maintenant aller dans "properties" (dernière option du menu image 1) choisir d'un des serveurs distant, on lui choisi un sous répertoire.

Plus haut dans le menu (image 1) une nouvelle entrée "Remote Server" permet de déclencher un upload ou un download manuel.

Dans la configuration (image 2) on peut choisir de déclencher cet upload au "save" ou à la tentative d’exécution.

Lire la suite...

mercredi 8 septembre 2010

mer
08
sep '10

Forum PHP Paris 2010 : 15 ans de PHP et des 10 ans de l'Afup.

Forum PHP Paris 2010 organisé par l'AFUP avec les meilleurs experts PHP français et internationaux

Le Forum PHP 2010 est officiellement annoncé pour les 09 et 10 novembre 2010 à la Cité des Sciences de Paris la Villette (France).

C'est le seul évènement professionnel en France consacré à la plate-forme PHP et aux technologies Web. Il rassemble les différents acteurs de la profession et valorise le dynamisme français en terme de technologies de pointe sur Internet.

Il sera placé sous le signe des 15 ans de PHP et des 10 ans de l'Afup.

vendredi 3 septembre 2010

ven
03
sep '10

Chuck Norris et l'éléphpant

Après E_Chuck_Norris, le package Chuck Norris pour Drupal.

On a de l'humour dans la communauté PHP.

dimanche 15 août 2010

dim
15
aoû '10

PHP TestFest 2010 à Lille le 21 août 2010

La TestFest 2010 française aura lieu le samedi 21 août 2010 à partir de 13 h 30dans les locaux de la société No Parking, située sur le site de l'Euratechnologies au 165 avenue de Bretagne à Lille, dans le bâtiment Leblanc au troisième étage.

C'est gratuit, allez y avec votre ordinateur portable.

mardi 3 août 2010

mar
03
aoû '10

Récupération des données d'un formulaire

Voici un petit formulaire:

[php]
<form>
  <input type="radio" name="BT.123" value="actif" />
  <input type="radio" name="BT.123" value="inactif" />
  <input type="submit" value="Submit" />
</form>

<?php
  echo "GET: ", $_GET['BT.123'];
  echo "POST: ", $_POST['BT.123'];
  echo "REQUEST: ", $_REQUEST['BT.123'];
?>

Qu'est ce qui s'affichera si on choisi "inactif" et qu'on soumet le formulaire ?


réponse dans le 1er commentaire

jeudi 29 juillet 2010

jeu
29
juil '10

PHP-FPM (FastCGI Process Manager)

PHP-FPM est disponible dans le dernier php (5.3)... mais qu'est-ce-que c'est ?

PHP-FPM (FastCGI Process Manager) est une alternative à PHP FastCGI avec toute une série d'amélioration.

Principalement utile pour les sites à fort taux d'utilisation.

Plusieurs VHosts avec un UID/GID différent et des PHP.ini différents.

FPM permet de faire tourner plusieurs VHosts avec un UID/GID différent et des PHP.ini différents.

Support de l'upload accéléré

Statistique de base

similaire à mod_status d'apache.

Redémarrage de secours en cas de destruction accidentelle de l'opcode

Un header d'erreur

une config style

[ini]
 fastcgi.error_header = "HTTP/1.0 550 Server Made Big Boo"

... provoquera l'envoi de cette erreur au lieu d'en "200 tout va bien" avec une page blanche.

amélioration de la gestion des processus en cas de graceful stop/start

En pratique ca permet de prendre en compte une nouvelle config qui nécessite un redémarrage sans interrompre ce qui avait commencé avec l'ancienne configuration.

Journalisation des scripts lents

avec

[xml]
    <value name="request_slowlog_timeout">5s</value>
    <value name="slowlog">logs/slow.log</value>

donnera

[log]
 Sep 21 16:22:19.399162 pid 29715 (pool default)
 script_filename = /local/www/stable/www/catalogue.php 
 [0x00007fff23618120] mysql_query() /srv/stable/common/Database/class.MySQLRequest.php:20 
 [0x00007fff23618560] getResult() /srv/stable/common/Database/class.Facade.php:106 
 [0x00007fff23618aa0] query() /srv/stable/common/mysite.com/ORM/class.UsersMapper.php:99 

Journalisation de Stdout & stderr

fastcgi_finish_request()

une fonction spéciale pour clôturer la connexion avec le client, mais continuer un traitement php à découvrir en détail ici

Autres points

  • PHP-FPM est compatible avec ZendOptimizer

à lire aussi

Notes

[1] Qui, le temps de rédiger et publier cet article, a déjà été retravaillée. C'est la magie wikipedia

mercredi 28 juillet 2010

mer
28
juil '10

Utiliser Zend_Log

Allez on va essayer d'utiliser Zend_log convenablement.

L'idée c'est de découper les moments de décisions.

  1. J'écris mon code je décide de journaliser un message ou des infos
  2. Je gère mes journaux, je décide où va tel ou tel message.
  3. Je gère plusieurs staging, je change le comportement des mes dispatching
  4. Je change le format de stockage de mon journal, je décide comment disposer des informations reçues
  5. Je décide où je lis/récupère mes messages.

Julien débroussaille Zend_log dans sa Présentation du Zend Framework et une liste de tuto permet de compléter

J'écris mon code je décide de journaliser un message ou des infos

Pendant que je code ma réflexion doit se limiter à

  1. quel message envoyer
  2. quelles infos complémentaire envoyer
  3. quelle gravité/sévérité/catégoriser de message j'envoie.
<?php 
$log->info('Hello log');
?>

ajoutons une info

<?php 
$log->info('Hello log je suis à la ligne ' . __LINE__);
?>

Bon là on a envoyé le message

Je gère mes journaux, je décide où vont les messages.

Ca se passe plutôt dans le script. On prépare un objet ($log). qui sera utilisé par la suite dans le code mais on va commencer à lui dire que faire de ces messages qui remontent.

<?php 
$log = new Zend_Log();
?>

Première chose (évidente) assigner les writers (les scribes).

<?php 
$redacteur = new Zend_Log_Writer_Stream('/repository/des/ficher.log');
$log ->addWriter($redacteur);
?>

là c'est dans un un fichier mais "stream" permet aussi un accès plus large,

<?php 
$redacteur = new Zend_Log_Writer_Stream('php://output');
?>

Et on a pas que "stream", ca peut-être aussi

  • dans une base de donnée -> Zend_Log_Writer_Db,
  • dans firebug -> Zend_Log_Writer_Firebug,
  • dans un email -> Zend_Log_Writer_Mail,
  • dans un mock -> Zend_Log_Writer_Mock
  • dans syslog -> Zend_Log_Writer_Syslog
  • dans le néant ... (si le temps du développement ou de tests intensifs, vous ne voulez pas polluer vos logs, redirigez les un temps dans null -> Zend_Log_Writer_Null

//php <?php

$redacteur = new Zend_Log_Writer_Null;

?> ///

et si ca ne me plait pas je peux faire mon scribe en partant de Zend_Log_Writer_Abstract

je décide où va tel ou tel message.

Si c'est pour mettre la même chose partout ce n'est pas spécialement intéressant.

On va donc filtrer les messages à envoyer à chaque scribe. (rédacteur dans la doc)

Pour ca on a 4 outils

  • Zend_Log_Filter_Interface
  • Zend_Log_Filter_Message
  • Zend_Log_Filter_Priority
  • Zend_Log_Filter_Suppress

Je change le format de stockage de mon journal, je décide comment disposer des informations reçues

La façon dont on écrit chaque message est un format "par défaut" mais il peut être redéfini

  • Zend_Log_Formatter_Firebug
  • Zend_Log_Formatter_Interface
  • Zend_Log_Formatter_Simple
  • Zend_Log_Formatter_Xml

En utilisant cela vos pourrez

samedi 24 juillet 2010

sam
24
juil '10

Batch : Attention à la mémoire vive et au reste ...

Olivier Hoareau nous rappelle de faire attention à la mémoire vive dans les batch.

Je viens juste en remettre un couche par rapport à des petits bugs identifiés récemment dans différentes relecture de vieux code.

boucle environementée

Il ne faut pas voir un batch comme une application, mais comme un environnement à reseter à chaque itérations.

C'est à dire que la consommation de vos ressources doivent être le même en fin de chaque loop. Et il ne faut qu'un loop.

Classiquement on a lecture - traitement - écriture.

Il faut éviter le réflexe de "tout lire" -> boucler sur ce qu'on a lu -> "tout écrire"

Il faut envisager le processus "lecture - traitement - écriture." au niveau de la ligne.

Un exemple, avec un fichier CSV à transformer en tableau HTML.

Premier réflexe, on découpe traitement et affichage.

<?php
 $arrayContenuDuCsv = readCsvFile(); 
 // contient une boucle qui "lit" toutes les lignes
 
$arrayResultat = traitementDesDonnees($arrayContenuDuCsv);
 // contient une boucle effectue les traitements sur chaque ligne
 
 $stringHtml = arrayToHtmlTable($arrayResultat); 
 // contient une boucle effectue les traitements sur chaque ligne
 
 // traitement fini, j'affiche
 echo $stringHtml;

le problème c'est que

<?php
 $arrayContenuDuCsv = readCsvFile(); 
 // contient une boucle qui "lit" toutes les lignes
 
 // ici $arrayContenuDuCsv est de taille non maitrisée, dépendant de la taille du fichier
 
 $arrayResultat = traitementDesDonnees($arrayContenuDuCsv);
 // contient une boucle effectue les traitements sur chaque ligne
 
 // ici $arrayResultat est de taille non maitrisée, dépendant de la taille du fichier
 // pire, comme on a pas encore fait de "unset" de $arrayContenuDuCsv on a le csv en double en mémoire!!!!
 
 $stringHtml = arrayToHtmlTable($arrayResultat); 
 // contient une boucle qui éffectue les traitements sur chaque ligne
 
 
 //ici $stringHtml est de taille non maitrisée, dépendant de la taille du fichier
 // pire, comme on a pas encore fait de "unset" de $arrayResultat on a le csv en double, 
 // et si on a à faire a un très mauvais codeur, il n'a même pas fait de unset($arrayContenuDuCsv)
 // et on a le fichier en triple
 
 // traitement fini, j'affiche
 echo $stringHtml;

Il faut donc voir l'application au niveau du traitement de la ligne

<?php
 $arrayContenuCsv = readCsvRow(); // <- contient une boucle qui "lit" UNE ligne
 
 //ici $arrayContenuCsv est de taille maitrisée, 1 ligne
 
 $arrayResultatLigne = traitementDesDonnees($arrayContenuCsv);
 // contient un traitement identique pour chaque ligne
 
 //ici $arrayResultat est de taille maitrisée, 1 ligne
 
 $stringHtml = arrayToHtmlRowTable($arrayResultat);  //ici $stringHtml est de taille maitrisée, 1 ligne
 // traitement fini de ligne, j'affiche
 echo $stringHtml;

Bien entendu il faut mettre tout ceci dans une boucle, ajouter le header et le footer de ma table, mais ca reste du traitement unique.

Initialiser ses variables.

Voici un autre cas de mauvaise écriture que j'ai rencontré.

[php]
<?php
$arrayData = array();
$arrListedeListes = getListeDeListe();
foreach ($arrListedeListes as $arrListe )
{
     foreach ($arrListe as $ligne)
     {
           $arrayData[]=getResultatDuTraitementDeLaLigne($ligne);
     }
     $result= ecritureDesDatas($arrayData);
}

Le développeur a vu qu'en faisant cela au deuxième passage le traitement des données incluait le nouvelles mais aussi celle de la passe d'avant.

Solution appliquée par le développeur

[php]
<?php
$arrayData = array();
$arrListedeListes = getListeDeListe();
foreach ($arrListedeListes as $arrListe )
{
     $i=0; // <- il a réinitialisé son compteur
     foreach ($arrListe as $ligne)
     {
           $arrayData[$i]=getResultatDuTraitementDeLaLigne($ligne);
           $i++;
     }
     $result= ecritureDesDatas($arrayData);
}

Très mauvaise idée parce qu'en fait ce n'est qu'une version aussi erronée que la précédente mais en masquant un peu le problème.

En effet, en écrasant sans effacer la liste précédente, il se fait que dés qu'une liste était plus courte que la précédente, les lignes en surplus était reconsidérées à nouveau.

[php]
<?php
$arrListedeListes = getListeDeListe();
foreach ($arrListedeListes as $arrListe )
{
     $arrayData = array();

     foreach ($arrListe as $ligne)
     {
           $arrayData[$i]=getResultatDuTraitementDeLaLigne($ligne);
           
     }
     $result= ecritureDesDatas($arrayData);
}

Autres outils

Avec Zend_Framework il existe un outil qui permet de gérer le traitement gourmands en entrée et surtout en sortie c'est Zend_Memory.

Il va permettre de gérer des grosses entités de données en plaçant hors de la mémoire vive ce qu'on n'utilise pas.

Il place l'inutilisé dans un des backends Zend_Cache.

Pensez aussi à lire l'article d'Olivier Hoareau : attention à la mémoire vive.

mercredi 14 juillet 2010

mer
14
juil '10

Contrer les CSRF avec Zend_Form

Je n'avais pas repéré cet élément qui me semble bien pratique. l'élément hash Il permet de contrer les CSRF.

class Mon_Form_que_je_protege extends Zend_Form {
  public function init() {
    $this->setMethod('post');
    $this->addElement( 'submit'
                     , 'submit'
                     , array( 'ignore'   => true
                     , 'label'    => 'Submit'
                     ,)
                     );
    $form->addElement( 'hash'
                       , 'evite_csrf_foo'
                       , array( 'salt' => 'unique')
                       );
 
}

On demande à Zend_Form de créer une clé unique à la publication du formulaire et d'ensuite s'assurer que la clé à bien été fournie dans la soumission.

Je pourrais en raconter plus... sauf que quelqu'un l'a déjà fait

à lire aussi : doc API

lundi 12 juillet 2010

lun
12
juil '10

Une date pour PHP TestFest 2010 sur la métropole lilloise ?

Ce post est presque copié-collé de - mageekblog : Une date pour PHP TestFest 2010 sur la métropole lilloise ?

Frédéric Hardy souhaite organiser un évènement dans le courant d'août sur la métropole lilloise dans le cadre de la "TestFest" 2010.

Pour l'instant, le lieu ainsi que la forme sont indéfinis, puisque tout dépendra du nombre de personnes susceptibles de participer.

Il faut aller s'inscrire sur doodle

Tags