Автоматизация задач на PHP: 10 примеров кода для ленивых программистов

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Зачем автоматизировать рутину на PHP? Или как заставить компьютер работать за вас

Представьте: каждое утро вы входите на сервер, запускаете бекап базы данных, проверяете логи ошибок, генерируете отчёт за вчерашний день и отправляете его начальнику. А потом — ещё раз, и ещё. Скучно? Ещё бы. А главное — глупо тратить время программиста на то, что может сделать машина.

PHP — это не только про веб-сайты. Этот язык отлично подходит для автоматизации задач на PHP: от простого переименования файлов до сложного парсинга сайтов. В этой статье я покажу 10 реальных примеров, которые сэкономят вам часы работы. Все скрипты рабочие, проверенные — берите и используйте.

Кстати, если вы ищете готовые решения для автоматизации с помощью PHP — вы попали по адресу. Поехали!

1. Автоматическая отправка email с вложением (PDF-отчёт)

Самый частый запрос от бизнеса: «Сделай, чтобы отчёты приходили сами». Ниже — простой скрипт, который отправляет письмо с PDF-файлом.

<?php
function sendReportWithAttachment($to, $subject, $body, $filePath) {
    $boundary = md5(time());
    
    $headers = "MIME-Version: 1.0\r\n";
    $headers .= "From: report@mysite.com\r\n";
    $headers .= "Content-Type: multipart/mixed; boundary=\"{$boundary}\"\r\n";
    
    $message = "--{$boundary}\r\n";
    $message .= "Content-Type: text/plain; charset=utf-8\r\n\r\n";
    $message .= $body . "\r\n\r\n";
    
    if (file_exists($filePath)) {
        $content = file_get_contents($filePath);
        $content = chunk_split(base64_encode($content));
        $message .= "--{$boundary}\r\n";
        $message .= "Content-Type: application/pdf; name=\"" . basename($filePath) . "\"\r\n";
        $message .= "Content-Disposition: attachment; filename=\"" . basename($filePath) . "\"\r\n";
        $message .= "Content-Transfer-Encoding: base64\r\n\r\n";
        $message .= $content . "\r\n";
    }
    
    $message .= "--{$boundary}--";
    
    return mail($to, $subject, $message, $headers);
}

// Использование:
sendReportWithAttachment(
    'boss@company.com',
    'Ежедневный отчёт за ' . date('d.m.Y'),
    'Во вложении PDF-отчёт. Подробности в файле.',
    '/var/reports/daily_report.pdf'
);
?>

Как автоматизировать: поставьте этот скрипт в cron на выполнение раз в сутки — и отчёты будут улетать сами.

2. Парсинг сайта и сохранение данных в CSV

Допустим, нужно собрать цены конкурентов или список вакансий. Парсинг на PHP — это просто. Используем cURL и DOMDocument.

<?php
function parseSiteToCSV($url, $cssSelector, $outputFile) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)');
    
    $html = curl_exec($ch);
    curl_close($ch);
    
    if (!$html) {
        return false;
    }
    
    $dom = new DOMDocument();
    @$dom->loadHTML($html);
    $xpath = new DOMXPath($dom);
    
    $items = $xpath->query($cssSelector);
    
    $file = fopen($outputFile, 'w');
    fputcsv($file, ['Текст', 'Ссылка']);
    
    foreach ($items as $item) {
        $text = trim($item->textContent);
        $link = $item->getAttribute('href') ?: '—';
        fputcsv($file, [$text, $link]);
    }
    
    fclose($file);
    return true;
}

// Пример: парсим заголовки новостей с сайта
parseSiteToCSV(
    'https://news.ycombinator.com/',
    '//tr[@class="athing"]/td[@class="title"]/a',
    'hacker_news_titles.csv'
);
?>

Этот пример автоматизации задач на PHP можно запускать раз в час — и получать свежие данные без единого клика.

3. Автоматическое создание резервной копии базы данных MySQL

Забыли сделать бекап? С PHP это больше не проблема. Скрипт ниже создаёт дамп базы и отправляет его в архив.

<?php
function backupDatabase($host, $user, $pass, $dbname, $backupDir = '/backups/') {
    $filename = $backupDir . $dbname . '_' . date('Y-m-d_H-i-s') . '.sql.gz';
    
    $command = sprintf(
        'mysqldump --host=%s --user=%s --password=%s %s | gzip > %s',
        escapeshellarg($host),
        escapeshellarg($user),
        escapeshellarg($pass),
        escapeshellarg($dbname),
        escapeshellarg($filename)
    );
    
    $output = null;
    $returnCode = null;
    exec($command, $output, $returnCode);
    
    if ($returnCode === 0) {
        echo "Бекап создан: {$filename}\n";
        
        // Удаляем бекапы старше 7 дней
        $files = glob($backupDir . $dbname . '_*.sql.gz');
        foreach ($files as $file) {
            if (filemtime($file) < strtotime('-7 days')) {
                unlink($file);
                echo "Удалён старый бекап: {$file}\n";
            }
        }
    } else {
        echo "Ошибка создания бекапа!\n";
    }
}

// Использование:
backupDatabase('localhost', 'root', 'password123', 'my_project');
?>

Почему это круто: скрипт сам чистит старые архивы. Поставьте в cron на каждые 6 часов — и спите спокойно.

4. Обработка изображений: водяной знак и ресайз

Если на сайт загружают фото, их нужно обработать. Скрипты автоматизации PHP с GD-библиотекой сделают это влёт.

<?php
function processImage($sourcePath, $destPath, $maxWidth = 800, $watermarkText = '© MySite') {
    $imageInfo = getimagesize($sourcePath);
    $mime = $imageInfo['mime'];
    
    switch ($mime) {
        case 'image/jpeg': $src = imagecreatefromjpeg($sourcePath); break;
        case 'image/png':  $src = imagecreatefrompng($sourcePath); break;
        case 'image/gif':  $src = imagecreatefromgif($sourcePath); break;
        default: return false;
    }
    
    $origW = imagesx($src);
    $origH = imagesy($src);
    
    // Ресайз
    if ($origW > $maxWidth) {
        $newH = round($origH * ($maxWidth / $origW));
        $dst = imagecreatetruecolor($maxWidth, $newH);
        imagecopyresampled($dst, $src, 0, 0, 0, 0, $maxWidth, $new                

Блоги

Рекомендаций по книгам