Kamelot Blog

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

mardi 26 juin 2012

mar
26
juin '12

Sphinx : éléments de base.

Plusieurs fois j'ai déjà parlé de sphinx, mais je me rends compte que je n'ai pas une seule présentation "de base".

Je n'ai pas l'intention de refaire ce qui existe déjà mais je voulais présenter le workflow général.

Je trouverai très chouette que si quelqu'un connait elasticSearch, ou solr, ou autre ..., il fasse de même que je puisse le référencer pour comparaison.

SphinxSearch propose un outil d'indexation : indexer

Cet outil va lire 3 des 4 sections du fichier de configuration

  1. Les indexs
  2. Les sources
  3. Les paramètres de l'indexation

Les index sont de 2 types.

  • lié à une source
  • agrégateurs de plusieurs autres indexes (locaux ou distant) ; On les appelle distribués

Une source c'est la définition qui permet d'aller chercher l’information à indexer et une définition de chaque champs.

Ca peut-être une requête SQL sur Mysql ou Posgress

Ou sur un contenu XML.

Le Xml est surtout pensé pour en faire un format d’échange pour en fin de compte pouvoir indexer, tout ce qui peut être transformé en XML.

Même si je ne connais pas très bien lucene et solr, c'est sur le point précédent que ces derniers sont plus fort que sphinx. Ils sont plus adaptés pour indexer des sources hétérogènes, des documents.

Après avoir executé l'indexation on a donc "lu" la source et fabriqués des indexs.

On a un premier niveau pour exploiter ces indexs

Faire une recherche

On peut utiliser search

Celui-ci attaque directement l'index. Sans passer par le service. C'est donc très utile pour tester ses index mais il ne faut en aucun cas envisager une utilisation en production.

En outre, puisqu'il n'utilise pas searchd, il ne permet pas d'utiliser les indexs distribués

On va donc lancer ce service : searchd

Celui-ci va utiliser 2 sections du fichier de configuration.

  1. Les indexs
  2. Les paramètres du service.

Le service va charger en mémoire les indexs et les rendre disponible via une api sur un port donné.

Puisqu'il y a service, il y a client

Jusqu'à présent j'ai vu 3 clients

Il y en a d'autres puisqu'il y a ruby, c++, perl, Haskell, C#, mais aussi des plugins tout prêts pour Yiiframework, Drupal, Symfony, phpBB, MovableType, MediaWiki, Phorum, Thinking Sphinx, Rails,... le tout à trouver sur la page plugin

Avec le client choisi on va pouvoir interroger l'index, servi localement ou sur le réseau par searchd

On récupère alors une liste d'id (uniques) et la valeur des attributs. (pas les textes)

On peut alors faire une jointure avec la source pour retrouver les données dans leur dernier état.

jeudi 7 juin 2012

jeu
07
juin '12

Réorganiser une classe.

Pour mon premier post depuis un bon bout de temps, je viens avec une question.

Comment organisez vous vos méthodes dans vos classes ?

  • toujours ajouter la dernière en bas ?
  • le construct et le destruct en haut ?
  • tous les setters ensembles ?
  • ou chaque setter à coté de son getter ?
  • triés alphabétiquement ?
  • ...

Et surtout comment organisez-vous vos classes ?

Je veux dire faites vous comme moi de bêtes couper/coller ? ou avez-vous une astuce ?

Personnellement, comme j'utilise comme on utilise du ZendStudio et du aptana, ca me plairait bien d'avoir un outil qui afficherait la liste des méthodes et propriétés comme "outline" mais avec lequel il serait possible de faire un drag&drop dans la liste pour que le code se mette à jour pour reproduire cet ordre.

Merci pour vos réponses....

jeudi 29 mars 2012

jeu
29
mar '12

3 petites nouveautés que j'ai repéré dans l'indexer Sphinx : 3° --dump-rows

--dump-rows

Cette option va regénérer un code sql dans une fichier.

