Christophe Le Bot

  • Navigation rapide
Pratique de la conception numérique

Derniers commentaires

  • Une excellente thèse sur Simile Exhibit
    • Olivier Rossel | Bonjour. Malgre les annees, avez vous toujours en memoire vos usages d’Exhibit? Je serais ravi d’en discuter avec vous. Cordialement, Olivier Rossel.
  • Utiliser le planificateur de tâches OVH (crontab) avec PHP
    • Max | Bonjour, comme faire pour appeler une version de PHP qui n’est plus proposée par défaut dans le manager ? J’essaie de lancer un cron avec php 5.3 mais le log affiche No such file...
    • Christophe | @absolument Merci pour ces précisions. Je n’ai pas mis en place de tâches cron récemment, mais j’ai reçu quelques notifications étranges d’OVH il y a quelques...
  • Récupérer le dernier auto-incrément MySQL avec PHP
    • Thy | Sujet toujours *très* utile en 2015 ! Je réponds à Serge tsimba qui récupère un « Resource id ». (Et à tous ceux qui ont le même souci mais qui ne le disent pas) :)...
  • Régler l’heure de serveurs virtuels sous Debian
    • Ares_XL | Il semble que sur Débian la commande « tzconfig &ra quo; soit dépréciée et remplacée par : « dpkg-reconfigure tzdata » elle donne accès à une...
 

Archives de la catégorie
Exploiter

Utiliser le planificateur de tâches OVH (crontab) avec PHP

Site web OVH

De nombreuses applications web ont besoin d’exécuter périodiquement des scripts pour réaliser des tâches automatiques : purge de logs, traitement de données, lancement de sauvegardes… Quand vous avez la main sur votre propre serveur, tout va bien : vous utilisez les crontabs. Mais quand vos applications sont hébergées sur un serveur mutualisé, c’est déjà moins accessible !

Heureusement certains hébergeurs proposent des solutions alternatives efficaces. C’est le cas d’OVH avec son Planificateur de tâches. Une aide officielle existe, mais sans être inexacte, elle est un peu rapide. Du coup, j’ai passé plus de temps que prévu pour que tout fonctionne à merveille. Voilà comment s’y prendre.

Préparer son script PHP

Première étape : préparer le script de traitement PHP qui sera appelé par la tâche planifiée. Pour que le serveur appelle le bon interpréteur (dans notre cas PHP), le script a besoin de le définir en première ligne. Il faut donc ajouter cette ligne à votre script PHP :

#!/usr/local/bin/php

Elle se place en tout premier. On obtient donc ceci :

#!/usr/local/bin/php
<?
// La suite de mon script PHP...

Si vous avez besoin d’appeler d’autres scripts PHP ou de manipuler des fichiers, n’oubliez pas de travailler avec des chemins absolus. Par exemple en utilisant une variable qui définit l’endroit où est placé votre script :

$path = dirname(__FILE__);

Une fois votre fichier PHP placé sur le serveur, il faut lui ajouter le droit d’exécution (avec votre outil FTP, par exemple). Par défaut, les droits des fichiers sont calés en lecture + écriture (604), vous devez obtenir les droits en lecture + écriture + exécution (705).

Planifier la tâche

Côté serveur, c’est fini. Maintenant, il faut planifier la tâche. Pour cela, nous passons par le Manager OVH (ou Espace client, depuis peu). Le Planificateur de tâches est caché derrière Mutualisé > Hébergement > Services web.

Manager OVH - Crontab

Lors de l’ajout d’une tâche, nous devons définir ses propriétés :

  • Description de la tâche
  • Script à exécuter (chemin depuis la racine FTP de votre espace mutualisé)
  • Langage de script (avec le choix très important de la version de PHP à exécuter)
  • Logs par e-mail (permet de recevoir par e-mail un log de l’exécution du script)
  • Activation
  • Périodicité

L’interface est si simple que je n’ai rien à expliquer !

Propriétés d'une tâche planifiée OVH

Une fois validée, la tâche sera exécutée comme vous l’avez prévu. Enfin presque… Deux écarts constatés avec la théorie :

  • La mise en place de la tâche planifiée est parfois longue (j’ai dû attendre plus de 24h sur un de mes sites avant de la voir tourner).
  • Elle s’exécute rarement à l’heure prévue (la pile d’exécutions doit être longue, du coup j’atteins parfois des décalages de 20 à 30 minutes).

Suivre l’exécution de la tâche

