Перейти к содержимому
Поиск
Php Разработка

PHP: полный мануал с примерами, функциями и ООП

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

Александр НекрасовИзменено:
Практический мануал PHP: от переменных и функций к объектной модели интернет-магазина
PHP 8.5.11468 глав6256 карточек справочника
Дерево руководства

Глава 28 · Справочник и практика

Контексты потоков PHP: настройка операции без глобального состояния

Zlib, ZIP, callback, Phar, FTP и socket options с честными границами выполнения.

Zlib context: уровень сжатия для потока

Контекст — отдельный ресурс с настройками, который передаётся функции открытия. Схема compress.zlib:// выбирает wrapper, а ключ zlib в контексте выбирает его опции. Это две части одного вызова, но не одно и то же.

Записать gzip с выбранным уровнем и прочитать исходный текстСамостоятельный пример
<?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.

Передать пароль при чтении элемента защищённого ZIPПример для указанного окружения
<?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, который получает коды событий и счётчики байтов.

Подключить 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. Это не подпись и не проверка доверия.

Собрать настройки будущего Phar без создания архиваСамостоятельный пример
<?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: перезапись, продолжение и прокси

Подготовить возобновление чтения и HTTP-проксиСамостоятельный пример
<?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

Настроить локальную привязку и TCP_NODELAY без открытия соединенияСамостоятельный пример
<?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_v6onlyIPv6-серверЗапретить IPv4-mapped подключения
so_reuseportсервер, если ОС поддерживаетНесколько socket на одном адресе/порту
so_broadcastUDPРазрешить отправку broadcast
tcp_nodelayTCPУправлять объединением маленьких пакетов

tcp_nodelay доступна как context option с PHP 7.1; ipv6_v6only — с PHP 7.0.1. Поддержка опций также зависит от ОС и типа socket.

Источники и обсуждения

Код и руководство с собой

Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.

Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.

Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.