Pourquoi automatiser les tâches répétitives en PHP ? Ou comment faire travailler l'ordinateur à votre place
\n\nImaginez : chaque matin, vous vous connectez au serveur, lancez une sauvegarde de la base de données, vérifiez les logs d'erreurs, générez le rapport de la veille et l'envoyez à votre patron. Et ensuite, vous recommencez. Ennuyeux ? Très. Et surtout, c'est une perte de temps pour un développeur de faire ce qu'une machine peut accomplir.
\n\nPHP, ce n'est pas que pour les sites web. Ce langage est parfait pour l'automatisation des tâches en PHP : du simple renommage de fichiers au scraping complexe de sites. Dans cet article, je vous présente 10 exemples concrets qui vous feront gagner des heures de travail. Tous les scripts sont fonctionnels et testés — à utiliser sans modération.
\n\nD'ailleurs, si vous cherchez des solutions prêtes à l'emploi pour l'automatisation avec PHP, vous êtes au bon endroit. C'est parti !
\n\n1. Envoi automatique d'email avec pièce jointe (rapport PDF)
\n\nLa demande la plus fréquente en entreprise : « Fais en sorte que les rapports arrivent tout seuls ». Voici un script simple qui envoie un email avec un fichier PDF en pièce jointe.
\n\n<?php\nfunction sendReportWithAttachment($to, $subject, $body, $filePath) {\n $boundary = md5(time());\n \n $headers = "MIME-Version: 1.0\\r\\n";\n $headers .= "From: report@mysite.com\\r\\n";\n $headers .= "Content-Type: multipart/mixed; boundary=\\"{$boundary}\\"\\r\\n";\n \n $message = "--{$boundary}\\r\\n";\n $message .= "Content-Type: text/plain; charset=utf-8\\r\\n\\r\\n";\n $message .= $body . "\\r\\n\\r\\n";\n \n if (file_exists($filePath)) {\n $content = file_get_contents($filePath);\n $content = chunk_split(base64_encode($content));\n $message .= "--{$boundary}\\r\\n";\n $message .= "Content-Type: application/pdf; name=\\"" . basename($filePath) . "\\"\\r\\n";\n $message .= "Content-Disposition: attachment; filename=\\"" . basename($filePath) . "\\"\\r\\n";\n $message .= "Content-Transfer-Encoding: base64\\r\\n\\r\\n";\n $message .= $content . "\\r\\n";\n }\n \n $message .= "--{$boundary}--";\n \n return mail($to, $subject, $message, $headers);\n}\n\n// Utilisation :\nsendReportWithAttachment(\n 'boss@company.com',\n 'Rapport quotidien du ' . date('d/m/Y'),\n 'Veuillez trouver ci-joint le rapport PDF. Détails dans le fichier.',\n '/var/reports/daily_report.pdf'\n);\n?>\n\nComment automatiser : placez ce script dans une tâche cron pour qu'il s'exécute une fois par jour — les rapports seront envoyés automatiquement.
\n\n2. Scraping d'un site web et sauvegarde des données en CSV
\n\nSupposons que vous deviez collecter les prix des concurrents ou une liste d'offres d'emploi. Le scraping en PHP est simple. Utilisons cURL et DOMDocument.
\n\n<?php\nfunction parseSiteToCSV($url, $cssSelector, $outputFile) {\n $ch = curl_init();\n curl_setopt($ch, CURLOPT_URL, $url);\n curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\n curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);\n curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)');\n \n $html = curl_exec($ch);\n curl_close($ch);\n \n if (!$html) {\n return false;\n }\n \n $dom = new DOMDocument();\n @$dom->loadHTML($html);\n $xpath = new DOMXPath($dom);\n \n $items = $xpath->query($cssSelector);\n \n $file = fopen($outputFile, 'w');\n fputcsv($file, ['Texte', 'Lien']);\n \n foreach ($items as $item) {\n $text = trim($item->textContent);\n $link = $item->getAttribute('href') ?: '—';\n fputcsv($file, [$text, $link]);\n }\n \n fclose($file);\n return true;\n}\n\n// Exemple : scrapons les titres d'actualités d'un site\nparseSiteToCSV(\n 'https://news.ycombinator.com/',\n '//tr[@class="athing"]/td[@class="title"]/a',\n 'hacker_news_titles.csv'\n);\n?>\n\nCet exemple d'automatisation des tâches en PHP peut être exécuté toutes les heures — vous obtiendrez des données fraîches sans aucun clic.
\n\n3. Automatisation de la sauvegarde de la base de données
\n\nNe perdez plus jamais vos données. Ce script crée une sauvegarde de votre base de données MySQL et la compresse.
\n\n<?php\nfunction backupDatabase($host, $user, $pass, $dbName, $backupDir) {\n $date = date('Y-m-d_H-i-s');\n $filename = "{$backupDir}/{$dbName}_{$date}.sql.gz";\n \n $command = "mysqldump --host={$host} --user={$user} --password={$pass} {$dbName} | gzip > {$filename}";\n exec($command, $output, $returnCode);\n \n if ($returnCode === 0) {\n echo "Sauvegarde réussie : {$filename}\\n";\n return true;\n } else {\n echo "Erreur lors de la sauvegarde.\\n";\n return false;\n }\n}\n\n// Utilisation :\nbackupDatabase('localhost', 'root', 'motdepasse', 'ma_base', '/var/backups');\n?>\n\nAutomatisation : ajoutez ce script à votre crontab pour une sauvegarde quotidienne automatique.
\n\n4. Redimensionnement automatique d'images
\n\nIdéal pour traiter des lots d'images. Ce script redimensionne toutes les images d'un dossier à une largeur maximale.
\n\n<?php\nfunction resizeImages($sourceDir, $destDir, $maxWidth = 800) {\n if (!is_dir($destDir)) {\n mkdir($destDir, 0755, true);\n }\n \n $images = glob($sourceDir . '/*.{jpg,jpeg,png,gif}', GLOB_BRACE);\n \n foreach ($images as $imagePath) {\n $info = getimagesize($imagePath);\n $width = $info[0];\n $height = $info[1];\n \n if ($width <= $maxWidth) {\n copy($imagePath, $destDir . '/' . basename($imagePath));\n continue;\n }\n \n $ratio = $maxWidth / $width;\n $newHeight = $height * $ratio;\n \n $src = imagecreatefromstring(file_get_contents($imagePath));\n $dst = imagecreatetruecolor($maxWidth, $newHeight);\n imagecopyresampled($dst, $src, 0, 0, 0, 0, $maxWidth, $newHeight, $width, $height);\n \n $ext = strtolower(pathinfo($imagePath, PATHINFO_EXTENSION));\n switch ($ext) {\n case 'jpg':\n case 'jpeg':\n imagejpeg($dst, $destDir . '/' . basename($imagePath), 90);\n break;\n case 'png':\n imagepng($dst, $destDir . '/' . basename($imagePath));\n break;\n case 'gif':\n imagegif($dst, $destDir . '/' . basename($imagePath));\n break;\n }\n \n imagedestroy($src);\n imagedestroy($dst);\n echo "Image traitée : " . basename($imagePath) . "\\n";\n }\n}\n\n// Utilisation :\nresizeImages('/var/www/uploads', '/var/www/uploads/thumbnails', 600);\n?>\n\nCe script d'automatisation PHP est parfait pour les galeries d'images ou les sites e-commerce.
\n\n5. Nettoyage automatique des fichiers temporaires
\n\nLibérez de l'espace disque automatiquement en supprimant les fichiers de plus de 30 jours.
\n\n<?php\nfunction cleanOldFiles($directory, $daysOld = 30) {\n $files = new RecursiveIteratorIterator(\n new RecursiveDirectoryIterator($directory, RecursiveDirectoryIterator::SKIP_DOTS)\n );\n \n $cutoff = time() - ($daysOld * 24 * 60 * 60);\n $deleted = 0;\n \n foreach ($files as $file) {\n if ($file->isFile() && $file->getMTime() < $cutoff) {\n unlink($file->getRealPath());\n $deleted++;\n }\n }\n \n echo "{$deleted} fichier(s) supprimé(s).\\n";\n return $deleted;\n}\n\n// Utilisation :\ncleanOldFiles('/tmp', 7);\n?>\n\n6. Génération automatique de sitemap XML
\n\nPour le référencement, un sitemap à jour est essentiel. Ce script parcourt vos URLs et génère un fichier sitemap.xml.
\n\n<?php\nfunction generateSitemap($baseUrl, $urls, $outputFile = 'sitemap.xml') {\n $dom = new DOMDocument('1.0', 'UTF-8');\n $dom->formatOutput = true;\n \n $urlset = $dom->createElement('urlset');\n $urlset->setAttribute('xmlns', 'http://www.sitemaps.org/schemas/sitemap/0.9');\n $dom->appendChild($urlset);\n \n foreach ($urls as $url) {\n $urlElement = $dom->createElement('url');\n \n $loc = $dom->createElement('loc', $baseUrl . $url['path']);\n $urlElement->appendChild($loc);\n \n if (isset($url['lastmod'])) {\n $lastmod = $dom->createElement('lastmod', $url['lastmod']);\n $urlElement->appendChild($lastmod);\n }\n \n if (isset($url['priority'])) {\n $priority = $dom->createElement('priority', $url['priority']);\n $urlElement->appendChild($priority);\n }\n \n $urlset->appendChild($urlElement);\n }\n \n $dom->save($outputFile);\n echo "Sitemap généré : {$outputFile}\\n";\n}\n\n// Exemple d'utilisation :\n$pages = [\n ['path' => '/', 'lastmod' => '2024-01-15', 'priority' => '1.0'],\n ['path' => '/about', 'lastmod' => '2024-01-10', 'priority' => '0.8'],\n ['path' => '/contact', 'lastmod' => '2024-01-12', 'priority' => '0.6'],\n];\ngenerateSitemap('https://monsite.com', $pages);\n?>\n\n7. Envoi de newsletters en masse
\n\nUn script simple pour envoyer des emails personnalisés à une liste d'abonnés.
\n\n<?php\nfunction sendNewsletter($subscribers, $subject, $htmlBody) {\n foreach ($subscribers as $subscriber) {\n $name = $subscriber['name'];\n $email = $subscriber['email'];\n \n $personalizedBody = str_replace('{name}', $name, $htmlBody);\n \n $headers = "MIME-Version: 1.0\\r\\n";\n $headers .= "Content-Type: text/html; charset=utf-8\\r\\n";\n $headers .= "From: newsletter@monsite.com\\r\\n";\n \n mail($email, $subject, $personalizedBody, $headers);\n echo "Email envoyé à {$name} ({$email})\\n";\n \n // Petite pause pour éviter d'être marqué comme spam\n usleep(500000); // 0.5 seconde\n }\n}\n\n// Exemple :\n$abonnes = [\n ['name' => 'Jean', 'email' => 'jean@example.com'],\n ['name' => 'Marie', 'email' => 'marie@example.com'],\n];\nsendNewsletter($abonnes, 'Notre newsletter mensuelle', 'Bonjour {name} !
Voici nos dernières actualités.
');\n?>\n\n8. Surveillance de disponibilité de site web
\n\nVérifiez automatiquement si vos sites sont en ligne et recevez une alerte par email en cas de problème.
\n\n<?php\nfunction checkWebsite($url, $alertEmail) {\n $ch = curl_init();\n curl_setopt($ch, CURLOPT_URL, $url);\n curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\n curl_setopt($ch, CURLOPT_TIMEOUT, 10);\n curl_setopt($ch, CURLOPT_NOBODY, true);\n \n curl_exec($ch);\n $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);\n curl_close($ch);\n \n if ($httpCode >= 200 && $httpCode < 400) {\n echo "{$url} est en ligne (code {$httpCode})\\n";\n return true;\n } else {\n $subject = "ALERTE : {$url} est hors ligne !";\n $message = "Le site {$url} a retourné le code HTTP {$httpCode}.";\n mail($alertEmail, $subject, $message);\n echo "Alerte envoyée à {$alertEmail}\\n";\n return false;\n }\n}\n\n// Utilisation :\n$sites = ['https://monsite1.com', 'https://monsite2.com'];\nforeach ($sites as $site) {\n checkWebsite($site, 'admin@monsite.com');\n}\n?>\n\n9. Conversion automatique de fichiers CSV en JSON
\n\nUtile pour préparer des données pour une API ou une application JavaScript.
\n\n<?php\nfunction csvToJson($csvFile, $jsonFile) {\n if (!file_exists($csvFile)) {\n echo "Fichier CSV introuvable.\\n";\n return false;\n }\n \n $rows = array_map('str_getcsv', file($csvFile));\n $header = array_shift($rows);\n $data = [];\n \n foreach ($rows as $row) {\n $data[] = array_combine($header, $row);\n }\n \n $json = json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);\n file_put_contents($jsonFile, $json);\n \n echo "Conversion terminée : {$jsonFile}\\n\";\n return true;\n}\n\n// Utilisation :\ncsvToJson('donnees.csv', 'donnees.json');\n?>\n\n10. Renommage automatique de fichiers par lot
\n\nRenommez des centaines de fichiers en une seconde selon un motif personnalisé.
\n\n<?php\nfunction batchRename($directory, $pattern, $replacement) {\n $files = scandir($directory);\n $renamed = 0;\n \n foreach ($files as $file) {\n if ($file === '.' || $file === '..') continue;\n \n $newName = preg_replace($pattern, $replacement, $file);\n \n if ($newName !== $file) {\n $oldPath = $directory . '/' . $file;\n $newPath = $directory . '/' . $newName;\n \n if (rename($oldPath, $newPath)) {\n echo "Renommé : {$file} -> {$newName}\\n\";\n $renamed++;\n }\n }\n }\n \n echo "{$renamed} fichier(s) renommé(s).\\n\";\n}\n\n// Exemple : remplacer les espaces par des tirets\nbatchRename('/var/www/uploads', '/\\s+/', '-');\n?>\n\nConclusion : l'automatisation PHP, votre meilleur allié
\n\nCes 10 exemples ne sont que la partie émergée de l'iceberg. L'automatisation des tâches en PHP peut transformer votre façon de travailler. Que vous soyez développeur, administrateur système ou chef de projet, ces scripts vous feront gagner un temps précieux.
\n\nN'oubliez pas : la clé de l'automatisation réussie, c'est la régularité. Configurez vos tâches cron, testez vos scripts, et laissez PHP travailler pour vous pendant que vous vous concentrez sur l'essentiel.
\n\nVous avez aimé cet article ? Partagez-le avec vos collègues développeurs ! Et si vous avez d'autres idées d'automatisation en PHP, n'hésitez pas à les partager dans les commentaires.