Une fois tout ça en place, ça devrait tourner tout seul… Je suppose que vous testerez bien votre script d’abord, mais on n’est pas à l’abri de surprises à l’exécution. OVH vous offre donc les logs par e-mail ! La fonctionnalité est proposée dans le Planificateur de tâches et limitée à 10 envois (on peut la réactiver à la demande si besoin).

Vous recevrez alors un message du genre :

Vous avez demandé l'envoi des logs pour la tâche :

Numéro            : 123456
Heure de début    : 2013-10-08 02:21:02
Heure de fin      : 2013-10-08 02:21:19
Commande exécutée : /usr/local/bin/php.ORIG.4 -c /usr/local/lib/php.ini /[path]/[file].php
Code de retour    : 0
[...]

-------------------------==  Début  ==-------------------------

X-Powered-By: PHP/4.4.9
Content-type: text/html

#!/usr/local/bin/php

-------------------------==   Fin   ==-------------------------

Si tout se passe bien, rien de plus. Sinon, vous aurez une trace d’erreur. Un exemple avec un script qui tente une opération interdite sur un fichier gunzip :

-------------------------==  Début  ==-------------------------

X-Powered-By: PHP/4.4.9
Content-type: text/html

#!/usr/local/bin/php
gzip: /[path]/toto.gz already exists;        not overwritten

-------------------------==   Fin   ==-------------------------

Et la sécurité ?

J’ai trouvé quelques didacticiels sur le Planificateur de tâches OVH. Certains sont très détaillés (encore plus qu’ici), mais aucun n’aborde le sujet de la sécurité. Pourtant, la question est vraiment capitale chez OVH. En effet, votre espace web sur le serveur mutualisé a pour objectif de diffuser des contenus publiquement sur le web. C’est sa fonction première ! Donc, si vous placez un script maladroitement sur votre serveur, d’autres pourront jouer avec.

Un exemple que j’ai vu : un dossier mysql à la racine d’un site, contenant un script backup.php qui génère un fichier dump.sql au même endroit. Autant dire qu’il y a 99% de chances qu’un hacker du dimanche récupère vos données confidentielles dans l’année ! Remarquez que ce type de didacticiels n’est pas forcément innocent… Si 2000 personnes suivent l’exemple à la lettre, c’est d’autant plus facile pour des gens mal intentionnés. Lisez les didacticiels avec un peu de recul !

Parmi les règles de protection efficaces :

  • placer votre script dans un dossier racine qui n’est pas couplé à un sous-domaine (donc inaccessible par le web)
  • si votre fichier appartient à un dossier accessible sur le web, ajouter un fichier .htaccess pour interdire sa lecture et son exécution (directive Deny from all, par exemple)

Sauvons MySQL !

Save MySQL

En janvier 2008, le rachat de MySQL AB par Sun fut un événement majeur et plutôt bien accueilli. Mais l’ambience était tout autre après le rachat de Sun par Oracle. J’émettais de fortes réserves sur la survie de MySQL dans le giron de l’ambitieuse société californienne.

Les craintes se sont confirmées et une grande bataille se joue en ce moment pour sauver MySQL. Michael « Monty » Widenius, le créateur de MySQL, a lui-même tiré la sonnette d’alarme en décembre et a anticipé les problèmes que vont rencontrer les utilisateurs de MYSQL.

Sans réponses claires et pérennes d’Oracle, la communauté s’organise et une pétition a été lancée pour convaincre les pouvoirs publics et les autorités de régulation des marchés d’étudier le cas de la fusion Oracle-Sun-MySQL. Libre à vous de décider de l’avenir de MySQL, mais le danger est, à mon avis, bien réel. J’attends d’être convaincu du contraire…

Pour en savoir plus : Save MySQL !

Barcamp PHP toulousain : la synthèse

Bacrcamp PHP Toulouse

Jeudi dernier se tenait le Barcamp PHP Cheese & Wine. Même si le vin et le fromage ont été très appréciés, nous n’étions pas venus (seulement) pour ça. Alors pour les absents qui ont eu tort de l’être, voici une petite synthèse de cette longue soirée.

Un vrai barcamp

Premier bon point : c’est un vrai barcamp où les participants se présentent et définissent le contenu des ateliers. Tous les barcamps ne respectent pas cette règle de base… Xavier Gorse, président de l’AFUP, a donc joué le rôle de « maître de cérémonie » pour établir le programme d’après les souhaits de chacun  :

  • PHP et sécurité
  • PHP 5.3
  • Déploiement d’applications PHP
  • PHP et les bases de données « NoSQL »
  • Outillage PHP
  • PHP et testing
  • Frameworks PHP

