jeudi 28 juillet 2016

Log coloré avec PHP en console (PHP-CLI)

Il arrive que l'on fasse des scripts PHP qui doivent fonctionner en console, mais l'affichage est terne (blanc sur fond noir) et ne permet pas de mettre en valeur les messages importants.

J'ai donc créé une fonction log qui permet de coloriser le texte affiché sur une console linux. Elle fonctionne aussi avec MobaXterm, je ne l'ai pas testée avec cygwin.

La fonction

/*
 * Display a colored message, based on level
 * @var string $message The message to display
 * @var string $level The level (none, success, info, warning, error)
 * @var array $disp An array of informations to display
 * @void
 */
function log($message, $level='', $disp=array('class'=>true, 'function'=>true, 'file'=>true, 'line'=>true)) {
    $c = array(
        'r' => "\033[31m",
        'g' => "\033[32m",
        'b' => "\033[34m",
        'y' => "\033[33m",
        'n' => "\033[0m"
    );
    $bt = debug_backtrace();
    $caller = array_shift($bt);
    $precaller = array();
    if (count($bt)>0) {
        $precaller = array_shift($bt);
    }
    $prefixes = array();
    if ($disp['class'] === true && array_key_exists('class', $precaller)) { $prefixes[] = $precaller['class']; }
    if ($disp['function'] === true && array_key_exists('function', $precaller)) { $prefixes[] = $precaller['function']; }
    if ($disp['file'] === true && array_key_exists('file', $precaller)) {
        $prefixes[] = $precaller['file'];
    } elseif ($disp['file'] === true) {
        $prefixes[] = $caller['file'];
    }
    if ($disp['line'] === true) { $prefixes[] = $caller['line']; }
    $prefix = implode('::', $prefixes).'::';
    switch($level) {
        case 'success': echo $c['g'], $prefix, ' ', $message, $c['n'], PHP_EOL; break;
        case 'info': echo $c['b'], $prefix, ' ', $message, $c['n'], PHP_EOL; break;
        case 'warning': echo $c['y'], $prefix, ' ', $message, $c['n'], PHP_EOL; break;
        case 'error': echo $c['r'], $prefix, ' ', $message, $c['n'], PHP_EOL; break;
        default: echo $prefix, ' ', $message, PHP_EOL; break;
    }
}

Explications

Les couleurs

On crée un tableau contenant les différents codes couleurs ANSI a appliquer. Je ferai bientôt une petite explication sur ces codes. Notez bien que les codes doivent être entre guillemets et pas entre apostrophes, sans quoi ils ne seront pas interprétés.

La couleur n (normal) est en fait le retour à la normale, une suppression du code précédemment appliqué.

backtrace

La fonction PHP debug_backtrace permet d'obtenir dans un tableau toute la chaîne ayant permis d'arriver à l'exécution de la ligne courante, dans l'ordre anté-chronologique.

La première entrée du tableau contient une information très importante pour nous: le numéro de la ligne ayant appelé la fonction courante. La deuxième entrée du tableau, si elle existe, contient les informations sur le fichier, la classe et la fonction ayant appelés la fonction courante. S'il n'y a qu'une entrée dans le tableau, cela signifie que l'appel a été fait hors de toute fonction.

vendredi 11 septembre 2015

Installer une extension sur Yii2 sans composer

Lorsque Yii2 est sorti, une grande avancée a été faite dans son système d'installation, ainsi que dans celui des extensions: l'utilisation de composer. Composer est un outil de gestion des dépendances en PHP qui est fort utile et pratique, un peu comme les gestionnaires de package sous linux (apt, yum, ...). Mais parfois, on ne peut pas l'utiliser, et c'est plutôt bloquant.

Je vais donc vous décrire, si possible simplement, comment ajouter une extension à Yii2 à la main.

Lire la suite...

mardi 13 mai 2014

Utiliser le webservice HPOO runFlow avec SOAP

Ce billet concerne fort peu de monde en l'état, mais contient diverses astuces et réflexions sur l'utilisation de SOAP et des objets relativement complexes à y intégrer, la documentation n'étant pas très explicite. La part HPOO est anecdotique, c'est essentiellement parce que c'est l'interfaçage avec ce système qui m'a posé des soucis.

J'espère que ce petit résumé de mes pérégrinations au sein du SOAP et des webservices HPOO aideront certains qui pourraient tomber sur les mêmes écueils que moi.

Lire la suite...

lundi 17 mars 2014

Un bloc à onglets sous Yii

J'ai eu besoin de pouvoir intégrer facilement un bloc avec des onglets dans une page générée par Yii et je n'ai rien trouvé d'assez léger, j'ai donc développé une petite extension: ETabbedDiv.

Elle utilise les fonctionnalités de jquery-ui et s'implémente très facilement:

Utilisation

  • dézippez le fichier et copiez ETabbedDiv.php dans votre répertoire protected/extensions/
  • appelez le widget depuis votre vue, comme dans l'exemple suivant:
<?php $this->widget('application.extensions.ETabbedDiv',
   array(
      'divClass' => 'tabbed',
      'tabs' => array(
         'tab1' => array('content' => '<p>Ceci est le premier onglet</p>'),
         'tab2' => array('title'=>'Second', 'content' => '<p>Ceci est le second onglet</p>'),
         'other' => array('content' => '<p>Et voila le dernier onglet</p>'),
      ),
   ),
);
?>