Ce code SQL va regénérer une table basée sur nom de la source d'indexation et en y insérant ce qui a été lu par l'indexation.

donc

si j'ai

source  ma_source {
(...)
sql_query = "Select id, nom, prenom, age From ma table_source"
}

ca va donner

Une table rows_ma_source

avec 4 colonnes dans la quelle on voit un insert des valeurs récoltées.

mardi 27 mars 2012

mar
27
mar '12

3 petites nouveautés que j'ai repéré dans l'indexer Sphinx 2.0 : 2° --print-queries

C'est tout simple avec --print-queries on voit directement à l'écran les requêtes SQL qui sont exécutées.

C'est bien pratique pour le debug.

Ca me fait penser à une autre astuce, non spécifique à Sphinx, mais que j'ai commencé à utiliser avec Sphinx.

Dans mes requêtes sql , je met toujours derrière le select un commentaire par exemple

Select /* blablah */ champs1 From  matable

Pourquoi ?

pour la reconnaître facilement dans mytop.

Vous ne connaissez pas mytop ? et vous utilisez mysql ?

Faite donc vite un

sudo apt-get install mytop

et lisez ceci : http://wiki.goldzoneweb.info/mytop

mar
27
mar '12

3 petites nouveautés que j'ai repéré dans l'indexer Sphinx 2.0 : 1° --sighup-each

source : http ://sphinxsearch.com/docs/2.0.4/ref-indexer.html

--sighup-each

Problème en indexant plusieurs indexs avec un seul appel ca me donne

indexer --config sphinx.conf --rotate --quiet  chunk-1 chunk-2 chunk-3 chunk-4 chunk-5 chunk-6

Il fallait attendre que le chunk-6 soit fini pour que le chunk1 indexé depuis un certain temps soit en ligne. Dommage.

du coup j'avais refait

   ./indexer --config sphinx.conf --rotate --quiet chunk-1 && 
   ./indexer --config sphinx.conf --rotate --quiet chunk-2 && 
   ./indexer --config sphinx.conf --rotate --quiet chunk-3 && 
   ./indexer --config sphinx.conf --rotate --quiet chunk-4 && 
   ./indexer --config sphinx.conf --rotate --quiet chunk-5 && 
   ./indexer --config sphinx.conf --rotate --quiet chunk-6 

indigeste mais ca fonctionne mais indigeste quand même

Grâce à --sighup-each on peut resimplifier ca

indexer --sighup-each  --config sphinx.conf --rotate --quiet chunk-1 chunk-2 chunk-3 chunk-4 chunk-5 chunk-6

Donne le même résultat juste avec une option en plus.

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/

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 14 février 2011

lun
14
fév '11

Paramètre commentaire de SphinxClient::query

Je fait pas mal de tests sur sphinx pour le moment.

En lisant PHP: SphinxClient::query - Manual

[php]
public array SphinxClient::query ( string $query [, string $index = "*" [, string $comment = "" ]] )

Mon attention a été attirée par le 3ème paramètre. (supporté par sphinx depuis la Version 0.9.8 du 14 juillet 2008)

En fait ce paramètre accepte une chaine de caractère qui se retrouve dans le query.log

[php]
$result = $hSphinx->query('leMotQueJeCherche', '*', 'mon commentaire');

Ce paramètre existe aussi en SphinxSE mais ce n'est pas documenté,

Il suffit d'ajouter ';comment=mon test' dans la chaine query,

query='leMotQueJeCherche;comment=mon commentaire';

Et voila dans le query.log

[query.log] [Mon Feb 14 14:54:00.216 2011] 0.091 sec [any/0/rel 14094 (5000,99)] [*] [ios=0 kb=0.0 ioms=0.0 cpums=91.5] [mon commentaire] leMotQueJeCherche

Ce qui est très pratique avec un tail -f et un grep pour ne voir que les rêquetes faisant partie du test,

Lire la suite...

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