Pour ma part, j’ai participé aux ateliers :

  • Déploiement d’applications PHP
  • PHP et les bases de données « NoSQL »
  • PHP et testing

Je limite donc mon article à ces sujets, sachant que d’autres synthèses ont déjà été publiées :

Déploiement d’applications PHP

Cet atelier a mis en évidence la difficulté de déployer des applications web en général (technologies nombreuses et environnement hétérogène). Tous les outils existants ont été passés en revue, du paquet Linux (.deb) aux outils spécifiques à PHP (PEAR, Phing, Phar) en passant par des intermédiaires parfois plus adaptés (makefile, Puppet, Capistrano, Ant). Deux groupes de participants étaient clairement représentés, avec des besoins très différents :

  • Déploiement d’une solution sur un parc important et hétérogène (cas des éditeurs de solutions, comme Linagora avec OBM)
  • Déploiement d’un projet sur-mesure sur un ou quelques serveurs, mais très fréquemment et avec des contraintes d’intégration de contenus externes (cas des agences web, avec plusieurs déploiements par jour).

Dans le premier cas, la difficulté est d’identifier la configuration des serveurs cibles et de préparer les paquets d’installation correspondants (.deb pour chaque distribution Linux, .msi pour chaque version de Windows, etc.), tout en assurant la compatibilité des données sans toujours les connaître (tests de régression).

Dans le second cas, il faut savoir intégrer pendant le déploiement les données du site en exploitation (base de données, templates gérés par un web designer externe, etc.), avec d’éventuelles transformations (ETL, Extract Transform Load).

J’ai ajouté qu’un déploiement ne se limite pas à la livraison de la partie applicative mais doit aussi savoir traiter la mise à jour des outils liés au projet (plate-forme de gestion de tickets, extranet, feuille de route, tests, sauvegardes, alertes, etc.).

En dehors de PEAR, trés utilisé et qui est un outil de déploiement à l’origine, j’ai une préférence pour Ant + Phing et Capistrano.

Bases de données « NoSQL »

Là, on entre dans une autre dimension. Les bases « NoSQL » sont des bases de données non relationnelles. En gros, on ne retrouve pas le schéma habituel « tables contenant des champs et étant reliées entre elles ». L’avantage est d’obtenir des performances exceptionnelles sur des entrepôts de données énormes. Parmi les acteurs majeurs qui développent et utilisent des bases « NoSQL », on peut citer : Google (projet Big Table qui a inspiré le projet Cassandra), Facebook ou Linkedin.

Si on revient à la dure réalité d’un acteur de dimension modeste, on constate que ces technologies émergentes et prometteuses sont encore très spécifiques. Les bases relationnelles ont de beaux jours devant elles. La difficulté est notamment de réintégrer dans l’application PHP ce qui fait la force des systèmes SQL : sélection, jointures, intégrité référentielle, etc. Le volet testing des projets en prend un coup…

PHP et testing

Atelier en petit comité (6 personnes), en concurrence déloyale avec l’atelier Frameworks qui a fait le plein ! Nous avons tenté de lister les types de tests liés à une application web, en dépassant autant que possible la simple vue du développeur :

  • Tests unitaires (PHP et Javascript)
  • Tests fonctionnels
  • Tests d’IHM (via Selenium Core, Selenium RC et Selenium IDE)
  • Tests de recette
  • Tests de non régression
  • Tests de performance
  • Tests de charge
  • Tests de conformité (normes, W3C, accessibilité, etc.)
  • Tests ergonomiques (tri par cartes, paper prototyping, tests utilisateurs, etc.)
  • A/B testing

Les échanges sur nos expériences ont été très instructifs. Nous étions tous d’accord pour insister sur la définition précise des cas d’utilisation qui facilite la gestion des tests pendant toute la durée du projet avec le client. D’où une phase de spécifications sérieuse qui conditionne la qualité du travail livré. Certains tests peuvent faire l’objet de validation contractuelle, comme les wireframes issus de tests ergonomiques qui servent ensuite de feuille de route aux intégrateurs et développeurs.

