Posts filed under 'PHP'

Statut de connexion dans PHP

Ces derniers je fais un peu de push en HTTP, donc une information importante pour moi est le statut de connexion. En théorie cette information m’est donnée par la fonction connection_status(). Mais il faut savoir comment PHP connait ce statut (je n’ai regardé que pour le mod_php5 de apache et le cgi, mais c’est probablement vrai dans les autres cas) : en fait, le serveur web n’envoit jamais de signal à PHP pour dire “hop c’est bon on n’a plus besoin de toi ta gueule” quand l’utilisateur ferme sa connexion. PHP ne se rend compte de la fermeture de la connexion uniquement quand il tente d’envoyer des données au serveur, car le serveur lui dit “non je peux pas écrire les données, la connexion est fermée”.

En d’autres termes, si vous attendez un évènement (grâce à une fonction bloquante par exemple), même si vous appellez régulièrement la fonction connection_status() le résultat sera faux car vous n’avez envoyé aucune donnée. Et encore plus grave, si vous attendez votre évènement avec une fonction bloquante, le processus passe en mode S (sleep), ce qui fait que le temps est stoppé, et que le max_execution_time n’est jamais atteint : le processus reste bloqué là éternellmement. Face à ça, pas beaucoup de solutions… Vous pouvez envoyer un espace chaque seconde (en n’obliant pas d’appeller ob_flush() et flush()), ou alors vous pouvez faire des timeouts et faire en sorte que le client refasse une requête juste après, ou autre hack du genre… Vous pouvez aussi vous passer de PHP, mais ça c’est une autre histoire :) .

Add comment February 20th, 2010

Chaîne aléatoire en PHP

Ça sert toujours, une fonction pour générer une chaîne aléatoire :

PHP:
  1. function randStr($len, $alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") {
  2.     $as = strlen($alphabet) - 1;
  3.     $str = "";
  4.  
  5.     for($i = 0; $i <$len; $i++) {
  6.         $str .= $alphabet[rand(0, $as)];
  7.     }
  8.  
  9.     return $str;
  10. }

Add comment November 15th, 2009

PHP : les meilleures erreurs

Il faut avouer, PHP peut faire de magnifiques erreurs. Voici deux petits exemples :

PHP:
  1. <?php
  2. function bug(string $str) {}
  3. bug("bonjour");
  4. ?>

Ceci donne une magnifique erreur :

Catchable fatal error: Argument 1 passed to bug() must be an instance of string, string given

Une autre erreur, qui celle ci ne s'invente pas :

PHP:
  1. <?php :: ?>

Avec comme résultat :

Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM

Et là vous vous dites, mais qu'est-ce qu'un PAAMAYIM_NEKUDOTAYIM ? Haha, la réponse est sur wikipedia : il s'agit du nom donné à l'opérateur de résolution de scope ("::") en PHP...

Vive PHP !

Add comment January 21st, 2009

PDO et online.net

MAJ: online.net gère maintenant PDO, mais je laisse l'article au cas où quelqu'un en ait quand même besoin...

Je me suis retrouvé à devoir écrire une application qui est hébergé sur online.net. Donc j'ai fait un tour sur leur site, j'ai vu PHP5, je me suis dit "oh cool ça veut dire que je peux faire de la POO pour de vrai et utiliser les trucs modernes genre filter_input() et PDO".
Et bah non ! Pour filter_input ça marche, en revanche pour ce qui est de PDO c'est pas installé... C'est rigolo de découvrir ce genre de gags le jour de la mise en ligne...
Ayant clairement la flemme de tout migrer vers les vieilles fonctions mysql_* moisies et pourries, j'ai donc décidé de faire une implémentation de PDO méga à l'arrache en PHP pur qui gère juste les fonctions que j'utilise (heureusement pour moi j'ai pas encore l'habitude de jouer avec toutes les propriétés de PDO). Je le met en ligne dans l'espoir que personne n'ai jamais à l'utiliser, mais j'ai peur du contraire...
En gros question fonctionalités, j'ai implémenté vite fait tout ce qui est query/prepare/bindValue (mais attention, au moment de faire $sth->execute() ça ne vérifie pas que tous les paramètres ont été rentrés, et de plus je ne gère pas les paramètres en "?", seulement ceux en ":nom"). Il n'y a aucune gestion des exceptions/erreurs. En dehors de ça, le comportement des fonctions est exactement le même que avec le vrai PDO, sauf que il va manquer certains arguments facultatifs de temps en temps. Ah oui, et puis ça ne gère que mysql.
Bref, c'est du sur mesure pour mes besoins, il ne faut pas considérer ça comme un remplacement viable de PDO, mais comme une rustine qu'on peut adapter pour soi en cas d'extrême nécessité.

