Pull to refresh

Использование PHP для системного администрирования

Reading time9 min
Views7.1K
Original author: Phil Hajjar

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

Самым главным преимуществом PHP для системного администрирования является его кроссплатформенность. В отличие от таких традиционных инстументов, как bash для Linux или bat-файлы и скрипты Visual Basic для Windows, PHP скрипты легко переносятся из одной операционной системы в другую. Все, что необходимо это совместимость с интерпретатором PHP и установка необходимых модулей.

Читайте также: An Introduction to Bash Scripting.

Как установить PHP на Linux и Windows

Если на веб сервере присутствует PHP как язык веб-сценариев, значит возможности командной строки также присутствует. И этого достаточно, чтобы использовать PHP, как инструмент системного администрирования.

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

Установка PHP на Linux

Не вдаваясь в специфические для дистрибутива особенности управления пакетами, единственный модуль, который необходимо установить напрямую, - это php-cli. "Cli” означает “Command Line Interface” и переводится как "Интерфейс командной строки".

Установка php-cli настроит все необходимые зависимости для PHP, включая сам движок PHP.

Установка PHP на Windows

Как правило, PHP не входит в стандартный набор Windows, даже если установлен IIS. Весь пакет PHP необходимо вручную загрузить и скопировать в отдельный каталог, например в корень системного диска c:\php.

После установки PHP в файле php.ini необходимо включить различные модули, которые будут использоваться.

Основы и примеры программирования на PHP

Рассмотрим следующий код:

<?php

if (isset ($_GET))

        print "There are [" . count($_GET) . "] parameters in _GET.\n";

if (isset ($_POST))

        print "There are [" . count($_POST) . "] parameters in _POST.\n";

if (isset ($argc) && isset ($argv))

{

        for ($x = 0; $x < $argc; $x++)

        {

                print "Parameter [" . $x . "] is [" . $argv[$x] . "]\n";

        }

}

?>

Обратите внимание, строки вывода заканчиваются специальной последовательностью /n, обеспечивающая перевод на новую строку. Данный код выполнят последовательный перебор всех параметров командной строки. Синтаксис запуска скрипта выглядит следующим образом:

$ php test.php param1 param2                                

There are [0] parameters in _GET.

There are [0] parameters in _POST.

Parameter [0] is [test.php]

Parameter [1] is [param1]

Parameter [2] is [param2]

В целом, выполнение скриптов PHP не отличаются от веб сценариев. И в том и другом случае имеются входные параметры. Для HTML это данные, получаемые с помощью методов GET и POST, а для командной строки это переменные $argc и $argv, суть которых это количество аргументов, включая имя самого скрипта, и их значения соответственно.

Следует отметить, что хорошим тоном считается проверять установлено ли значение для переменных $_GET$_POST$argc или $argv и определить перед чтением. В особенности, если один и тот же скрипт будет использоваться как в web среде, так и в командной строке.

Читайте также: How to Manage Linux Users from the Terminal.

Как создать резервную копию баз данных MySQL с помощью PHP

Преимущество от применения PHP в рамках системного администрирования заключается в том, что можно использовать все расширяемые функции, которые предлагает PHP и которые могут быть недоступны в других средах. Например, единственный способ взаимодействия с базой данной MySQL для оболочки bash или батника Windows является использование конвейерные и промежуточные файлы для передачи SQL запросов в командную строку MySQL. Затем результаты должны быть перенаправлены в промежуточный файл и проанализированы скриптом. Это примерно так же, как использовать гаечный ключ в качестве молотка. PHP представляет широкий выбор надежных инструментов для работы с различными базами данных и другими технологиями.

Рассматриваемый ниже сценарий включает резервное копирование всех несистемных баз данных MySQL в файлы дампа SQL, а затем их сжатие. Эти файлы хранятся только в течение 2 недель, и каждый файл удаляется по истечении срока. PHP предоставляет встроенную поддержку для всех этих вещей.

Рассмотрим приведенный ниже код, показывающий, как работать с базами данных MySQL на PHP:

<?PHP

define ("DB_TYPE", "MYSQLI");

define ("DB_HOST", "localhost");

define ("DB_NAME", "mysql");

define ("DB_USER", "nonadmin_readonly");

define ("DB_PASS", "XXXXXX");

// Get the database list.

$commands = array();

$conn = "";

if ($conn = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME))

  {     

    $x = 0;     

    $sql0 = "show databases;";

    $rs0 = $conn->query($sql0);

    while ($row0 = $rs0->fetch_array(MYSQLI_BOTH))

      {                 

        $dbName = trim ($row0[0]);

        // Exclude system dbs.  

        if ( ("mysql" != $dbName) && ("information_schema" != $dbName) && 

          ("test" != $dbName ) && ("performance_schema" != $dbName))

          {                             

            //print "Found [" . $dbName . "]\n";

            $dateStr = date ("Y-m-d");          

            //print $dateStr . "\n";            

            $cmd = "/usr/bin/mysqldump --user=" . DB_USER. " --password=" 

              . DB_PASS . " " . $dbName . " > /home/dba/database_backups/" 

              . $dateStr . "_" . $dbName . ".sql";                       

            //print $cmd . "\n";                

            $commands[$x] = $cmd;               

            $x++;                               

            $commands[$x] = 

              "/usr/bin/bzip2 --force /home/dba/database_backups/" 

              . $dateStr . "_" . $dbName . ".sql";        

            $x++;                               

          }                             

      }                 

    $conn->close();

  }     