La difficulté avec les tests, c’est de savoir placer le curseur pour ne pas s’y noyer. Il n’est pas réaliste d’appliquer les tests de façon exhaustive. C’est un idéal en contradiction avec les budgets et les délais imposés en pratique. Il faut donc savoir réaliser les bons tests, au bon endroit et au bon moment. Par exemple, sur le calcul des prix d’un panier de site e-commerce, sur l’intégration des données lors d’un couplage entre deux systèmes, sur l’ergonomie d’une interface riche, etc.

En résumé

Une excellente soirée qui a largement dépassée les 5 heures prévues ! L’accueil de Linagora et de l’AFUP était parfait, l’ambiance très sympathique et le niveau des échanges très pointu. Il y a des gens qui savent faire des choses avec PHP en Midi-Pyrénées ! Je pense qu’on remettra ça sous peu. Prochaine étape : le Bargento, lundi 9 novembre à Paris. Je serai présent avec l’équipe de l’AFUP pour organiser et animer cette journée qui s’annonce exceptionnelle. Et à la suite, le Forum PHP 2009, tout aussi exceptionnel. Sur ce coup-là, je déclare forfait. Il faut bien travailler un peu !

Oracle acquiert Sun

Oracle acquiert Sun

Le rachat de MySQL par Sun était déjà un événement pour moi l’an dernier. Alors je ne sais plus quels mots utiliser après le rachat de Sun par Oracle aujourd’hui…

Sachant comment finissent les entreprises qui passent entre les mains d’Oracle, il reste une sacrée incertitude sur certains projets (Java et MySQL pour commencer).

Panique sur les DNS !

Hier, c’était la panique chez tous les hébergeurs : une faille majeure a été découverte dans bind, l’application la plus utilisée dans le monde pour gérer les serveurs de noms de domaine. Une faille tellement critique qu’elle permet de prendre le contrôle des domaines et donc d’en rediriger le trafic vers des serveurs pas très honnêtes !

Même s’ils sont ultra-surveillés et protégés, les 13 serveurs racines qui gèrent tous les noms de domaine d’internet, étaient également potentiellement concernés.

Au fait, à quoi sert un serveur de noms de domaine ? Tout simplement à faire le lien entre un nom de domaine et une adresse IP (et inversement). Chaque machine branchée sur internet possède une adresse IP qui permet de la rendre unique sur le réseau mondial. Cependant, utiliser une adresse IP ne suffit pas. D’abord, elle n’est pas facile à retenir. Et puis, comment feraient les utilisateurs de Google qui exploitent 450.000 serveurs ? Il est plus simple de taper www.google.com dans son navigateur que 64.233.167.99. Même si ça marche, évidemment (si, si, essayez !).

Le serveur de noms de domaine est donc un maillon indispensable d’internet. Quand il s’arrête, vos services internet aussi…

Bref, hier, tout le monde était sur le pont… et moi avec ! Si vous gérez un serveur DNS, n’attendez plus, mettez à jour votre installation, c’est vital ! Le correctif est publié et disponible pour pratiquement tous les systèmes.

La documentation de Magento 1.0 est en ligne

Depuis le lancement de la version 1.0 de Magento, tous ses utilisateurs attendaient (impatiemment !) sa documentation. Elle est désormais disponible sur le wiki officiel.

C’est long, précis et bien écrit. Amplement suffisant pour comprendre le fonctionnement et les atouts extraordinaires de cette plate-forme e-commerce.

Bonne lecture !

Installer Drupal 6 sur un serveur mutualisé OVH

Drupal + OVH

ATTENTION ! Cette astuce n’est plus valable sur les hébergements OVH à partir de septembre 2015. La surcharge de configuration PHP par fichier .htaccess n’est plus autorisée. Le fichier .ovhconfig le remplace dès maintenant. Pour plus d’information, voir la page FAQ – Migration sur les dernières versions de PHP du site OVH.

Les contraintes des serveurs mutualisés sont souvent agaçantes, mais rarement insurmontables. C’est le cas chez OVH quand on veut installer Drupal 6.

Drupal ne s’installe pas si register_globals est activé, ce qui est le cas par défaut chez OVH (ce serait trop simple…). Mais il est permis de modifier le comportement du serveur, grâce à quelques directives qu’il faut ajouter au début du fichier .htaccess inclus dans le package Drupal :

SetEnv PHP_VER 5
SetEnv REGISTER_GLOBALS 0
SetEnv ZEND_OPTIMIZER 1

En gros, je passe en PHP5, je désactive register_globals et j’en profite pour obtenir les avantages de Zend Optimizer.

Il faut également décommenter la ligne RewriteBase / dans le même fichier pour que la réécriture des adresses par Apache fonctionne correctement :