2 comments October 31st, 2008

Similarité auditive

Dans un monde où on utilise de plus en plus d'outils de recherche, dans différentes langues, il est important de pouvoir trouver ce que l'on cherche même si on n'utilise pas exactement la bonne orthographe du mot que l'on cherche. Face à ce genre de problèmes, on a vu l'apparition de certains algorithmes, comme le Soundex, qui commence à dater et est loin d'être parfait. C'est pour ça que le Metaphone a été créé, sauf qu'il ne comprend que l'anglais (tout comme le Soundex d'ailleurs), alors l'algorithme a évolué et donné naissance au Double Metaphone qui lui prend en compte les différents langages (principalement l'anglais, les langues slaves, germaniques, celtiques, le grec, le français, l'italien, l'espagnol, ou le chinois) de manière intelligente et qui permet de faire des rapprochements entre des chaines.

Comment ça marche ? C'est relativement simple (dans l'idée, par ce que en pratique c'est loin d'être le cas, d'ailleurs je crois que Lawrence Philips, l'auteur du double metaphone, mérite que la communauté du web se cotise pour lui rembourser ses frais en aspirine) : à partir des combinaisons de lettres et de leur fréquence (si je vous écris "verwandelt" vous vous doutez bien que c'est germanique) en peut savoir le genre de prononciation que ça a, ensuite il ne reste qu'à appliquer des règles sur la prononciation ("ba" se prononce presque comme "bha"), ce qui permet de créer une clef (en fait 2 dans le cas du double metaphone). Deux mots ayant la même prononciation auront la même clef.

On peut trouver diverses implantations de cet algorithme dans différents langages, dont celle ci en PHP.

1 comment March 14th, 2008

Gestion des chemins en PHP

Comme j'en avais marre de devoir constament verrifier si les chemins avec lesquels je travaillais finissaient oui ou non par "/", j'ai décidé de faire une classe pour gérer ça de la manière la plus simple possible. Vous pouvez télécharger cette classe aux formats 7zip, Bzip2 ou Zip.

Voici l'exemple d'utilisation que j'ai fait :

PHP:
  1. <?php
  2. // First of all, we need to include the class
  3. require_once "class.path.php";
  4.  
  5. // Then we'll create a new path, with all options
  6. // In order, the options are : the path string, is the path pointing a
  7. // directory, is there some string to put before the path, and what is the
  8. // separator ?
  9. $path = new Path("/some/path/to/test/", true, "http://", "/");
  10.  
  11. // Obviously, I want to output an URL, just look
  12. echo "It's looking like an URL: $path\n";
  13.  
  14. // Now I create a new path with a completely different delimiter
  15. $path2 = new Path("\a\file.php", false, null, "\\");
  16.  
  17. // And I can just append it to the previous one
  18. $path->a($path2);
  19. // We could have done $path->b($path2), but it would have returned a new object
  20. // with $path2 appened instead of changing $path
  21.  
  22. // And turn this into a SMB share
  23. $path->setHead("\\\\");
  24. $path->setSeparator("\\");
  25. echo "Now it's a SMB share: $path\n";
  26.  
  27. // You can also use new basename() and dirname()
  28. // Note that dirname() returns a Path and not a string
  29. echo "The parent directory is: " . $path->dirname() . "\n";
  30. echo "The pointed file is: " . $path->basename() . "\n";
  31. echo "But without its extension it would be: " . $path->basename(".php") . "\n";
  32. ?>

Add comment March 12th, 2008

Optimisation PHP

Voici un slide d'excellent conseil sur l'optimisation en PHP. Il regorge de tout un tas de tests que j'ai toujours voulu faire et que j'ai toujours eu la flemme de faire...

http://ilia.ws/files/phptek2007_performance.pdf

1 comment October 7th, 2007

Number One

Youpi :) J'ai gagné =D

   

