Optimiser WordPress avec WP-Super-Cache

Pour ce 100ème article, nous allons rapidement nous intéresser à la vitesse d’éxécution de WordPress. En effet, la grosse machinerie WordPress peut mettre plusieurs secondes à générer une simple page d’article lorsqu’elle est installée sans plus de configuration. En effet, les différents plug-ins, thèmes et compagnies ne font pas de WordPress quelque chose de rapide, dans la mesure où le nombre de fichiers chargés pour une simple page peut aller jusqu’à 1000 et le nombre de requêtes SQL est colossal!

WordPress sans cache

Je vais prendre les chiffres de D-Sites: sans cache avec quelques plug-ins (captcha/statistiques/coloration syntaxique) et sur un hébergement mutualisé OVH, la page d’accueil par exemple, met en moyenne 2 secondes pour être générée, comme l’atteste le site IsMyBlogWorking.

blog-before-supercache

Deux secondes pour afficher une page, c’est beaucoup beaucoup trop, nous allons donc mettre en place le cache. Pour le mettre en place sur un blog WordPress, rien de plus simple: dans l’administration, dans le menu Extensions, cliquez sur Ajouter. Ensuite, il vous suffit de rechercher un plug-in au nom de “WP Super Cache”. Installez-le de manière automatique, tout marche très bien, créez les règles dans le fichier HTACCESS puis ça roule !

Continue reading Optimiser WordPress avec WP-Super-Cache

facebooktwittergoogle_plusredditpinterestlinkedinmail

jCryption2: Une utilisation plus personnalisée de jCryption

Suite à la sortie de jCryption 2.0 qui ajoutes les mêmes fonctionnalités, je ne met plus à jour cette librairie.

jCryption est une petite application JavaScript utilisant jQuery à ajouter à votre site qui permet de crypter un formulaire de données à l’aide d’un système de clé publique/clé privée. Ainsi, tout ce qui circule sur le réseau est protégé! Cela peut être utile lorsque qu’il vous est impossible de mettre en place un accès HTTPS ou lorsque le client (le visiteur) ne supporte pas le HTTPS mais a le JavaScript.

Le problème, c’est que à vouloir tout faire, jCryption fait trop. En effet, en deux lignes de code, jCryption récupère les champs du formulaire, récupère les clés de cryptage, crypte les données, les compacte puis les envoi à l’attention du script décrit dans l’attribut action de la balise <form>.

C’est pourquoi j’ai décidé de créer un jCryption2, qui ne vise en aucun cas à remplacer jCryption, ou à se prétendre supérieur mais plutôt à être tout aussi accessible, ce qui permet de choisir entre la simplicité (jCryption) ou la personnalisation (jCryption2). Ainsi, jCryption permet de récupérer les clés de cryptage de n’importe quelle façon et d’envoyer les données cryptées de n’importe quelle façon: vous devez créer une instance de jCryption2Key qui décrit la clé publique et vous devez définir un callback (une fonction de retour) lorsque l’encryptage sera terminée, avec comme seul paramètre la chaine cryptée.

En tout aussi peu de lignes, nous avons un système permettant de crypter les données envoyées de manière beaucoup plus personnalisée car vous pouvez récupérer les clés d’un fichier FTP par exemple, puis envoyer la chaine cryptée vers un socket, à l’aide de jSocket par exemple !

Continue reading jCryption2: Une utilisation plus personnalisée de jCryption

facebooktwittergoogle_plusredditpinterestlinkedinmail

De nouvelles traductions pour i2c

Après l’ajout de nouvelles fonctions à l’interface SOAP d’i2c, voici 4 nouvelles traductions disponible pour les fonctions donnant le nom réel des pays et des continents:

  • es_ES – Spanish
  • nl_NL – Dutch
  • de_DE – German
  • pt_PT – Portuguese

La page du projet i2c à été mise en jour en conséquence, ce qui porte donc à 6 le nombre de langues supportées par les fonctions de traduction d’i2c.

facebooktwittergoogle_plusredditpinterestlinkedinmail

I2C: Quatres nouvelles fonctions SOAP

Quatre nouvelles fonctions ont été ajoutées aujourd’hui au SOAP d’I2C:

  • getCountries() – Permet de récupérer la liste de tous les pays disponibles sous forme de leur code ISO séparés par des virgules
  • getCountryName($country_code, $langue) – Permet de récupérer le nom réel du pays en fonction de son code ISO dans la langue demandée
  • getContinent ($country_code) – Retourne le code du continent en fonction du code ISO du pays
  • getContinentName ($continent_code, $langue) – Retourne le nom réel du continent en fonction de son code dans la langue demandée

Lorsqu’il y a besoin de spécifier la langue, les langues disponibles sont:

  • fr_FR – Français
  • (par défaut)

  • en_US – English

Note: d’ici peu, d’autres langues vont arriver.

Vous pouvez dès à présent utiliser ces fonctions, sans même avoir un compte utilisateur, sans même utiliser la fonction login.

facebooktwittergoogle_plusredditpinterestlinkedinmail

Gettext: Utiliser plusieurs fichiers de traduction en même temps

