Практическая значимость 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-среды.
Комментарии (29)
unsignedchar
19.11.2021 17:29+3php необходимо администратору как крылья рыбе ;) Иногда это забавно, да. Но сначала bash и powershell.
vovasik
19.11.2021 18:05на счёт всего можно согласиться, но статье какраз привелены достаточные доводы в пользу того что не баг и не совершал, кросплатформеность, хотя конечно так про многие языки можно скачать конечно же, не без этого
Exclipt
19.11.2021 18:21И даже можно поставить powershell на linux тем же apt-get, или вообще wsl в windows
amarao
19.11.2021 17:57$x++;
А что делать, если у меня в базе на 32-битной системе больше 2 миллиардов баз? А, я понял, надо просто обрезать до 2 миллиардов баз. Остальные - лузеры.
Это я к тому, что использовать платформо-зависимый int в скрипте бэкапа без контроля переполнения...
unsignedchar
19.11.2021 18:50Это я к тому, что использовать платформо-зависимый int в скрипте бэкапа без контроля переполнения...
И? php совсем нельзя использовать ни для чего? Или только для backup?
amarao
19.11.2021 20:58Теоретически, php является тьюринг-полным слаботипизированным интерпретируемым языком программирования общего назначения, и на нём можно реализовать любой алгоритм.
Но зачем?
unsignedchar
20.11.2021 00:23Теоретически, на языке %ANYNAME% можно реализовать любой алгоритм. Но зачем? ;)
Можно более подробно про опасности платформо-зависимого int в скрипте бэкапа без контроля переполнения? Что не так? В скрипте необходим контроль переполнения? Или int должен быть платформо-независимым? Хотелось бы обоснования ;)amarao
20.11.2021 14:22Ну, представьте себе, что эта штука натыкается на 2.3 миллиарда чего-то. Файлов, баз данных, whatever.
А у неё int - это 31 бит и знак.
В приличных языках программирования:
1) вам не дадут индексировать чем-либо, что потенциально меньше, чем максимальное индексируемое значение (usize)
2) При итерации по чему-то больше размера оперативной памяти у вас не будет индекса, а будет полноценная итерация.
Вот, баш, он 32-битный на 32-битных машинах. Однако, конструкция while read p не содержит в себе индекса, так что итерировать можно хоть через терабайтный файл.
Т.е. проблема тут уже не в php, в вот этой восхитительной конструкции $x++.
unsignedchar
20.11.2021 14:54+2представьте себе, что эта штука натыкается на 2.3 миллиарда чего-то
Представьте, что у вас канцелярский нож, а вы наткнулись на вражеский танк. Каждому инструменту - своя область применения.
В приличных языках программирования
Известные мне операционные системы написаны на языках, где эта конструкция широко используется, только без знака $ ;)
amarao
20.11.2021 15:25Правильно. И что мы напишем в статье "использование канцелярского ножа в противотанковых операциях"?
unsignedchar
20.11.2021 15:58+1Вы в офисе в бизнес-центре на 12 этаже. Откуда там танк? ;) Откуда вдруг MAXINT баз данных?
amarao
20.11.2021 15:59Чтобы получить maxint базу данных достаточно включить на сутки скрипт их создания. Средний компьютер сейчас делает порядка двух миллиардов операций в секунду, а особо выдающиеся - 4 миллиарда на каждое ядро.
unsignedchar
20.11.2021 16:41+1На 32 разрядной системе не получится. Там такой же длины int. И, скорее всего, файловая система ляже ещё раньше. А ещё раньше ляжет первый попавшийся алгоритм со сложностью хуже чем О(0), который должен это обрабатывать.
amarao
21.11.2021 12:50Вы только что придумали, что на 32-битной ОС у файловой системе не может быть файлов больше 2Гб, и самих файлов не может быть больше 4 миллиардов?
Бедная, бедная zfs. Да и любая другая уважающая себя фс, начиная с ntfs и заканчивая ext4.
unsignedchar
21.11.2021 15:01+1Файлов может быть неважно сколько. Что вменяемого вы хотите с ними делать, раз вам мешает только разрядность счетчика? Задолго до переполнения счётчика помрёт либо алгоритм сортировки (она может неявно где угодно использоваться), либо не хватит памяти.
amarao
21.11.2021 15:43Бэкапить? А что такого ужасного в 2 миллиардах файлов, например? Ну да, удалять долго. Но все остальные утилиты прекрасно работают в pipe-режиме с таким.
Exclipt
19.11.2021 18:00+1Кесарю кесарево, пхпшье пхп, и вы это хорошо показали своим скриптом копирования БД, который:
1) не кроссплатформенный (или надо вводить аргументы для пути к mysqldump)
2) заменяется целиком на одну строку mysqldump --all-databases
3) даже если вы все-таки хотите каждую базу в свой файлик - пишется в 3 (три прописью) строки что в батнике, что на bash
0x131315
19.11.2021 18:20+1Мне казалось python сейчас гораздо больше распространен как язык для всяких служебных микроскриптов, требующих чего-то большего чем баш.
Почти на каждой линукс-системе стоит питон, просто по зависимостям - чуть ли не треть всякого софта на питоне работает.
У php хорошо только то, то он интегрирован с http и БД. Но все это и на питоне не сложно подтягивается.
iRedds
20.11.2021 09:00Был наСтаковерфлочен на питоне скрипт распознавания изображений. Под виндой работал на ура. При переносе на линукс успешно падал с ошибками, хотя и сам питон и библиотеки были тех же версий.
А еще скриптами на питоне весело делиться на площадках, где режется табуляция в сообщениях.unsignedchar
20.11.2021 10:20+1При переносе на линукс успешно падал с ошибками
Кросплатформенность :) А вы уверены, что дело не в скрипте из SO, а именно в питоне?
А еще скриптами на питоне весело делиться на площадках, где режется табуляция в сообщениях.
Эта фича прямо создана, чтобы помешать студентам тупо тырить куски кода из интернетов :)
psycho-coder
20.11.2021 16:40Максимум где можно использовать пыху для админства — это шебанг. Остальное грабли, костыли и велосипеды из уже имеющихся инструментов.
m0nt0
20.11.2021 17:00Очень интересная тема затронута, но на самом деле не важно какой язык использовать, но один огромный плюс в PHP тут все таки затронут, это его кроссплатформенность. Но польза использования языка очень мало затронута, на PHP например можно затронуть огромную тему управления виндой через интерфейс WMI, и сделать свой продукт по управлению всеми виндовыми компами)
Volzhanin94 Автор
20.11.2021 17:15Да, полезность PHP здесь показана поверхностно, на простом примере. И в статье это указано. Надеюсь в будущих материалах у меня получится затронуть более серьезный функционал.
Bigata
Надо очень любить php для администрирования сервера. Всё таки лучше php оставить web бек, а то получиться как с js, который уже не знают куда запихать. Автору спасибо, затронул интересную тему.
P.S. Сам часто использую php в качестве скрипта для крона ????