# If your site is running in a VirtualDocumentRoot at http://example.com/,
# uncomment the following line:
RewriteBase /

# Rewrite URLs of the form 'index.php?q=x'.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

Et là, miracle, Drupal s’installe. Enfin, pas pour tout le monde : sur les anciens hébergements, MySQL est encore en version 4.0, incompatible avec Drupal. Pour s’en sortir, il faut migrer votre base de données vers un autre serveur SQL OVH.

Attention, l’opération est très critique… et n’a pas fonctionné pour moi ! En fait, elle consiste à détruire la base pour la reconstruire à partir de vos sauvegardes. Donc premier point : vérifier que vos sauvegardes sont intègres. Ensuite, il faut suivre la procédure OVH.

Sauf que lorsque j’ai voulu reconstruire la base via le manager OVH, elle n’apparaissait plus dans la liste ! Résultat : plus de base de données ! C’est pratique…

Bug Labs crée les « user generated devices »

BUG 2
BUG de Bugs Labs.

Après l’ère du contenu généré par l’utilisateur (user generated content) et alors que nous commençons tout juste à avoir les outils pour créer facilement nos applications (user generated applications), Bug Labs commercialise des briques matérielles bien réelles pour créer ses propres appareils électroniques. Les user generated devices sont nés.

La gamme BUG se compose de BUGbase, la brique de base sur laquelle viennent se greffer les BUGmodules, tels qu’un capteur GPS, une caméra vidéo, un écran tactile, un capteur de mouvement, des touches, etc.

BUGbase
La BUGbase…
BUGmodules
… et ses BUGmodules.

Même si Lego le fait depuis longtemps, n’allez pas croire que BUG est un simple jouet ! Vous avez un potentiel créatif sans limite, servi par une excellente utilisation de la programmation orientée objet, l’objet ayant dans ce cas une réalité matérielle peu fréquente. Pour développer les fonctions de son appareil, le « créateur-concepteur-utilisateur » dispose d’un environnement de développement (BUG SDK, fonctionnant sous Eclipse) qui repose sur des technologies éprouvées (Java + framework OSGi).

BUG SDK
Le BUG SDK en action.

C’est donc tout naturellement que Bug Labs vient de remporter un CES award 2008.

Cryptage MD5 réversible ? Indirectement, oui !

Le cryptage de mots de passe par MD5 est sans doute la mesure de sécurité la plus utilisée par les développeurs. Son intérêt : crypter une chaîne de caractères, sans avoir la possibilité mathématique de faire l’opération inverse. Enfin presque…

Depuis 2004, on sait que MD5 n’est plus très sûr. Cependant, casser cet algorithme n’est pas à la portée de tout le monde. Aucun risque pour vos bases de données utilisateurs ? C’est sans compter sur les bases de hash MD5. Leur but : stocker des chaînes de caractères et leur hash. Comme les utilisateurs entrent souvent des mots communs ou connus, il est très simple d’interroger ces bases pour obtenir la liste des chaînes de caractères compatibles avec un hash MD5. GData en est un exemple particulièrement efficace et complet.

Vous voulez connaître le mot de passe caché derrière le hash MD5 fe01ce2a7fbac8fafaed7c982a04e229 ? Le voici en 1/10e de seconde : demo. Et celui-ci, assez fréquent dans les bases mal paramétrées : 21232f297a57a5a743894a0e4a801fc3. C’est admin !

Il est temps de changer de méthode de cryptage…

Source : Nexen

La barre des 4000 spams a été franchie !

4002. C’est, à cet instant, le nombre de spams que l’extension Askimet a éliminé de mon blog depuis que je l’ai installée (6 mois environ). Je trouve déjà le chiffre très élevé par rapport au trafic visiteurs (3000 visiteurs / mois). Ce qui m’étonne, c’est le taux de croissance de ce fléau, pire que celui mesuré globalement par Askimet, pourtant alarmant. J’ai atteint les 2000 en août et les 3000 il y a 2 semaines. A ce rythme, j’en serai à 10000 avant Noël !

Pas très réjouissant comme cadeau de fin d’année… L’essentiel est qu’Askimet ne croûle pas sous la charge ! Mais, connaissant les critiques récurrentes sur la vulnérabilité de WordPress face aux spams, sauvé comme par miracle par l’extension Askimet… du même éditeur, c’est peut-être là qu’est le défi que souhaite relever quelques spammers.

Qu’ils aillent jouer ailleurs !