PHP: полный мануал с примерами, функциями и ООП
Практический мануал PHP: от переменных и читаемого кода до безопасных форм, интеграций, базы данных и ООП на примере магазина. Учебный маршрут, поиск функций, подробные примеры, разбор ошибок и исходники для скачивания.

Дерево руководства
Глава 28 · Справочник и практика
Контексты потоков PHP: настройка операции без глобального состояния
Zlib, ZIP, callback, Phar, FTP и socket options с честными границами выполнения.
Zlib context: уровень сжатия для потока
Контекст — отдельный ресурс с настройками, который передаётся функции открытия. Схема compress.zlib:// выбирает wrapper, а ключ zlib в контексте выбирает его опции. Это две части одного вызова, но не одно и то же.
<?php
$path = __DIR__ . '/message.gz';
$context = stream_context_create(['zlib' => ['level' => 9]]);
$written = file_put_contents('compress.zlib://' . $path, "Заказ готов\n", 0, $context);
if ($written === false) {
throw new RuntimeException('Не удалось создать gzip');
}
$text = file_get_contents('compress.zlib://' . $path);
echo $text;
unlink($path);
Ожидаемый результат
Заказ готов
Опция zlib.level принимает целое от 0 до 9 и применяется при записи: 0 не сжимает, 9 тратит больше работы ради максимального сжатия. Уровень не меняет распакованный текст. Эта context option доступна с PHP 7.3.
Zip context: пароль конкретного чтения
Задача: прочитать один файл внутри защищённого архива через URL вида zip://archive.zip#entry. Пароль относится к контексту операции и не должен зашиваться в исходник или попадать в URL.
<?php
$context = stream_context_create([
'zip' => ['password' => getenv('ARCHIVE_PASSWORD') ?: ''],
]);
$report = file_get_contents(
'zip://' . __DIR__ . '/private.zip#report.csv',
false,
$context,
);
if ($report === false) {
throw new RuntimeException('Элемент ZIP не прочитан');
}
echo $report;
Контекстный пример требует ext-zip, подготовленный архив и пароль из защищённого окружения. Опция zip.password появилась в PHP 7.2 / PECL zip 1.14.0. Она помогает открыть архив, но слабое ZIP-шифрование не превращается в безопасное хранилище секретов.
Параметры контекста: notification и наблюдение за передачей
Options настраивают конкретный wrapper; parameters описывают сам контекст. Официально stream_context_set_params() поддерживает параметр notification — callback, который получает коды событий и счётчики байтов.
<?php
$events = [];
$context = stream_context_create();
stream_context_set_params($context, [
'notification' => static function (
int $code,
int $severity,
?string $message,
int $messageCode,
int $bytesTransferred,
int $bytesMax,
) use (&$events): void {
$events[] = [$code, $bytesTransferred, $bytesMax];
},
]);
$params = stream_context_get_params($context);
echo is_callable($params['notification']) ? "Callback установлен\n" : "Callback отсутствует\n";
Ожидаемый результат
Callback установлен
В опыте сеть не открывается: мы проверяем регистрацию функции обратного вызова. Поддерживающий wrapper вызывает её во время разрешения адреса, перенаправления, MIME/размера и передачи байтов. Не каждый wrapper сообщает все события.
| Аргумент callback | Смысл |
|---|---|
| notification_code | Тип события STREAM_NOTIFY_* |
| severity | Уровень STREAM_NOTIFY_SEVERITY_* |
| message / message_code | Текст и код, если wrapper их сообщает |
| bytes_transferred / bytes_max | Текущий и ожидаемый объём; максимум может быть 0 |
Phar context: сжатие и метаданные создаваемого архива
Phar объединяет набор файлов в архив, который PHP способен читать через wrapper. Контекст передаёт параметры создания: формат сжатия и metadata. Это не подпись и не проверка доверия.
<?php
$context = stream_context_create([
'phar' => [
'compress' => Phar::GZ,
'metadata' => ['project' => 'catalog', 'version' => 3],
],
]);
$options = stream_context_get_options($context);
echo $options['phar']['metadata']['project'], "\n";
echo $options['phar']['metadata']['version'], "\n";
Ожидаемый результат
catalog
3
compress принимает одну из поддерживаемых Phar-констант сжатия, а metadata — произвольные метаданные архива. Опыт показывает форму настроек и ничего не записывает на диск.
FTP context: перезапись, продолжение и прокси
<?php
$context = stream_context_create([
'ftp' => [
'resume_pos' => 4096,
'proxy' => 'tcp://proxy.internal:8080',
'overwrite' => false,
],
]);
$options = stream_context_get_options($context)['ftp'];
echo $options['resume_pos'], "\n";
echo $options['overwrite'] ? "Перезапись включена\n" : "Перезапись запрещена\n";
Ожидаемый результат
4096
Перезапись запрещена
Опыт не соединяется с FTP и только показывает типы опций. resume_pos задаёт позицию чтения, proxy применяется к чтению через HTTP-прокси, overwrite разрешает перезапись при записи; по умолчанию она запрещена.
К FTP-wrapper также могут применяться нижележащие socket/SSL options. Это не означает, что FTP становится надёжным транспортом: обычный FTP передаёт учётные данные и данные без защиты.
Socket context: адрес, очередь и параметры TCP/UDP
<?php
$context = stream_context_create([
'socket' => [
'bindto' => '0:0',
'tcp_nodelay' => true,
'so_reuseport' => false,
],
]);
$options = stream_context_get_options($context)['socket'];
echo $options['bindto'], "\n";
echo $options['tcp_nodelay'] ? "TCP_NODELAY включён\n" : "TCP_NODELAY выключен\n";
Ожидаемый результат
0:0
TCP_NODELAY включён
bindto выбирает локальный адрес/порт, а tcp_nodelay отключает алгоритм Нейгла для подходящего TCP-соединения. Контекст не открывает socket сам: он лишь передаётся в stream_socket_client/server.
| Опция | Где действует | Назначение |
|---|---|---|
| bindto | клиент/сервер | Локальный IPv4/IPv6 адрес и необязательный порт |
| backlog | сервер | Максимальная очередь ещё не принятых соединений |
| ipv6_v6only | IPv6-сервер | Запретить IPv4-mapped подключения |
| so_reuseport | сервер, если ОС поддерживает | Несколько socket на одном адресе/порту |
| so_broadcast | UDP | Разрешить отправку broadcast |
| tcp_nodelay | TCP | Управлять объединением маленьких пакетов |
tcp_nodelay доступна как context option с PHP 7.1; ipv6_v6only — с PHP 7.0.1. Поддержка опций также зависит от ОС и типа socket.
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


