Блог Евгения Попова :: Программы :: DataLife Engine

Уменьшаем количество PHP файлов для CRON модуля DLE Alloha (и не только) до двух (против 7)

Немного предыстории. Создал сайт, потом нужно идти в настройки крона, прописывать постоянно 6 строк подключения файлов на крон, только для обновления инфы с базы, на наличие, каких материалов нет на сайте. И ещё один — на обновление данных, т. е. чтобы новость обновилась при выходе новой серии, обновлении качества или озвучки. Как бы не удобно добавлять на каждый сайт по 7 заданий на крон, когда их можно уменьшить, и не тратить лишнее драгоценное время на настройку крона на сайте.



Всё что нужно будет сделать — это добавить секретный ключ и домен в файле, там эти строки почти в самом вверху. В общем комментировать код не буду, кто знает — прочитает его, кто не знает — или разберется, или ему это не нужно.

<?php
/**
 * Универсальный скрипт для последовательного запуска PHP-файлов.
 * Режимы:
 *   - CRON:    php cron.alloha.php --log=(yes/no)
 *   - Браузер: https://0byroot.run/cron.alloha.php?log=(debug/yes/no)
 *
 *
 * Для Windows CRON используйте:
 * php C:\OSPanel\domains\0byroot.run\cron.alloha.php --log=yes
 * или
 * "C:\OSPanel\modules\php\PHP_8.1\php.exe" "C:\OSPanel\domains\0byroot.run\cron.alloha.php" --log=yes
 */

/**
Автоматизация через Планировщик задач (аналог CRON)
Чтобы скрипт запускался автоматически:
Откройте Планировщик задач (Task Scheduler - taskschd.msc).
Создайте новую задачу:
Триггер: Например, «Ежедневно в 3:00».
Действие: «Запустить программу».
Программа: C:\OSPanel\modules\php\PHP_8.1\php.exe.
Аргументы: "C:\OSPanel\domains\0byroot.run\cron.alloha.php" --log=yes.
*/

/**
 Помимо парсинга и обновления материалов на сайте, нужно так же на крон поставить задачу
 http://0byroot.run/engine/ajax/controller.php?mod=alloha&secret_key=byrooooooot
 с частотой выполнения на ваш выбор. На локалке я его через BAT запускаю без перерыва, пока не будет ответ "no kp_id", только после этого скрипт останавливается.
 Вы же можете поставить его к примеру на каждую минуту, или каждые 5 минут, или 30+... это время, через какой промежуток времени будет добавлен новый материал на сайт, если он что-то появилось в базе видеохостинга.
 */

// --- Конфигурация --- //
// Абсолютный путь к папке проекта, ключ для крона и домен
define('PROJECT_ROOT', 'C:\OSPanel\domains\0byroot.run');
$s_key = 'byrooooooot'; // "Секретный ключ для крона" из настроек модуля DLE Alloha
$domain_site = 'http://0byroot.run'; //Сюда пишем домен вместе с http:// или https:// без слеша на конце

 // --- Ниже код не трогать, если не знаете для чего он --- //

// Куда писать логи
$logDir = PROJECT_ROOT . '\logs';
$logFile = $logDir . '\cron_master.log';
$maxLogSize = 5 * 1024 * 1024; // 5 MB (ротация)

// Список скриптов для выполнения
$scripts = [
	// --- /Обновляем инфу по новым материалам в базе Alloha --- //
    $domain_site.'/engine/ajax/controller.php?mod=alloha&type=film&secret_key='.$s_key.'',
    $domain_site.'/engine/ajax/controller.php?mod=alloha&type=serial&secret_key='.$s_key.'',
    $domain_site.'/engine/ajax/controller.php?mod=alloha&type=anime&secret_key='.$s_key.'',
    $domain_site.'/engine/ajax/controller.php?mod=alloha&type=animeserial&secret_key='.$s_key.'',
    $domain_site.'/engine/ajax/controller.php?mod=alloha&type=tvshow&secret_key='.$s_key.'',
    $domain_site.'/engine/ajax/controller.php?mod=alloha&type=trailer&secret_key='.$s_key.'',
	// --- /Обновляем на сайте уже добавленные материалы (новая серия/качество/озвучка) --- //
    $domain_site.'/engine/ajax/controller.php?mod=alloha&last&secret_key='.$s_key.'',
];
// --- /Конфигурация --- //

