Перейти к основному содержимому

Простые приложения на PHP

Разработчику Архитектору

Простые приложения на PHP

PHP (Hypertext Preprocessor) — это язык программирования общего назначения, который изначально создавался для веб-разработки. Однако его возможности выходят далеко за рамки обработки веб-страниц. Язык предоставляет мощный инструментарий для работы с файловой системой, сетевыми протоколами, базами данных и операционной средой. В этом разделе рассматриваются практические примеры создания консольных утилит и простых серверных приложений.


Как запускать примеры из главы

  1. Сохраните код в имя.php (начинается с <?php).
  2. Команда: php имя.php
  3. Проверка: 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 как основа веб-интеграций.

Содержание