Créez un script PHP pour trier vos photos

Le but de ce tutoriel est de vous montrer que vous pouvez réaliser des tâches automatiques sur votre ordinateur à l’aide de script PHP. Nous ne parlerons donc pas de développement web mais d’un script qui se lancera comme un logiciel.

Ce script pourra être exécuté simplement par toute la famille pour ranger automatiquement vos photos par évènement (en se basant sur la date de prise du vue)

Fonctionnement attendu par ce script de tri de photos

Installer PHP localement

Avant de commencer, nous avons besoin de PHP sur l’ordinateur. La procédure ci-dessous a été faite sous Windows pour le plus grand nombre mais la suite du tutoriel est réalisable sous Linux ou MacOS.

  • Télécharger la dernière version de PHP (VC15 x64 Non Thread Safe) depuis le site officiel.
  • Extraire les fichiers sur votre ordinateur, par exemple sous C:\bin\php-7.3\.

Préparation de l’environnement

Placez-vous dans le dossier où vous stocker habituellement vos photos et créer un dossier nommé Développement photos.

Dans ce dossier, mettez quelques photos de test, prises à des dates différentes. Elles nous servirons de documents de tests afin de ne pas écraser par erreur vos photos lors de la création de ce script.

Créons un fichier vide nommé script_photo.phpx.

💡 Nous utilisons ici l’extension .phpx pour rendre ce script plus facilement exécutable. Ce nom d’extension est totalement arbitraire et nous permet simplement d’associer ce script à PHP plutôt qu’à votre IDE.

Ce fichier n’est pas reconnu par Windows comme étant une extension valide. Double-cliquez dessus pour le lancer afin que Windows vous propose de l’associer à un programme.

Windows vous propose de choisir un programme pour exécuter les fichier .phpx

Cliquez sur « Plus d’applications » pour continuer

Windows vous suggère une liste de programme ne contenant pas PHP.exe

Cliquez sur « Rechercher une autre application sur ce PC » pour continuer, puis sélectionnez le fichier php.exe que vous avez précédemment installé.

Parcourir votre ordinateur pour cibler le programme php.exe

🎉 Félicitation ! Votre script est reconnu par Windows comme un fichier exécutable par PHP.

Création d’un script de tri de fichiers (photos, vidéos, etc) en PHP

A l’aide de votre IDE préféré, ouvrez le fichier script_photo.phpx (sans double-cliquez dessus 😜). Collez le contenu suivant, ne le détaillerons ensuite

<?php
chdir(__DIR__);
echo 'Organisateur de photos/videos - version 1.0' . PHP_EOL;

$fileList = glob('*.*');

$excludePathList = [
    '.',
    '..',
    basename(__FILE__)
];

foreach ($fileList as $file) {

    if(in_array($file, $excludePathList)) {
        continue;
    }
    
    $modificationDate = gmdate("Y-m-d", filemtime($file));
    
    if(!is_dir($modificationDate)){
        mkdir($modificationDate);
        echo '+ Dossier : '.$modificationDate. PHP_EOL;
    }
    
    rename($file, $modificationDate.'/'.$file);
    echo '+ Fichier : '.$modificationDate.'/'.$file.PHP_EOL;
}

echo PHP_EOL . 'Traitement termine avec succes !' . PHP_EOL;
sleep(2);

Enregistrez ce fichier et lancé le script en double-cliquant dessus. Vous devriez voir le script fonctionner et ranger vos photos dans des dossiers 👍

Fonctionnement attendu par ce script de tri de photos

Comprendre le script PHP

Voici l’explication, ligne par ligne, du fonctionnement de ce script

chdir(__DIR__);

chdir permet de définir le dossier courant de PHP. C’est à partir de ce dossier que sera calculé les chemins relatifs vers d’autres ressources (vers nos photos). En passant la constante magique __DIR__, on s’assure que même si vous exécutez le script est lancé depuis un raccourcis placé sur le bureau, les chemins soient toujours calculés à partir du dossier contenant notre script.

echo 'Organisateur de photos/videos - version 1.0' . PHP_EOL;

echo permet simplement d’afficher le texte. La constante PHP_EOL permet d’envoyer un saut de ligne. L’utilisation de la constante permet de ne pas avoir à utiliser « \r\n » ou « \n » qui diffère suivant le système d’exploitation.

$fileList = glob('*.*');

glob permet de rechercher sur le disque, des chemins de fichier correspondant à un masque de recherche. En indiquant ‘*.*’, on recherche tous les fichiers.

$excludePathList = [
    '.',
    '..',
    basename(__FILE__)
];

Nous définissons une liste de chemins de fichier que nous souhaitons exclure dans la variable $excludePathList. Nous ne prendrons ni le dossier courant ., ni le dossier parent .. , ni le fichier courant (notre script lui même).

foreach ($fileList as $file) {
    /* contenu de la boucle */
}

foreach parcours chaque élément du tableau $fileList et l’affecte à une variable $file (qui contiendra donc un chemin vers un fichier photo)

if(in_array($file, $excludePathList)) {
    continue;
}

La fonction in_array permet de vérifier si le chemin $file se trouve dans le tableau $excludePathList. Si c’est le cas, la mot-clé continue permet de passer à l’itération suivante du foreach sans exécuter la suite.

$modificationDate = gmdate("Y-m-d", filemtime($file));

filemtime permet de récupérer la date de création/modification de la photo. Cette fonction retourne un timestamp (en seconde) que l’on convertie au format Y-m-d à l’aide de gmdate.

if(!is_dir($modificationDate)){
    mkdir($modificationDate);
    echo '+ Dossier : '.$modificationDate. PHP_EOL;
}

is_dir permet de vérifier l’existence d’un dossier. En passant la date du fichier (Ex : 2019-08-15), nous vérifions l’existence d’un dossier du même nom. Si aucun dossier de ce nom existe, mkdir créera celui-ci.

On s’assure ainsi que chaque photo à trier bénéficiera d’un dossier du jour de la création de la photo. Il ne nous reste plus qu’à y déplacer notre photo. 😉

rename($file, $modificationDate . '/' . $file);
echo '+ Fichier : ' . $modificationDate . '/' . $file . PHP_EOL;

rename permet de renommer/déplacer le fichier original $file vers le dossier$modificationDate.

echo PHP_EOL . 'Traitement termine avec succes !' . PHP_EOL;
sleep(2);

Une fois la boucle terminée, nous affichons un message et utilisons la fonction sleep pour mettre en pause le programme avant sa fermeture.

Voilà 👌
J’espère que ce tutoriel vous aura donné quelques idées 😉

Ressources récentes