dimanche 3 octobre 2010

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...

vendredi 10 septembre 2010

ven
10
sep '10

StrToNum ou comment convertir une chaine en nombre ?

Dans Sphinx, les filtres doivent être scalaires. J'avais donc un problème pour obtenir une version numérique d'un code pays.

ASCII(str) transforme le premier caractère de votre chaine en nombre.

Mais comment faire pour avoir un nombre différent pour 2 chaines ayant le même premier caractère ?

J'étais parti dans un délire :

  ASCII(code)-65 + (ASCII(substr(code,1,0)-65+26)  ...

Puis j'ai un peu regratté la doc et j'ai trouvé HEX()

HEX(N_or_S)




Si N_OR_S est une chaîne de caractères, cette fonction retournera une chaîne de caractères hexadécimale de N_OR_S où chaque caractère de N_OR_S est converti en 2 chiffres hexadécimaux.

edit: Je n'ai par contre pas encore trouvé d'équivalent PHP. En PHP on a bin2hex. pour obtenir la même chose.

SELECT HEX('hello'),HEX('ZZ'),HEX('0A'),HEX(0xA);
HEX('hello')  HEX('ZZ')  HEX('0A')  HEX(0xA)
------------  ---------  ---------  --------
68656C6C6F    5A5A       3041       0A      

HEX('php')  HEX('PHP')  HEX('Php')
----------  ----------  ----------
706870      504850      506870    

HEX('aa')  HEX('ab')  HEX('AA')  HEX('AB')  HEX('ZZ')
---------  ---------  ---------  ---------  ---------
6161       6162       4141       4142       5A5A     

Edit (2010-09-30)

Visiblement mon blog est très lu : je dit une grosse connerie et personne le remarque.

Mon objectif présenté ici est de transformer une chaîne en nombre et la solution que je présente ne donne pas le résultat escompté.

En effet HEX('ZZ') -> 5A5A reste une chaine (0x5A5A est un nombre)

Donc pour finaliser le travail il faut reconvertir le hex en dec

avec CONV(leresultat, 16, 10) en mysql et avec hexdec() en php (et pas hex2dec )

samedi 4 septembre 2010

sam
04
sep '10

Sphinx : j'en dit un peu plus sur ce moteur de recherche

Je parlais il y a 2 jours de sphinx en expédiant une explication en 2 secondes.

Le lendemain, je vois sur Planet Mysql que Shlomi Noach publiait un article pour remettre les pendules à l'heure sur ce qu'est sphinx

Je vais donc en dire un peu plus.

Sphinx est un moteur d'indexation/recherche open-source sous GPLv2.

On utilise indexer pour scanner ce qu'il faut indexer, cela génère des fichiers que searchd rend consultables.

Pour attaquer searchd, on a search en ligne de commande.

Mais on a aussi

  • SphinxSE: un engine mysql, il sera inclus directement dans les prochaines versions de mariaDb
  • SphinxAPI: que l'on peut utiliser en php avec un package pecl dedié mais aussi avec les apis officielles Php, Python, Java, Ruby, pur C, fournies avec sphinx, ou bien encore Riddle pour Ruby, Sphinx::Search pour perl, C++ Sphinx client, Haskell Sphinx client, C# .NET client, ...
  • SphinxQL: une syntaxe sql adaptée

Recherche

Pour la recherche elle même on a les syntaxes avancées sur le texte ...

  • et, ou , mais pas,
"hello world" @title "example program"~5 @body python -(php|perl) @* code
  • les quorum (je donne 7 mots et je veux qu'il y en aie au moins 4 dans chaque résultats)
  • la pertinence (ce mot là a plus de poids dans le titre, celui ci partout, ... )
  • la distance dans le texte : ces 2 mots là doivent être séparés par moins de n mots
  • Des remplacements
    • de caractères pour les problèmes de charset
    • les remplacements magiques (si je cherche email, je trouve aussi les contenus avec le mot courriel) sur base de vos listes (voir exemple en bas)
    • Morphologie linguistique, stemming (gestion des pluriels),
    • listes de mots interdits
    • listes de dictionnaires personnels pour la correction magique
  • ...

.. Les critères de filtre et tri annexe

  • groupes (avec decompte par groupe)
  • temporels
  • géographiques
  • ...

J'en passe bien sur.

Le service searchd est consultable via réseau (donc si vous utilisez SphinxSE il n'est pas embarqué dans la DB il peut/ils peuvent être ailleurs) avec ssl et tout le brol.

Indexation

La première chose à distinguer c'est qu'il n'est pas limité à mysql ni même à des bases de données. On peut indexer tout ce qui peut être parsé, moyennant une conversion vers un fichier xml.

On peut indexer des sources hétérogènes les mélanger comme on peut indexer partiellement une source monolithique.

On peut indexer "sur le coté" pendant que l'index précédent reste actif et swapper à la fin (très difficile à faire : il faut ajouter un --rotate)

On peut indexer par petit morceaux et exploiter les partitions ou les merger

On peut répartir les indexs sur plusieurs serveurs

Brefs il y a moyen de distribuer la recherche et l'indexation.

Il y a des techniques de RealTime indexing mais c'est dans la 1.10-beta

Lire la suite...

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.

mercredi 1 septembre 2010

mer
01
sep '10

Nombre de résultats d'une recherche SphinxSe

Logo Sphinx Sphinx est un moteur de recherche full-text

On peut l'interroger au travers de son api, SphinxQL, en ligne de commande ou avec l'engine MySql SphinxSE

J'utilise MySqlSE;

SELECT * from INFORMATION_SCHEMA.ENGINES;

ENGINE SUPPORT COMMENT                     TRANSACTIONS  XA      SAVEPOINTS
------ ------- --------------------------- ------------  ------  ----------
...
SPHINX YES     Sphinx storage engine 0.9.9 NO            NO      NO        

La question du jour était : Y a-t-il un moyen de connaître le nombre total de résultats quand on utilise un limit ?

En Mysql simple, il y a SQL_CALC_FOUND_ROWS

mysql> SELECT SQL_CALC_FOUND_ROWS * 
    -> FROM tbl_name
    -> WHERE id > 100 LIMIT 10;
mysql> SELECT FOUND_ROWS();

Le second SELECT retourne un nombre indiquant combien de lignes le premier SELECT aurait retourné s'il n'avait pas été écrit avec une clause LIMIT.

Mais avec avec SPHINX

En testant sur ma table tbl_name_sphinx qui contient 2410 rows.

select SQL_CALC_FOUND_ROWS * from tbl_name_sphinx WHERE query='' LIMIT 10;
SELECT FOUND_ROWS();
Résultat
FOUND_ROWS()
------------
          20

20 parce que c'est la valeur par défaut du limit de sphinx

# limit - amount of matches to retrieve from result set, default is 20; (ref)

En effet si je force ce limit à 10

select SQL_CALC_FOUND_ROWS *
 from tbl_name_sphinx 
 WHERE query=';limit=10';

SELECT FOUND_ROWS();
Résultat

FOUND_ROWS() -> 10

Pourquoi ? parce que c'est sphinx qui fait la vraie recherche et remonte son résultat à MySql

Donc quand je fait

select SQL_CALC_FOUND_ROWS * 
 from tbl_name_sphinx 
 WHERE query=';limit=1000' 
 LIMIT 10;

Je reçois 10 résultats sur 2410 réels et sur les 1000 que sphinx a remonté

Donc

SELECT FOUND_ROWS(); -> affiche 1000 et pas 2410.

Donc je vais monter mon limit à 1000000.

Gloups, je viens de demander à Sphinx de me préparer en résultat de 100K rows, tout renvoyer à mysql dans une table temporaire qui me retournera uniquement les 10 premiers.... Fameux gaspillage

Quand on sait que sphinx ne me retourne que les id et que donc il faut faire un join avec la table de données, ca fait mal.

la solution

SHOW ENGINE SPHINX STATUS;

On oublie le 'SQL_CALC_FOUND_ROWS'

Et on remplace FOUND_ROWS() par SHOW ENGINE SPHINX STATUS;

On remet le limit 10 au niveau de sphinx;

select  * 
 from tbl_name_sphinx 
 WHERE query=';limit=10';

SHOW ENGINE SPHINX STATUS;

Type    Name    Status                                           
------  ------  -------------------------------------------------
SPHINX  stats   total: 1000, total found: 2410, time: 0, words: 0

Bingo j'ai mon info, planquée dans une "chaine" mais je l'ai.

re bingo

 SHOW STATUS LIKE 'sphinx_%';

Mais je préfère INFORMATION_SCHEMA.

SELECT *
 from information_schema.GLOBAL_STATUS
 WHERE VARIABLE_NAME like 'SPHINX%';
VARIABLE_NAME       VARIABLE_VALUE
------------------  --------------
SPHINX_ERROR        208409        
SPHINX_TIME         0             
SPHINX_TOTAL        1000          
SPHINX_TOTAL_FOUND  2410          
SPHINX_WORD_COUNT   0             
SPHINX_WORDS                      

Et je suis un heureux.

Si vous êtes intéressés par Sphinx, voici un bon article pour l'installer.

Si vous vous êtes déjà intéressé à Zend_Search_Lucene, (bien décrit ici) il me semble avoir que celui-ci peut utiliser Sphinx comme backend. je corrigerai si je retrouve la source.

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

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.

jeudi 28 janvier 2010

jeu
28
jan '10

Chaque chose en son temps avec Zend_Queue

Zend_Queue a été proposé par Justin Plock et ajouté à Zend_framework.

En voici la documentation

Voici son API

Dans cet exemple pour l'envoi de mail vous trouverez le script appelé, le cron appelant et la classe qui mes ses emails en queue.

Il peut utiliser MemcacheQ, Simple Queue Service over Memcache.

Moi j'ai commencé mes essais avec Zend_Queue, vous pouvez récupérer cela par SVN. Et suivre mon repository où je rassemble les exemples de la doc et des tutos, ainsi que mes propres essais.

Quelques lectures Stacks and Queues, Files sur Wikipedia, priority Queue, point de vue théorique : mise en bouche en français créusée en anglais, dans la SPL

mercredi 25 novembre 2009

mer
25
nov '09

Monitoring de memcache

Je n'ai rien trouvé de mieux que memcache.php like apc.php pour monitorer un peu les serveurs memcache.

Je ne sais pas si quelqu'un a déjà trouvé mieux (je suis preneur).

Ca présente les serveurs disponibles, l'espace alloué, les variables stockées avec leur valeurs ...

Edit : Une liste

dimanche 11 janvier 2009

dim
11
jan '09

Comment basculer un code PHP en UTF-8

Martine écrit en utf-8Beaucoup trop de tuto ou articles que je lis dans la presse (Programmez, PHPSolution, ...) ou sur le net, présentent le "comment bien faire" en partant de zéro.

Trop peux parlent de "comment transformer". Il y a énormément d'existant qui est là et qui ne peut être simplement mis à la poubelle parce que on a trouvé une meilleures méthode.

Je voulais commencer à écrire dans ce sens des réflexions sur ce qui porte à la pratique de la transition et voilà que Sébastien Piraux, partage un article sur son compte fb.

Passer son code en UTF 8

C'est sur kitpages et ca explique Comment basculer un code PHP en UTF-8

Voici son intro

Si vous souhaitez coder un outil ou un site qui fonctionne avec des caractères ésotériques (Chinois, Arabe, Indien,...), vous devez changer la façon de coder vos caractères et de les transmettre sur le réseau. Cette façon de coder les caractères s'appelle le Charset. Le plus courant par nos latitudes est le charset ISO-8859-1. Il contient les caractères européens.

Pour écrire des textes en chinois, arabe, hébreux, indien, japonais... vous devez utiliser un charset qui permettent de coder tous les caractères de ces langues. Le charset le plus standard pour coder tout ça est UTF-8.

En attendant que je commence à m'y mettre, si vous avez d'autre ressources du style n'hésitez pas à me les faire connaitre.

Ressources signalées :

mercredi 17 décembre 2008

mer
17
dec '08

PEAR::Pager Liste des tutoriaux

Traduction d'une série d'articles de Lorenzo Alberton

Il lui est souvent posé des questions sur la façon d'utiliser PEAR::Pager. Cela va de la manière efficace de paginer des résultats lu dans une base de données, à l'utilisation combinée de PEAR::Pager et javascript ou de PEAR::Pager et AJAX, en passant par l'utilisation de PEAR::Pager et de mod_rewrite. Étant donné que ces questions sont de plus en plus récurrentes sur sa boîte mail ou sur les mailing-lists de PEAR, il a décidé d'écrire cette série de petits tutoriaux :

Vous désirez un sujet particulier? vous voulez utiliser Pager de façon inhabituelle? S’il vous plaît envoyez un mail à Lorenzo avec votre idée.

samedi 9 août 2008

sam
09
aoû '08

PEAR::PAGER, Paginations d'article, ou comment naviguer dans les paragraphes d'un article avec le paginateur

Ce texte est une des traductions d'une série d'articles de Lorenzo Alberton

Vous avez probablement vu beaucoup de sites Web comporter des articles longs et détaillés, qui sont coupés en paragraphes, chacun présenté dans une page séparée.

Les utilisateurs préfèrent souvent lire les morceaux courts du texte au lieu de faire défiler une très(trop) longue page (à moins qu'ils ne veulent l'imprimer).

Dans ce tuto, nous allons voir comment nous pouvons établir un système de paginations d'article, a l'aide de PEAR::Pager.

Lire la suite...

mardi 15 juillet 2008

mar
15
juil '08

Vendredi c'est l'apéro php de Bruxelles et le 20 aout c'est le 2eme meeting (pas apéro) à Gand

Vendredi aura lieu le prochain apérophp à "la lunette" place de la monnaie à Bruxelles. 19h le 18 du 7 espérons être au moins 6 ....

Signalez votre participation pour cette rencontre informelle




Au mois d'Août aura lieu le 2ème phpBelgium Meeting.

Plus conventionnel, il y aura des présentations/discussions au sujet de diverses matières connexes par PHP, telles que la certification de Zend PHP5, le Zend framework et davantage.

Envoyez vos idées l'adresse pour les intéressés c'est http://upcoming.yahoo.com/event/805818. et suivez le twit de phpBelgium

samedi 28 juin 2008

sam
28
juin '08

Voilà l'aperoPHP de Mons est fini, oui oui il n'est que 20h

Me voilà déjà de retour, aigri...

J'ai attendu seul pendant une heure, puis je me suis barré.

Depuis 6 ans maintenant que j'essaye d'en organiser, le constat reste le même, si je n'amène pas mes collègues (qui viennent de moins en moins souvent puisqu'ils ont déjà à me supporter la semaine), il n'y a que 2 ou 3 curieux qui se pointent, cette fois ci même pas un.

Un peu blasé du larvisme de la communauté des utilisateurs de php en Belgique, J'hésite à annuler le reste des aperoPHP Belges ... J'irais à Lille où ca bouge bien.

samedi 21 juin 2008

sam
21
juin '08

SVN 1.5 et php

Subversion (SVN) 1.5 est disponible avec plus de 150 corrections de bugs et améliorations.

Voici une présentation a propos de son utilisation dans le cadre du développement d'application PHP

SlideShare | View Et Tortoise SVN sort sa version 1.5.0 par la même occasion

Tags