2 comments October 1st, 2007

Easter Eggs

Les Easter Eggs (oeufs de pâques) ne se trouvent pas que le matin de Pâques dans le jardin : si on cherche bien, on peut en trouver dans certains applications telles que Firefox, Open Office ou Aptitude. Il s'agit la plupart du temps d'une blague, ou d'un mini jeu, comme dans Open Office. Voici donc une liste non exhaustive de ce que vous pourrez trouver :

Mozilla/Firefox

Au fil des versions de Mozilla et/ou Firefox, les développeurs ont pris soin d'écrire une "Bible" de Mozilla, dont un nouveau verset est ajouté à chaque version majeure. Pour lire le verset de votre version, tapez about:mozilla dans la barre d'addresse, et validez.

about:mozilla

Apt-get et Aptitude

Les deux gestionnaires de paquet font décidément tout pareil... Même dans les easter eggs :) Il existe une opération non documentée et pourtant implémentée dans chacun des deux. Pour vous en convaincre, tapez dans un terminal :

apt-get moo

La même opération est possible sous aptitude, mais comme aptitude fait toujours mieux les choses, leur moo se déroule en plusieurs étapes. Pour l'étape 1 :

aptitude moo

L'étape 2 :

aptitude -v moo

L'étape 3 :

aptitude -vv moo

Et ainsi desuite jusqu'à ce que le message arrête de changer.

Note: testez le moo d'apt-get sous différentes distributions, il n'est pas le même partout !

PHP

Et oui, PHP posède aussi son (ou plutôt ses) Easter Eggs. Pour cela il suffit d'ajouter une variable dans l'URL de n'importe quel site fait en PHP. La variable en question c'est ?=PHPE9568F36-D428-11d2-A769-00AA001ACF42 ou ?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000 (les deux affichent quelquechose de différent). Par exemple, on passe de http://hyperthese.net/ à http://hyperthese.net/?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000

OpenOffice.org

Pour finir ce petit listing des Easter Eggs, voici celui d'OOo qui je crois mérite la palme du plus gros. Dans un premier temps, ouvrez un classeur. Dans une cellule, tapez =game()

OOo EE - Step 1

Une fois validé, vous obtenez un joli message dans la cellule :

OOo EE - Step 2

Là il ne vous reste plus qu'à rééditer la cellule, puis à appuyer sur "entrée"

OOo EE - Step 3

Il parraitrait que ce n'est pas le seul je, visiblement vous pouvez aussi tester "Froggle" et "TicTacToe" mais personellement je n'ai jamais eu aucun résultat....

The End

Et voici donc la fin de cette petite liste... N'hésitez pas à faire tourner google, car il y a fort à parier que votre logiciel favoris posède son easter egg ! ;)

Add comment September 18th, 2007

uncentralizedDownloader : nominé !

Et voilà, mon uncentralizedDownloader est nominé sur phpclasses pour le mois d'aout 2007 =)

--> La classe

Add comment September 4th, 2007

Previous Posts


Calendar

September 2010
M T W T F S S
« Jun    
 12345
6789101112
13141516171819
20212223242526
27282930  

Posts by Month

Posts by Category

Wikipedia Affiliate Button