Dans certains projets modulaires, certains modules utilisent l’internationalisation (avec gettext notamment). Le problème, c’est quand il y en a plusieurs, quel fichier gettext va-t-il être utilisé ? C’est assez difficile à répondre car gettext est très…très pauvre en fonctions de débugguage. En réalité c’est impossible de débugguer gettext sans procéder par tests.

Du coup, ça serait très pratique d’utiliser plusieurs fichiers compilés de langue. Pour ça, il y a la fonction ngettext qui permet de spécifier le nom du domaine à utiliser. Le nom du domaine c’est le premier paramètre de bindtextdomain qui vous avez dû appeler pour initialiser le fichier de texte à trouver dedans.

C’est très pratique, surtout, lisez la documentation de ngettext pour pouvoir utiliser plusieurs fichiers de traduction dans un même programme PHP !

facebooktwittergoogle_plusredditpinterestlinkedinmail

PHPpgAdmin 4.2.2 et PHP 5.3

Depuis PHP 5.3 toutes les fonctions utilisant les regex POSIX (ereg* et split*) sont maintenant obsolètes (qualifiée de DEPRECATED dans la documentation) et vont être supprimées dans PHP 6. Ces fonctions étant moins performantes, devenues presque inutiles à tous les projets cherchant la performance et surtout alourdissant PHP dans le sens où il y avait deux choix possible de regex, il était normal qu’elle disparaissent.

Néanmoins, il faut savoir que c’est la méthode la plus ancienne et donc la plus utilisée dans les portions de codes les plus vielles. Il se trouve que dans la version 4.2.2 de phpPgAdmin (dernière version stable, sortie il y a 1 an à deux jours près ;-)) il y a encore ces fonctions à quelques endroits, provoquant des Warning lors de l’éxécution de phpPgAdmin sous PHP 5.3.

Pour supprimer ces erreurs, voici un patch dans lequel j’ai remplacer toutes les occurrences de ereg* et split* par les équivalents en regex PCRE:

facebooktwittergoogle_plusredditpinterestlinkedinmail

PostgreSQL: Utiliser le principe du type “varlena”

PostgreSQL utilise depuis Postgres le type varlena, qui signifie variable length array en anglais, soit tableau à taille variable en français. Ce type permet de stocker des données à taille variable dans la base de données. Le principe est très simple: stocker en mémoire une ou plusieurs données de façon contiguë. De plus, il ne doit pas y avoir de pointeur dans le type.

La structure “de base” de varlena est définie dans le fichier src/include/c.h, line 401 pour PostgreSQL 8.4 par:

Note: le premier tableau de 4 caractères peu très bien est remplacé par un int32, ça revient au même: 4 octets.

Ce type représente le principe: un champ vl_dat, qui contiendra la donnée et d’autres champs qui ne doivent pas être des pointeurs, mais des entiers le plus souvent (ici un tableau de 4 caractères), qui contiennent des informations sur cette donnée. Cela permet à PostgreSQL de pouvoir stocker sur le disque et en mémoire toutes les données en une fois, pouvant ainsi les déplacer comme bon lui semble.

Attention: la propriété qui contient les données doit être la dernière propriété de la structure.

Tout type de donnée un peu complexe doit utiliser ce principe lorsqu’il stocke des données de taille variable en base afin d’assurer une intégrité aux données stockées. Nous allons voir, à l’aide de la librairie parse_url pour PostgreSQL, comment créer un type de données stockant de nombreuses données de taille variable dans une seule et même donnée, dans le but d’être utilisé comme type de colonne dans une table par exemple.

Continue reading PostgreSQL: Utiliser le principe du type “varlena”

facebooktwittergoogle_plusredditpinterestlinkedinmail

Cannot represent a stream of type SSH2 Channel as a select()able descriptor

Une extension PHP nommé ssh2, que l’on peut retrouver dans le dépôt pecl permet de se connecter à un serveur SSH depuis un script PHP à l’aide de plusieurs fonctions. Plus particulièrement, la fonction ssh2_shell qui retourne un flux de données, ou stream, nous permet de mettre en place entre le script PHP et le serveur SSH un vrai échange complet. L’intérêt d’avoir un flux de données pour converser avec un serveur SSH est que l’on peut manipuler assez facilement à l’aide de toutes les fonctions stream_* ces flux. Ça, c’est la théorie.

En pratique, il s’avère que l’utilisation d’un flux SSH2 Channel (retourné par ssh2_shell) avec la fonction stream_select qui permet d’attendre que le flux “change” – c’est-à-dire qu’une donnée arrive – est impossible. En effet, pour utiliser le flux avec stream_select, il faut pouvoir transformer ce flux en une donnée utilisable par la fonction C select(). C’est ce que l’on appelle “caster un stream” en franglais et “to cast a stream” en anglais. Le problème, c’est que la librairie pecl/ssh2 (basée sur libssh2) n’implémente pas cette fonctionnalité, ce qui nous donne droit à un magnifique:

Warning: stream_select() [function.stream-select]: cannot represent a stream of type SSH2 Channel as a select()able descriptor in /path/to/file.php on line XX

Nous allons donc voir comment ajouter cette fonctionnalité simplement, à l’aide de patchs développés par mes soins. Continue reading Cannot represent a stream of type SSH2 Channel as a select()able descriptor

facebooktwittergoogle_plusredditpinterestlinkedinmail