Posts filed under '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
.
February 20th, 2010
Ça sert toujours, une fonction pour générer une chaîne aléatoire :
PHP:
-
function randStr($len, $alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") {
-
-
$str = "";
-
-
for($i = 0; $i <$len; $i++) {
-
$str .=
$alphabet[rand(0,
$as)];
-
}
-
-
return $str;
-
}
November 15th, 2009
Il faut avouer, PHP peut faire de magnifiques erreurs. Voici deux petits exemples :
PHP:
-
<?php
-
function bug(string $str) {}
-
bug("bonjour");
-
?>
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 :
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 !
January 21st, 2009
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é.
October 31st, 2008
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.
March 14th, 2008
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:
-
<?php
-
// First of all, we need to include the class
-
require_once "class.path.php";
-
-
// Then we'll create a new path, with all options
-
// In order, the options are : the path string, is the path pointing a
-
// directory, is there some string to put before the path, and what is the
-
// separator ?
-
$path = new Path("/some/path/to/test/", true, "http://", "/");
-
-
// Obviously, I want to output an URL, just look
-
echo "It's looking like an URL: $path\n";
-
-
// Now I create a new path with a completely different delimiter
-
$path2 = new Path("\a\file.php", false, null, "\\");
-
-
// And I can just append it to the previous one
-
$path->a($path2);
-
// We could have done $path->b($path2), but it would have returned a new object
-
// with $path2 appened instead of changing $path
-
-
// And turn this into a SMB share
-
$path->setHead("\\\\");
-
$path->setSeparator("\\");
-
echo "Now it's a SMB share: $path\n";
-
-
// You can also use new basename() and dirname()
-
// Note that dirname() returns a Path and not a string
-
echo "The parent directory is: " .
$path->
dirname() .
"\n";
-
echo "The pointed file is: " .
$path->
basename() .
"\n";
-
echo "But without its extension it would be: " .
$path->
basename(".php") .
"\n";
-
?>
March 12th, 2008
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
October 7th, 2007
Youpi
J'ai gagné =D
October 1st, 2007
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.
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()
Une fois validé, vous obtenez un joli message dans la cellule :
Là il ne vous reste plus qu'à rééditer la cellule, puis à appuyer sur "entrée"
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 !
September 18th, 2007
Et voilà, mon uncentralizedDownloader est nominé sur phpclasses pour le mois d'aout 2007 =)
--> La classe
September 4th, 2007
Previous Posts