// Определяем режим запуска (CLI или HTTP)
$isCli = (php_sapi_name() === 'cli');

// Парсим параметры логирования
if ($isCli) {
    $options = getopt('', ['log::']);
    $logMode = strtolower($options['log'] ?? 'yes');
} else {
    $logMode = strtolower($_GET['log'] ?? 'yes');
    set_time_limit(0);  // Отключаем таймаут для браузера
    ignore_user_abort(true);  // Работаем даже при закрытии страницы
}

// Создаем папку для логов, если её нет
if (($logMode === 'yes' || $logMode === 'debug') && !file_exists($logDir)) {
    mkdir($logDir, 0777, true);
}

// Ротация логов (если файл слишком большой)
if (($logMode === 'yes' || $logMode === 'debug') && file_exists($logFile) && filesize($logFile) > $maxLogSize) {
    rename($logFile, $logDir . '\cron_master_' . date('Y-m-d_H-i-s') . '.log');
}

// Функция логирования
function logMessage($message, $logFile, $logMode, $isCli) {
    $timestamp = date('Y-m-d H:i:s');
    $logLine = "[$timestamp] $message\n";

    // Запись в файл
    if ($logMode === 'yes' || $logMode === 'debug') {
        file_put_contents($logFile, $logLine, FILE_APPEND);
    }

    // Вывод в консоль или браузер
    if ($logMode === 'debug' || $logMode === 'no' || $isCli) {
        echo $logLine;
        if (!$isCli) ob_flush(); // Для браузера (вывод в реальном времени)
    }
}

// --- Запуск --- //
logMessage("=== Старт выполнения (режим: {$logMode}) ===", $logFile, $logMode, $isCli);

foreach ($scripts as $target) {
    $startTime = microtime(true);
    logMessage("Запуск: {$target}", $logFile, $logMode, $isCli);

    try {
        if (filter_var($target, FILTER_VALIDATE_URL)) {
            // HTTP-запрос для URL
            $ch = curl_init($target);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_TIMEOUT, 30);
            $response = curl_exec($ch);
            $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            curl_close($ch);

            if ($httpCode !== 200) {
                throw new Exception("HTTP-код {$httpCode}");
            }
            $output = $response;
        } else {
            // Локальный скрипт
            if (!file_exists($target)) {
                throw new Exception("Файл не найден");
            }
            $output = shell_exec("php {$target} 2>&1");
        }

        $timeTaken = round(microtime(true) - $startTime, 2);
        logMessage("Успешно: {$target} (Время: {$timeTaken} сек)", $logFile, $logMode, $isCli);

    } catch (Exception $e) {
        logMessage("ОШИБКА: {$target} - " . $e->getMessage(), $logFile, $logMode, $isCli);
    }
}

logMessage("=== Завершение выполнения ===", $logFile, $logMode, $isCli);

Файл можете назвать как я — cron.alloha.php и закинуть в корень сайта, и поставить его на крон. Или, можете его назвать hjkldskgfjyudgjhfa5344.php (чтоб никто не подобрал его) и так же поставить на крон. В файле сначала обновляются добавленные материалы по 6-ти категориям: фильмы, аниме, сериалы, аниме сериалы, тв шоу и трейлеры, и потом идёт файл, который непосредственно обновляет уже существующие на сайте новости.

Все примеры как подключать файл на крон — прописано в комментариях кода.

Ну и на последок… Данный файл можно использовать не только с аллохой. Если у вас например 10 сайтов, и на всех есть крон задания, их все можно объединить в один, и они поочередно будут выполняться данным скриптом, без заморочек прописывая много-много крон заданий на сервере. Всем удачи. Надеюсь кому-то этот пост был полезен🤪🤪🤪

Скачать код выше в файле можно ниже. Так же там представлен ещё один файл cron.alloha.key.php, в который можно добавить ещё один проверочный ключ на запуск скрипта, но нужен ли он вам или нет - решать вам! Думаю первого варианта вполне достаточно, тем более если файлу дать уникальное название, которое никто не сможет подобрать.

[attachment=287:Cron.Alloha.zip]

Перейти на сайт (скачивать файлы можно только на сайте)