rss_agent_hub/app.php

117 lines
4.0 KiB
PHP
Executable File

#!/usr/bin/env php
<?php
// Загрузка автозагрузчика Composer (если есть)
if (file_exists(__DIR__ . '/vendor/autoload.php')) {
require_once __DIR__ . '/vendor/autoload.php';
} else {
// Простая реализация автозагрузки для нашего случая
spl_autoload_register(function ($class) {
$prefix = 'App\\';
$len = strlen($prefix);
if (strncmp($prefix, $class, $len) !== 0) {
return;
}
$relativeClass = substr($class, $len);
$file = __DIR__ . '/src/' . str_replace('\\', '/', $relativeClass) . '.php';
if (file_exists($file)) {
require $file;
}
});
}
use App\MigrationRunner;
// Загрузка переменных окружения
if (file_exists(__DIR__ . '/.env')) {
$lines = file(__DIR__ . '/.env', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach ($lines as $line) {
if (strpos($line, '=') !== false && strpos($line, '#') !== 0) {
list($key, $value) = explode('=', $line, 2);
$key = trim($key);
$value = trim($value);
if (!isset($_ENV[$key])) {
$_ENV[$key] = $value;
}
}
}
}
// Загрузка конфигурации БД
$config = require_once __DIR__ . '/config/database.php';
try {
$dsn = "mysql:host={$config['host']};dbname={$config['database']};charset=utf8mb4";
$pdo = new PDO($dsn, $config['username'], $config['password'], [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
]);
} catch (PDOException $e) {
die("Ошибка подключения к БД: " . $e->getMessage() . "\n");
}
$migrationRunner = new MigrationRunner($pdo);
// Обработка аргументов командной строки
$command = $argv[1] ?? null;
switch ($command) {
case 'migrate':
echo "Запуск миграций...\n";
$migrationRunner->migrate();
echo "Миграции завершены!\n";
break;
case 'rollback':
echo "Откат последней миграции...\n";
$migrationRunner->rollback();
echo "Откат завершен!\n";
break;
case 'status':
echo "Проверка статуса миграций...\n";
$stmt = $pdo->query("SELECT migration_name, applied_at FROM migrations ORDER BY applied_at ASC");
$appliedMigrations = $stmt->fetchAll();
if (empty($appliedMigrations)) {
echo "Нет примененных миграций.\n";
} else {
echo "Примененные миграции:\n";
foreach ($appliedMigrations as $migration) {
echo "- {$migration['migration_name']} ({$migration['applied_at']})\n";
}
}
// Показать непримененные миграции
$migrationFiles = glob(__DIR__ . '/migrations/*.php');
natsort($migrationFiles);
$appliedNames = array_column($appliedMigrations, 'migration_name');
$unapplied = [];
foreach ($migrationFiles as $file) {
$name = basename($file, '.php');
if (!in_array($name, $appliedNames)) {
$unapplied[] = $name;
}
}
if (!empty($unapplied)) {
echo "\nНепримененные миграции:\n";
foreach ($unapplied as $migration) {
echo "- $migration\n";
}
}
break;
default:
echo "Использование: php app.php [migrate|rollback|status]\n";
echo " migrate - применить все непримененные миграции\n";
echo " rollback - откатить последнюю миграцию\n";
echo " status - показать статус миграций\n";
exit(1);
}