Lancer un script PHP en ligne de commande sous Windows

Comme je le disais dans mes deux derniers billets, je travaille actuellement sur des scripts de migration de données. Le problème avec ce genre de scripts qui traitent plusieurs milliers de lignes, c’est que vous êtes vite bloqué par les délais d’exécution lorsque vous les lancez via un navigateur Web.

Vous avez alors deux possibilités :

  • Fractionner le traitement des données en fixant des plages de traitement (traitement par lots)
  • Lancer votre script directement sur le serveur en ligne de commande

Fractionner le traitement est souvent fastidieux, surtout lorsqu’on doit traiter plus de 80 000 lignes.

La solution la plus simple est donc de lancer votre script directement dans une console (Invite de commandes). Pour ce faire, ouvrez une console et rendez vous dans le répertoire contenant le fichier php.exe. Si vous utilisez WampServer, le chemin par défaut est :

C:\wamp\bin\php\php5.5.12>

 

N.B. : la version de PHP varie selon votre version de wamp

Pour lancer votre script, il vous suffit d’exécuter la commande suivante :

C:\wamp\bin\php\php5.5.12>php.exe -f c:\chemin\vers\votre\script.php

 

Et le tour est joué ! ^^

Si vous exécutez souvent des commandes PHP en ligne de commandes, vous pouvez également déclarer le chemin de votre php.exe dans vos variables d’environnement du système. Cela vous évitera de devoir vous positionner dans le répertoire de php avant de lancer vos scripts. Pour plus d’informations, n’hésitez pas à consulter la documentation PHP sur php.net : Ligne de commande PHP sous Microsoft Windows

MySQL : Autoriser/Forcer id=0 pour les PRIMARY KEY avec AUTO_INCREMENT

Dans le cadre de la migration des données d’une structure de base à une autre, j’ai été confronté à un petit problème. En effet, dans l’ancienne version de la BDD, certaines tables de paramètres ont un id démarrant à 0 au lieu de 1.

Exemple :

Table « civilite »
Id Valeur
0 Non communiqué
1 Féminin
2 Masculin

 

Or, lorsque je lance la requête :

INSERT INTO `civilite_new` (`civilite_new_id`, `civilite_new_label`) SELECT `civilite_id`, `civilite_label` FROM `civilite`;

 

MySQL me retourne l’erreur suivante :

Error Code: 1062. Duplicate entry '1' for key 'PRIMARY'

 

L’AUTO_INCREMENT prend la première ligne (Id = 0) et force l’Id à 1. Du coup, lors du traitement de la deuxième ligne, MySQL bloque car la valeur de l’Id de cette dernière est également 1. Partant de ce constat, deux solutions sont possibles :

  • ré-incrémenter toutes les tables en décalant les id (on aurait donc 1, 2, 3 à la place de 0, 1, 2) – Attention aux intégrités référentielles
  • forcer la valeur 0 du premier Id – pas très « propre » mais efficace

Dans mon cas, la première solution ne me convient pas car le code de l’application qui alimente cette base de données repose sur le principe de Id = 0 pour « Non communiqué ».

Donc, pour forcer la mise à 0 des premiers Id, il va donc falloir user du mode SQL NO_AUTO_VALUE_ON_ZERO :

SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO';

 

Ajoutez la ligne ci-dessus avant votre INSERT ou UPDATE.

Une fois vos requêtes exécutées, n’oubliez pas de désactiver le mode « NO_AUTO_VALUE_ON_ZERO » :

SET SQL_MODE=@OLD_SQL_MODE;

 

Et le tour est joué ! ^^

MySQL : Désactiver temporairement les contraintes référentielles

Actuellement, je travaille sur un script PHP de migration de données d’une structure de base de données à une autre. L’ancienne structure était composée de table au format MyISAM sans contraintes référentielles (vu que ce format ne gère pas la déclaration de FOREIGN KEY). La nouvelle structure, quant à elle, est composée de table au format InnoDB où les intégrités référentielles sont déclarées.

Le problème avec ces contraintes référentielles, c’est que mon script de migration bloque dès qu’une de ces contraintes n’est pas respectée. Je vous l’accorde, ce n’est pas un problème en soi puisque c’est justement le but lorsqu’on déclare les intégrités référentielles : vérifier la cohérence du contenu de la base de données.

Une fois que le script m’a renvoyé l’erreur, je le corrige et il me faut alors vider la table impactée afin de le relancer et vérifier que le problème est bien résolu. Si je tente un TRUNCATE ou un DELETE FROM sur ma table, MySQL me renvoie alors l’erreur suivante :

Error Code: 1701 Cannot truncate a table referenced in a foreign key constraint (...)

 

Bien. MySQL vérifie donc correctement les contraintes. Cependant, il faut bien que je vide ma table pour relancer mon script. Pour pallier à ce problème, il suffit donc de suspendre le contrôle des contraintes temporairement (le temps de la requête en fait) :

SET FOREIGN_KEY_CHECKS=0;

DELETE FROM bdd.table; -- ou autre(s) requête(s)

SET FOREIGN_KEY_CHECKS=1;

 

Et le tour est joué ! ^^

Komodo Edit : un éditeur PHP puissant et quasi complet

Ce billet, initialement rédigé le 08/04/2014, n’est plus du tout d’actualité car depuis quelques mois j’utilise NetBeans. Cependant, il fait partie d’une suite de billets concernant mes outils de développement. Je le publie donc tout de même pour marquer la chronologie de mes choix.

 

Illustration code source

 

Je suis développeur Web depuis de nombreuses années. J’ai démarré, au début des années 2000, avec un petit éditeur intitulé Weaverslave. Devant l’absence de mise à jour de ce dernier, je suis ensuite passé à Notepad++. Puis, j’ai découvert Linux (ou GNU/Linux pour les puristes). Comme beaucoup, j’ai commencé par me faire la main avec Ubuntu (6.06) puis je suis passé d’une distribution à l’autre (Ubuntu, Frugalware, Debian, etc).

 

Lire la suite…