for ($x = 0; $x < count($commands); $x++)

  {

    print $commands[$x] . "\n";

    if (1 == $x % 2)

      print "\n";

    //system ($item);

  }

// DELETION CODE GOES HERE.

?>

Используя сравнительно простые команды PHP, можно генерировать имена файлов с временными метками и производить сжатие полученных файлов. Этот пример выполняется на Linux и предполагается, что домашним каталогом является /home/dba. Однако, данный код можно легко адаптировать к выполнению на Windows, поскольку синтаксис MySQL такой же, а bzip2 заменить на инструмент сжатия подходящий для Windows.

Данный пример кода на PHP генерирует вот такой вывод:

$ php backup_databases_native.php                                

/usr/bin/mysqldump --user=nonadmin_readonly --password=XXXXXX wordpress_db1 > ↩︎ /home/dba/database_backups/2021-10-21_wordpress_db1.sql

/usr/bin/bzip2 --force /home/dba/database_backups/2021-10-21_wordpress_db1.sql

/usr/bin/mysqldump --user=nonadmin_readonly --password=XXXXXX wordpress_db2_blog > ↩︎ /home/dba/database_backups/2021-10-21_wordpress_db2.sql

/usr/bin/bzip2 --force /home/dba/database_backups/2021-10-21_wordpress_db2.sql

 

/usr/bin/mysqldump --user=nonadmin_readonly --password=XXXXXX app_db > ↩︎ /home/dba/database_backups/2021-10-21_app_db.sql

/usr/bin/bzip2 --force /home/dba/database_backups/2021-10-21_app_db.sql

 

/usr/bin/mysqldump --user=nonadmin_readonly --password=XXXXXX udc1_db > ↩︎ /home/dba/database_backups/2021-10-21_udc1_db.sql

/usr/bin/bzip2 --force /home/dba/database_backups/2021-10-21_udc1_db.sql

Примечание: ↩︎ указывает, что команда продолжается в текущей строке, но перенесена удобства отображения.

В целом, рекомендуется использовать полный путь к каждой внешней команде, которая будет выполняться. Причина в том, что если этот код выполняется в crontab Linux или в качестве запланированной задачи Windows, то путь к системному файлу может быть не доступен. Использование полного пути гарантирует отсутствие ошибок “команда не найдена”. Аналогичным образом, использование полного пути к целевому каталогу в самих командах гарантирует, что созданные файлы будут сохранены в нужных каталогах.

В завершении добавляем функционал удаления старых файлов резервных копий, как показано ниже:

<?PHP

 

// .. Previous listing code goes here.

// Delete files older than 2 weeks.

 

$dir = "/home/dba/database_backups";

 

$maxAge = 14 * 86400;

 

if ($dh = opendir ($dir))

  {

    $currentTime = time();

 

    while (($file = readdir($dh)) !== false) 

      {

        if (("." != $file) && (".." != $file))

          {

            $fullPath = $dir . "/" . $file;

            $age = $currentTime - filemtime($fullPath);

            echo "filename: " . $fullPath .  " - Age is [" . $age 

              . "] seconds. Max age is [" . $maxAge . "] seconds.\n";

            if ($age > $maxAge)

              {

                print "MUST DELETE [" . $fullPath . "]\n\n";

                unlink ($fullPath);

              }

            else

                print "Keep it.\n\n";

          }

      }

    closedir ($dh);

  }

?>

Представленный код не является чем то особенным с точки зрения возможностей PHP. Этот листинг является адаптацией давно существующей функциональности PHP.

Один из бонусов команды print в данном коде это то, что если код выполняется в crontab и установлен параметр MAILTO, выходные данные будут отображаться в электронных письмах, сгенерированных crontab.

Читайте также: How to Manage Linux Groups Using Command Line.

Код на PHP, выполняющий резервное копирование базы данных, для системных администраторов

Этот простой пример существующего процесса резервного копирования базы данных и очистки от старых копий, который выполняется с помощью PHP, является верхушкой айсберга того, что PHP может сделать для системного администратора. Дополнительным преимуществом использования PHP является то, что администратору, свободно владеющим PHP, не нужно изучать разные скриптовые языки программирования для конкретных операционных систем. Использование скриптовых языков также осложняет перенос кода между командной строкой и web-среды.

Tags:
Hubs:
Total votes 20: ↑9 and ↓11-2
Comments29

Articles