Paramètres

  • divClass (optionnel) est la classe CSS qui sera appliquée au bloc contenant les onglets,
  • tabs est un tableau associatif des onglets, sous la forme id => tableau de contenu décrit ci-dessous
    • title (optionnel) est le titre qui sera affiché dans l'onglet. S'il n'est pas renseigné, id sera utilisé
    • content est le contenu HTML a afficher dans l'onglet

Source

Vous trouverez la version anglaise sur Yii Framework

Lien de téléchargement sur ce blog : ETabbedDiv

lundi 14 octobre 2013

[MàJ] Yii : ajout d'une entrée depuis le CGridView

(Mise à jour : ajout de l'option fillIsFilter) Il est parfois utile de pouvoir remplir un CGridView directement depuis sa vue sans avoir à changer de page. Cette extension permet d'avoir un formulaire dans la grille et d'ajouter à la volée de nouvelles entrées.

Pour les anglophones, la source originale est sur cette page.

Lire la suite...

vendredi 21 juin 2013

Recherche sur plage de taille avec CGridView

En travaillant sur un système de reporting de transferts de fichier (utilisant Yii), j'ai eu besoin d'un champ permettant de faire une recherche sur la taille des fichiers, avec une syntaxe "humainement compréhensible". Et cela avec un seul champ de recherche. (traduction de mon article à http://www.yiiframework.com/wiki/516/search-a-file-size-range-in-cgridview/)

Lire la suite...

Lecture de date en PHP

Etant très souvent embêté avec les différents formats de dates utilisés au sein d'un même site, j'ai exploré le manuel PHP et j'avais trouvé DateTime::createFromFormat très pratique. Mais valable uniquement en PHP 5.3 minimum. Qu'à cela ne tienne, voici presque une équivalence pour PHP 5.1 et plus.

Lire la suite...

mercredi 28 juillet 2010

URLs raccourcies et encodage en base 62

De plus en plus de systèmes de raccourcissement d'URL existent, et le système est somme toute relativement simple à mettre en place. Il demande un peu de logique et l'utilisation d'un encodage en base 62: les 10 chiffres et les 26 lettres (minuscules et majuscules).

Lire la suite...

jeudi 1 juillet 2010

Générer des clefs RSA en php

Voici une fonction très simple pour générer des clefs RSA.

Elle ne prend qu'un argument, la longueur en bits de la clé privée (512, 1024 ou 2048). Elle retourne un tableau contenant la clef privée, la clef publique et un message d'erreur.

<?php
/**
 
 * Generates RSA keys
 
 * @param integer $pkbits Private key bits
 * Specifies how many bits should be used to generate a private key
 * Must be 512, 1024 or 2048
 * @return array Contains private key, public key and error message
 */
 
public function generateRsa($pkbits=512) {
 
   $rsaKey = array('private' => '', 'public' => '', 'error' => '');
   $pkbits = intval($pkbits);
   if ($pkbits != 512 && $pkbits != 1024 && $pkbits != 2048) {
      $rsaKey['error'] = 'Private key bits must be 512, 1024 or 2048';
      return $rsaKey;
   }
   $res = openssl_pkey_new(array('private_key_bits' => $pkbits));
 
   // Get private key
 
   openssl_pkey_export($res, $privkey);
 
   // Get public key
 
   $pubkey = openssl_pkey_get_details($res);
 
   $rsaKey['private'] = $privkey;
 
   $rsaKey['public'] = $pubkey['key'];
   return $rsaKey;
}
?>

jeudi 27 mai 2010

Fonction glob récursive

La fonction glob est utilisée dans de nombreux langages, elle sert à lister tous les fichiers (et répertoires) qui vérifient un masque.

La petite fonction qui suit sert à rechercher tous les fichiers qui vérifient un masque dans une arborescence.

<?php
/**
 * Recursive glob
 * @param string $pattern Masque à vérifier
 * @param string $path Répertoire initial
 * @param integer $flags Drapeaux
 * @return array list of files
 */
function rglob($pattern='*', $path='', $flags = 0) {
   $paths=glob($path.'*', GLOB_MARK|GLOB_ONLYDIR|GLOB_NOSORT);
   $files=glob($path.$pattern, $flags);
   foreach ($paths as $path) {
      $files=array_merge($files,rglob($pattern, $path, $flags));
   }
   return $files;
}
?>

Les drapeaux sont ceux utilisés par la fonction glob:

  • GLOB_MARK : Ajoute un slash final à chaque dossier retourné
  • GLOB_NOSORT : Retourne les fichiers tant l'ordre d'apparence (pas de tri)
  • GLOB_NOCHECK : Retourne le masque de recherche si aucun fichier n'a été trouvé
  • GLOB_NOESCAPE : Ne protège aucun métacaractère d'un antislash
  • GLOB_BRACE : Remplace {a,b,c} par 'a', 'b' ou 'c'
  • GLOB_ONLYDIR : Ne retourne que les dossiers qui vérifient le masque
  • GLOB_ERR : Stop lors d'une erreur (comme des dossiers non lisibles), par défaut, les erreurs sont ignorées.

- page 1 de 4