Простые приложения на PHP
Простые приложения на PHP
PHP (Hypertext Preprocessor) — это язык программирования общего назначения, который изначально создавался для веб-разработки. Однако его возможности выходят далеко за рамки обработки веб-страниц. Язык предоставляет мощный инструментарий для работы с файловой системой, сетевыми протоколами, базами данных и операционной средой. В этом разделе рассматриваются практические примеры создания консольных утилит и простых серверных приложений.
Как запускать примеры из главы
- Сохраните код в
имя.php(начинается с<?php). - Команда:
php имя.php - Проверка:
php -v(PHP 8.1+).
Генератор паролей
Этот пример демонстрирует работу со строками, массивами символов и функциями генерации случайных чисел. Конструкция random_int является криптографически стойкой альтернативой функции rand.
Как запустить
- Файл: см. имя в заголовке раздела, например
password.php - Команда:
php password.php - Результат: вывод в терминале (см.
echoв конце скрипта).
Код программы
Код ITЗагрузка примера кода…
Разбор:
generatePassword(int $length = 16, bool $useDigits = true, bool $useSpecial = true): stringзадаёт строгие типы параметров и возвращаемого значения.- Набор символов собирается по флагам: всегда буквы, а цифры и спецсимволы добавляются условно через
if. strlen($characterSet)вычисляет верхнюю границу индекса для случайного выбора символа.- Цикл
forвыполняется ровно$lengthраз, формируя пароль посимвольно. random_int(...)используется как криптостойкий генератор случайных чисел, предпочтительный для паролей.PHP_EOLвставляет перенос строки, корректный для текущей ОС.
Разбор логики
Программа формирует итоговую строку из доступных символов. Массивы строк объединяются в одну переменную $characterSet в зависимости от выбранных опций. Цикл for выполняет итерации ровно столько раз, сколько указана длина пароля. На каждой итерации вызывается функция random_int, которая возвращает целое число в заданном диапазоне. Индекс полученного числа используется как позиция символа в строке набора. Результат последовательно добавляется к переменной $password.
Сортировщик текстового файла
Пример показывает чтение содержимого файла в память, обработку массива строк и запись результата обратно в файл или вывод в консоль.
Как запустить
- Файл: см. имя в заголовке раздела, например
password.php - Команда:
php password.php - Результат: вывод в терминале (см.
echoв конце скрипта).
Код программы
Код ITЗагрузка примера кода…
Разбор:
if ($argc < 2)проверяет наличие обязательного аргумента и завершает программу черезdie(...), если его нет.$argv[1]получает путь входного файла из командной строки.file(..., FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES)читает файл сразу в массив строк и очищает пустые/лишние переводы строк.sort($lines, SORT_STRING | SORT_FLAG_CASE)сортирует строки как текст, игнорируя регистр.- Тернарный оператор
$argc > 2 ? $argv[2] : nullрешает, писать результат в файл или выводить в консоль. implode(PHP_EOL, $lines)собирает отсортированные строки обратно в текст для сохранения.
Разбор логики
Функция file загружает содержимое файла в массив строк. Флаги FILE_IGNORE_NEW_LINES удаляют символ переноса строки в конце каждой записи, а FILE_SKIP_EMPTY_LINES игнорирует пустые строки. Функция sort упорядочивает элементы массива. Параметр SORT_FLAG_CASE обеспечивает регистронезависимую сортировку. Функция implode объединяет массив обратно в единую строку, разделяя элементы символом переноса строки (PHP_EOL). Функция file_put_contents записывает результат в целевой файл.
Консольный калькулятор
Пример реализует базовую арифметику с обработкой ввода пользователя и проверкой деления на ноль.
Как запустить
- Файл: см. имя в заголовке раздела, например
password.php - Команда:
php password.php - Результат: вывод в терминале (см.
echoв конце скрипта).
Код программы
Код ITЗагрузка примера кода…
Разбор:
fgets(STDIN)считывает пользовательский ввод, аtrim(...)удаляет пробелы и перенос строки.switch ($operation)выбирает нужную арифметическую ветку по символу операции.- Ветви
caseизолированы сbreak, чтобы исключить случайное "проваливание" в следующую ветку. - При делении есть отдельная проверка
$num2 == 0, чтобы не допустить некорректную операцию. - Флаг
$isValidуправляет финальным выводом: результат печатается только если операция корректна. - Интерполяция в строке
{$num1} {$operation} {$num2}формирует понятный итоговый вывод.
Разбор логики
Ввод данных осуществляется через стандартный поток ввода STDIN с помощью функции fgets. Функция trim удаляет пробелы и символы новой строки, оставшиеся после ввода. Переменные $num1 и $num2 приводятся к числовому типу автоматически при выполнении математических операций. Конструкция switch выбирает ветку выполнения кода в зависимости от введенной операции. Проверка делителя на ноль предотвращает возникновение ошибки выполнения.
Трекер задач в JSON
Пример иллюстрирует сериализацию и десериализацию данных, работу с файловой системой и создание структуры данных для хранения информации.
Как запустить
- Файл: см. имя в заголовке раздела, например
password.php - Команда:
php password.php - Результат: вывод в терминале (см.
echoв конце скрипта).
Код программы
Код ITЗагрузка примера кода…
Разбор:
- Скрипт работает как мини-CLI с командами
add,list,clear, читаемыми из$argv. file_existsиfile_get_contentsподнимают существующее состояние задач из JSON-файла.json_decode(..., true)преобразует JSON в ассоциативный массив PHP для удобной обработки.- В
addсоздаётся структура задачи сid,text,created_at, после чего массив сохраняется. saveTasks(...)сериализует данные обратно черезjson_encodeс форматированиемJSON_PRETTY_PRINT.- Флаг
JSON_UNESCAPED_UNICODEсохраняет кириллицу читаемо, без escape-последовательностей.
Разбор логики
Функция json_decode преобразует строку JSON в ассоциативный массив PHP. Параметр true гарантирует получение массива вместо объекта. Функция json_encode выполняет обратное преобразование, превращая массив в строку формата JSON. Флаги JSON_PRETTY_PRINT и JSON_UNESCAPED_UNICODE обеспечивают читаемость файла и корректное отображение кириллицы. Структура задачи включает уникальный идентификатор, текст и временную метку.
Простой HTTP-сервер и клиент
PHP позволяет создавать простые веб-серверы и обрабатывать входящие запросы. Ниже представлен пример минимального сервера и клиента для демонстрации взаимодействия.
Сервер (server.php)
Код ITЗагрузка примера кода…
Разбор:
socket_create(AF_INET, SOCK_STREAM, SOL_TCP)создаёт TCP-сокет IPv4.socket_bindпривязывает сервер к хосту и порту, аsocket_listenпереводит сокет в режим ожидания подключений.- Бесконечный цикл
while (true)постоянно принимает новых клиентов черезsocket_accept. socket_readполучает HTTP-запрос клиента, после чего вручную собирается HTTP-ответ со статусом и заголовками.socket_writeотправляет ответ, затемsocket_close($client)закрывает конкретное клиентское соединение.- Общий серверный сокет закрывается в конце скрипта (логически после завершения цикла).
Клиент (client.php)
Код ITЗагрузка примера кода…
Разбор:
- Клиент создаёт сокет того же типа (
AF_INET/SOCK_STREAM/SOL_TCP), что и сервер. socket_connectустанавливает TCP-соединение с указанным хостом и портом.- HTTP-запрос формируется вручную строкой
GET / HTTP/1.1с заголовкомHost. socket_writeотправляет запрос на сервер,socket_readполучает ответ.- Ответ печатается в консоль, что удобно для отладки протокола "на низком уровне".
- Закрытие через
socket_closeосвобождает сетевой ресурс клиента.
Разбор логики
Функции socket_create, socket_bind, socket_listen создают и настраивают сокет сервера. Функция socket_accept ожидает входящее подключение. Функция socket_read считывает данные от клиента. Функция socket_write отправляет ответ. В клиенте аналогичные функции используются для установления соединения и отправки запроса.
Отправитель HTTP-запросов
Утилита для отправки POST-запросов с данными в формате JSON.
Как запустить
- Файл: см. имя в заголовке раздела, например
password.php - Команда:
php password.php - Результат: вывод в терминале (см.
echoв конце скрипта).
Код программы
Код ITЗагрузка примера кода…
Разбор:
curl_init()инициализирует HTTP-сессию cURL.curl_setopt_arrayзадаёт параметры запроса — URL, метод POST, тело запроса и заголовки.CURLOPT_RETURNTRANSFER => trueвозвращает ответ строкой, вместо прямого вывода на экран.CURLOPT_POSTFIELDSпередаёт JSON как тело запроса.curl_execвыполняет сетевой вызов, аcurl_getinfo(..., CURLINFO_HTTP_CODE)читает HTTP-статус.- Через
curl_errorпроверяется транспортная ошибка, после чего выводится либо ошибка, либо ответ сервера.
Разбор логики
Библиотека cURL используется для сетевого взаимодействия. Функция curl_init инициализирует сеанс. Массив параметров передается в curl_setopt_array. Флаг CURLOPT_POST указывает метод отправки. Параметр CURLOPT_POSTFIELDS содержит тело запроса. Функция curl_exec выполняет запрос. Функция curl_getinfo получает код ответа сервера.
Утилита для сканирования директорий
Пример обхода папок и файлов с получением их атрибутов.
Как запустить
- Файл: см. имя в заголовке раздела, например
password.php - Команда:
php password.php - Результат: вывод в терминале (см.
echoв конце скрипта).
Код программы
Код ITЗагрузка примера кода…
Разбор:
RecursiveDirectoryIteratorполучает доступ к содержимому каталога, аSKIP_DOTSисключает.и...RecursiveIteratorIteratorразворачивает вложенные каталоги в один поток элементов для обхода.- В
foreachкаждый элемент — объект файла/директории с методамиgetSize,isDir,getPerms. getRelativePathname()даёт путь относительно корня сканирования, что делает вывод компактным.sprintf('%o', ...)иsubstr(..., -4)форматируют права доступа в привычном восьмеричном виде.- Итоговая строка выводит тип, путь, размер и права для каждого найденного объекта.
Разбор логики
Класс RecursiveDirectoryIterator создает итератор для доступа к файлам и поддиректориям. Класс RecursiveIteratorIterator управляет рекурсивным обходом. Метод getRelativePathname возвращает путь относительно корня. Метод getSize возвращает размер файла в байтах. Метод getPerms возвращает права доступа в восьмеричной системе счисления.
Скрипт для создания резервного копирования файлов
Автоматическое создание архивов с текущей датой в имени.
Как запустить
- Файл: см. имя в заголовке раздела, например
password.php - Команда:
php password.php - Результат: вывод в терминале (см.
echoв конце скрипта).
Код программы
Код ITЗагрузка примера кода…
Разбор:
- Скрипт берёт исходную директорию и папку бэкапов из аргументов CLI, подставляя значения по умолчанию.
date('Y-m-d_H-i-s')формирует уникальную метку времени для имени архива.ZipArchive::open(..., CREATE | OVERWRITE)создаёт новый ZIP или перезаписывает существующий.- Рекурсивный итератор проходит по всем файлам и папкам исходной директории.
- Для папок вызывается
addEmptyDir, для файлов —addFile($filePath, $relativePath), сохраняя структуру. - После
close()архив фиксируется на диске, аfilesize(...)показывает итоговый размер.
Разбор логики
Класс ZipArchive работает с ZIP-архивами. Метод open открывает или создает архив. Метод addEmptyDir добавляет пустую директорию в архив. Метод addFile добавляет файл с указанием относительного пути внутри архива. Функция filesize определяет размер созданного файла.
Мониторинг дискового пространства
Проверка свободного места на дисках.
Как запустить
- Файл: см. имя в заголовке раздела, например
password.php - Команда:
php password.php - Результат: вывод в терминале (см.
echoв конце скрипта).
Код программы
Код ITЗагрузка примера кода…
Разбор:
disk_free_space('/')иdisk_total_space('/')возвращают свободный и общий объём файловой системы в байтах.- Использованное место считается как разница
total - free, а процент загрузки — через деление иround. - Функция
formatBytesпереводит байты в KB/MB/GB/TB для удобного чтения. log($bytes) / log(1024)вычисляет порядок величины, определяя подходящую единицу измерения.pow(1024, $pow)нормализует число к выбранной единице.- Итог выводится в человекочитаемом виде — общий объём, занято, свободно.
Разбор логики
Функция disk_free_space возвращает количество свободных байт. Функция disk_total_space возвращает общий объем диска. Функция log вычисляет натуральный логарифм для определения порядка величины. Цикл выбора единицы измерения использует массив units.
Парсер URL и проверка доступности ресурса
Анализ структуры URL и проверка HTTP-статуса.
Как запустить
- Файл: см. имя в заголовке раздела, например
password.php - Команда:
php password.php - Результат: вывод в терминале (см.
echoв конце скрипта).
Код программы
Код ITЗагрузка примера кода…
Разбор:
parse_url($url)раскладывает URL на части — схема, хост, порт, путь и query.- Оператор
??подставляет значения по умолчанию, если конкретный компонент отсутствует. - cURL-запрос запускается в "лёгком" режиме
CURLOPT_NOBODY, чтобы получить только заголовки и статус. CURLOPT_TIMEOUT => 5ограничивает время ожидания ответа.curl_getinfo(..., CURLINFO_HTTP_CODE)возвращает числовой HTTP-код, который далее маппится в человекочитаемое сообщение.switchвgetStatusMessageцентрализует логику расшифровки статусов.
Разбор логики
Функция parse_url разбивает строку URL на компоненты. Массив результатов содержит ключи scheme, host, port, path, query. Функция curl_init создает запрос с флагом CURLOPT_NOBODY, чтобы не скачивать тело ответа. Функция curl_getinfo извлекает код ответа.
Конвертер форматов дат
Преобразование дат между различными форматами.
Как запустить
- Файл: см. имя в заголовке раздела, например
password.php - Команда:
php password.php - Результат: вывод в терминале (см.
echoв конце скрипта).
Код программы
Код ITЗагрузка примера кода…
Разбор:
- Скрипт принимает дату и форматы из аргументов командной строки, используя значения по умолчанию при их отсутствии.
strtotime($dateString)пытается интерпретировать входную строку и перевести её в Unix timestamp.- Проверка
=== falseявно отлавливает невалидный ввод. date($outputFormat, $timestamp)форматирует дату в требуемый шаблон.- В выводе показываются и исходное значение, и результат конвертации, что удобно для проверки.
- Форматы вроде
Y,m,d,H,i,sпозволяют гибко задавать представление даты.
Разбор логики
Функция strtotime преобразует строку в Unix-временную метку. Функция date форматирует метку времени согласно заданному шаблону. Шаблоны поддерживают символы Y (год), m (месяц), d (день), H (часы), i (минуты).
Утилита для просмотра запущенных процессов
Отображение списка активных процессов системы.
Как запустить
- Файл: см. имя в заголовке раздела, например
password.php - Команда:
php password.php - Результат: вывод в терминале (см.
echoв конце скрипта).
Код программы
Код ITЗагрузка примера кода…
Разбор:
- Перед запуском скрипт проверяет ОС через
PHP_OS_FAMILY, чтобы не выполнять Linux-команду на неподходящей платформе. shell_exec('ps aux')получает снимок списка процессов из системной команды.explode("\n", ...)делит вывод на строки, аarray_shiftубирает строку-заголовок.preg_split('/\s+/', ...)разбивает каждую строку процесса на колонки.- Из массива колонок извлекаются PID, пользователь, CPU, MEM и команда для печати в табличном виде.
- Такой подход полезен для диагностики, но зависит от формата вывода
psна конкретной системе.
Разбор логики
Функция shell_exec выполняет внешнюю команду ps aux и возвращает её вывод. Функция explode разделяет вывод на строки. Функция preg_split разделяет строку по пробельным символам. Массив $parts содержит колонки процесса. Индексы массива соответствуют порядку вывода команды ps.
Характерный пример для языка PHP
PHP обладает уникальной особенностью — возможностью выполнения кода непосредственно внутри HTML-страниц с использованием тегов <?php ... ?>. Этот подход позволяет динамически формировать контент страницы на основе данных, полученных от пользователя или базы данных.
Пример — Динамическая страница с формой
Код ITЗагрузка примера кода…
Разбор:
- PHP-логика и HTML размещены в одном файле, что является классическим стилем серверного рендеринга в PHP.
$_SERVER['REQUEST_METHOD'] === 'POST'отделяет первичную загрузку страницы от обработки отправленной формы.- Данные из
$_POSTочищаются черезtrim, затем валидируются (пустые поля, корректность email). - Ошибки накапливаются в массиве
$errors, а успешный сценарий формирует сообщение$message. - Альтернативный синтаксис
<?php if (...): ?> ... <?php endif; ?>делает условия удобными внутри HTML-шаблона. htmlspecialchars(...)экранирует вывод и защищает от XSS при показе пользовательских данных.
Разбор логики
Фрагменты кода внутри тегов <?php ... ?> выполняются на сервере до отправки HTML-кода браузеру. Переменная $_SERVER['REQUEST_METHOD'] проверяет тип HTTP-запроса. Массив $_POST содержит данные, переданные пользователем. Функция htmlspecialchars экранирует специальные символы для предотвращения XSS-атак. Логика проверки данных выполняется до формирования HTML-ответа. Условные конструкции if определяют, какие блоки контента будут выведены.
Этот пример демонстрирует интеграцию логики обработки данных с представлением пользовательского интерфейса, что является фундаментальной концепцией разработки на PHP.
Базовый разбор HTTP и HTTPS находится в отдельной статье — HTTP как основа веб-интеграций.