Статьи

Как я подделал запланированные дампы базы данных без Cron

Так что я застрял с кучей проблем. Мне нужно было найти способ использовать имеющуюся у меня платформу (Windows XP), скрыть конфиденциальные пароли от пользователей и включить периодические операции cron, такие как резервное копирование базы данных.

Мой любимый серверный комплект XAMPP не поставляется с сервисами cron для Windows. Я посмотрел на UniServer , и, хотя он выглядел довольно круто, ему требовалась дополнительная поддержка для работы на XP, и мне нужно было менять загрузчики ionCube для разных платформ. Хуже того, пока пользователь имел доступ к физическому серверу, он мог легко видеть корневой пароль MySQL, нажимая на вкладку mysql в графическом интерфейсе UniServer (и у меня не было времени узнать, как это отключить).

Я почти использовал WampServer , но потом я вспомнил все головные боли, которые он давал мне в последний раз, когда я использовал его.

Я натолкнулся на программу с открытым исходным кодом под названием MySqlDumper, которую я был счастлив найти, но также не обошелся без проблем. Например, при восстановлении базы данных он мог отображать все данные обо всех базах данных на сервере и предлагал варианты их удаления. Программа должна была быть установлена ​​в различных учреждениях и использовать тот же пароль root.

Я отложил свой ноутбук в сторону и подошел к холодильнику, думая о том, чтобы отказаться от идеи cron во время этого первого релиза моего проекта. Но резервное копирование данных клиентов никогда не может быть проигнорировано. Я открыл холодильник и схватил ближайшую бутылку сока; не обращая внимания на стаканы на полке, я сделал большой глоток сока, который сильно меня задушил. Когда я обернулся, оглядывая скучную комнату и пытаясь уловить дыхание, внезапно возникла мысль, словно молния.

Моей программе требовалось точное имя пользователя и пароль, чтобы представить свои функции пользователю, и есть один предопределенный пользователь, который простаивает большую часть времени и выполняет только две вещи: стирает устаревшие записи базы данных и восстанавливает базу данных при необходимости. Согласно моей процедуре входа в систему, каждый раз, когда пользователь успешно входит в систему, автоматически обновляется дата последнего входа в систему до текущей даты. И это был намек, в котором я отчаянно нуждался.

Решение состояло в том, чтобы отследить дату последнего входа в систему в режиме ожидания пользователя superadmin. Если его последний вход был вчера, то система вызывала mysqldump для резервного копирования базы данных. Итак, я создал следующий код:

<?php
define("MYSQL_DUMP", "C:\xampp\mysql\bin\mysqldump.exe");
define("MYSQL_DUMP_ARGS", "--user=user --password=pass --opt database");
define("MYSQL_DUMP_OUT", "..\system\" . date("l") . ".sql");

$result = $db->query("SELECT last_login FROM users WHERE username = 'superadmin'");
$check = $result->fetchColumn();
$result->closeCursor();

if ($check < strtotime(date("Y-m-d 00:00:00"))) {
    $backup = MYSQL_DUMP . " " . MYSQL_DUMP_ARGS . " > " .
        MYSQL_DUMP_OUT;
    exec($backup, $out);

    if ($_POST["username"] != "superadmin") {
        $db->query("UPDATE USER SET last_login = NOW() WHERE username = 'superadmin'");
    }
}

Эта горстка строк кода была моим решением. Первая часть процедуры проверяет время последнего входа в учетную запись superadmin. Если последний вход в систему произошел сегодня, то вторая часть будет проигнорирована. В противном случае выполняется резервное копирование, а время последнего входа в систему для учетной записи superadmin обновляется до сегодняшнего дня.

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

Удивительно, как иногда самые сложные проблемы имеют простое и элегантное решение. Когда я работаю в стеке, я делаю одну вещь — бегаю по всем процессам программы в поисках удобной ловушки или лазейки. Это конкретное решение может быть не для всех, но оно работает достаточно хорошо для моей проблемы и позволило мне использовать существующую платформу, которая была мне доступна, и при этом скрывать конфиденциальные пароли от обычных пользователей. Спасибо, что позволили мне поделиться, и, если что-то, я надеюсь, это вдохновит вас на поиск креативных решений в ваших собственных ежедневных задачах программирования.

Изображение через Africa Studio / Shutterstock