PHP, Ligne de commande, MySQL – Utiliser des scripts php en ligne de commande
Utiliser du PHP en ligne de commande peut présenter un intérêt si vous avez besoin d’un langage de scripting plus sophistiqué que le bash shell qui reste forcément assez limité. Vous faites d’un certaine façon d’une pierre deux coups dans la mesure où tous les script PHP que vous développez et votre pratique du PHP sont disponibles plus seulement dans une simple page web via un navigateur. Le recours à PHP permet d’étendre considérablement les possibilités qui vous sont offertes dans des taches ardus si elles étaient à concevoir avec à votre disposition du bash shell uniquement.
Prenons un cas concret qui consiste à effectuer la migration de contenu d’une Base De Données (BDD) de type MySQL d’un site géré grâce à un CMS inconnu vers la BDD d’un site sous WordPress.
Déterminer la localisation et la version de PHP
On va procéder à cette opération en local sous MAMP, qui contient en se connectant à la fois via la console au client MySQL et en exécutant nos scripts PHP dans un autre onglet de la console.
Les commandes ci-dessous permettent de déterminer le shebang
au début du script de sorte que cela indique au système que ce fichier doit être interprété comme du PHP.
Les différentes commandes nécessaires à déterminer la version l’emplacement de php
which php whereis php type -a php php -v |
Voilà donc ce qu’il faudra placer à l’en-tête de votre script
#!/usr/bin/php |
Lancer le script en ligne de commande
Ensuite, il reste à rendre exécutable votre fichier PHP par la commande suivante nom_du_fichier_contenant_votre_script.php
.
chmod +x /le/chemin/vers/votre/fichier/nom_du_fichier_contenant_votre_script.php |
Vous n’aurez plus qu’ensuite à lancer votre script de la manière suivante :
/le/chemin/vers/votre/fichier/nom_du_fichier_contenant_votre_script.php |
Se connecter à une BDD sous MAMP
Vous pouvez vous connecter au client MySQL de MAMP à l’aide de la commande suivante :
/Applications/MAMP/Library/bin/mysql -u root -p
Pour tester votre requête, vous pourrez passer directement votre requête dans la client MySQL, cela est toujours utile avant de la lancer votre script en ligne de commande.
Le contenu PHP du script nom_du_fichier_contenant_votre_script.php
#!/usr/bin/php <?php echo "nnnnnn"; echo "--- LAUNCH ---"; echo "nnnnnn"; $username = "root"; /* Sous MAMP le pwd est root */ $password = "root"; /* C'est le moyen de se connceter en mode à la base de données en mode php Cli */ $hostname = ":/Applications/MAMP/tmp/mysql/mysql.sock"; //connection to the database $dbhandle = mysql_connect($hostname, $username, $password) or die("Unable to connect to MySQL"); // echo "Connected to MySQL"; // echo "nn"; //select a database to work with $selected = mysql_select_db("db_source",$dbhandle) or die("Could not select db_source"); //execute the SQL query and return records $result = mysql_query(" SELECT * FROM posts WHERE user_id = 101 AND status = 'publish' "); // FROM TCMES $post_author = '3'; // The id for coming for the wp_users $db_name = 'db_destination'; $file = '/le/chemin/vers/votre/fichier/dump_sql_vers_wordpress.sql'; while ($row = mysql_fetch_array($result)) { /* VALUES */ $output = ""; $output .= " INSERT INTO ".$db_name.".wp_posts (ID, post_author, post_date, post_date_gmt, post_content, post_title, post_excerpt, post_status, comment_status, ping_status, post_password, post_name, to_ping, pinged, post_modified, post_modified_gmt, post_content_filtered, post_parent, guid, menu_order, post_type, post_mime_type, comment_count) VALUES"; /* ID */ $output .= "('".trim($row{'id'})."', "; /* post_author */ $output .= "'".trim($post_author)."',"; /* post_date */ $output .= "'".trim($row{'created_at'})."',"; /* post_date_gmt */ $output .= "'".trim($row{'created_at'})."',"; /* post_content */ $output .= "'".addslashes(trim($row{'body'}))."',"; /* post_title */ $output .= "'".addslashes(trim($row{'title'}))."',"; /* post_excerpt */ $output .= "'',"; /* post_status */ $output .= "'publish',"; /* comment_status */ $output .= "'open',"; /* ping_status */ $output .= "'open',"; /* post_password */ $output .= "'',"; /* post_name (slug) */ $output .= "'".trim($row{'nicetitle'})."',"; /* to_ping */ $output .= "'',"; /* pinged */ $output .= "'',"; /* post_modified */ $output .= "'".trim($row{'updated_at'})."',"; /* post_modified_gmt */ $output .= "'".trim($row{'updated_at'})."',"; /* post_content_filtered */ $output .= "'',"; /* post_parent */ $output .= "'0',"; /* guid */ $output .= "'',"; /* menu_order */ $output .= "'0',"; /* post_type */ $output .= "'post',"; /* post_mime_type */ $output .= "'',"; /* comment_count */ $output .= "'".trim($row{'total_comments'})."'"; /* END */ $output .= ");"; $output .= "n"; /* INJECT */ $handle = fopen($file, 'a'); fwrite($handle, $output ); fclose($handle); /* // INJECT */ } echo "nnnnnn"; echo "--- DONE ---"; echo "nnnnnn"; ?> |
La structure de la table MySQL “source” inclus dans la BDD
CREATE TABLE `posts` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `created_at` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `updated_at` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `title` VARCHAR(255) NOT NULL DEFAULT '', `nicetitle` VARCHAR(255) NOT NULL DEFAULT '', `body` text NOT NULL, `date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `user_id` INT(11) NOT NULL DEFAULT '0', `status` VARCHAR(11) NOT NULL DEFAULT '0', `last_comment_date` datetime DEFAULT NULL, `total_comments` INT(11) DEFAULT '0', `blocked` tinyint(1) DEFAULT '0', `unique_id` VARCHAR(255) DEFAULT NULL, `imported_feed_id` INT(11) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `unique_id` (`unique_id`), UNIQUE KEY `unique_id_2` (`unique_id`), KEY `nicetitle` (`nicetitle`), KEY `user_id` (`user_id`), KEY `date` (`date`), KEY `status` (`status`), FULLTEXT KEY `searching` (`title`,`body`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; |
En savoir plus
- Getting command line access to PHP and MySQL running MAMP on OSX
http://www.metaltoad.com/blog/getting-command-line-access-php-and-mysql-running-mamp-osx - Running PHP CLI shell scripts
http://blog.johan-mares.be/ict/php/running-php-shell-scripts/ - PHP on the Command Line
http://www.sitepoint.com/php-command-line-1/ - UPDATE Syntax dans MySQL
http://dev.mysql.com/doc/refman/5.0/en/update.html - How to select from an update target in MySQL
http://www.xaprb.com/blog/2006/06/23/how-to-select-from-an-update-target-in-mysql/ - A propos de
COUNT(*)
dans MySQL
http://dev.mysql.com/doc/refman/5.0/fr/counting-rows.html - Programmer ses backups Dotclear grâce à un script bash et CRON
http://www.prendreuncafe.com/blog/post/2006/01/22/382-programmer-ses-backups-dotclear-grace-a-un-script-bash-et-cron - How to connect to MySQL database using PHP
http://www.webcheatsheet.com/PHP/connect_mysql_database.php