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

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

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

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

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

Специальные wrappers PHP: архивы, шаблоны, inline-данные и удалённые файлы

Что означает каждая схема, что она реально поддерживает и где нужен внешний сервис.

ogg://: аудиопоток из необработанных PCM-данных

Этот wrapper существует только при установленном PECL OGG/Vorbis. При записи контекст задаёт pcm_mode, rate, bitrate, channels и comments. Они должны соответствовать реальному формату подаваемых PCM-байтов.

Открыть Ogg/Vorbis-поток расширением OGGФрагмент или команда
<?php
$context = stream_context_create([
    'ogg' => [
        'rate' => 44100,
        'channels' => 2,
        'comments' => ['TITLE' => 'Учебная запись'],
    ],
]);

$stream = fopen('ogg://' . __DIR__ . '/lesson.ogg', 'wb', false, $context);
if ($stream === false) {
    throw new RuntimeException('OGG wrapper недоступен');
}
// Сюда записываются PCM-данные согласованного формата.
fclose($stream);

Фрагмент требует стороннее PECL-расширение OGG/Vorbis и реальные PCM-данные; обычная PHP-сборка его, как правило, не содержит. Wrapper поддерживает чтение, запись и append, но не файловые операции stat/unlink/rename/mkdir/rmdir.

ssh2.*://: shell, exec, tunnel, SFTP и SCP

PECL ssh2 добавляет схемы ssh2.shell://, ssh2.exec://, ssh2.tunnel://, ssh2.sftp:// и ssh2.scp://. Они не являются частью базовой установки PHP и требуют явной аутентификации.

Прочитать файл через SFTP с живым ресурсом соединенияФрагмент или команда
<?php
$session = ssh2_connect('sftp.example.net', 22);
if ($session === false || !ssh2_auth_pubkey_file(
    $session,
    'deploy',
    getenv('SSH_PUBLIC_KEY'),
    getenv('SSH_PRIVATE_KEY'),
)) {
    throw new RuntimeException('SSH-аутентификация не выполнена');
}

$sftp = ssh2_sftp($session);
$stream = fopen('ssh2.sftp://' . intval($sftp) . '/incoming/report.csv', 'rb');
if ($stream === false) {
    throw new RuntimeException('Удалённый файл не открыт');
}
echo stream_get_contents($stream);
fclose($stream);

Контекстный фрагмент требует PECL ssh2, доступный сервер и ключи. Ресурсы session/sftp должны оставаться живыми, пока открыт поток. Реальный вывод зависит от удалённого файла, поэтому запуск не заявлен.

phar://: путь к элементу PHP Archive

Схема соединяет путь архива и внутренний путь: phar:///path/app.phar/config.json. Она не ограничивается allow_url_fopen или allow_url_include, потому что Phar — локальный wrapper, но это не делает недоверенный архив безопасным.

Прочитать конфигурацию внутри доверенного PharПример для указанного окружения
<?php
$archive = __DIR__ . '/application.phar';
if (!is_file($archive)) {
    throw new RuntimeException('Сначала соберите и проверьте application.phar');
}

$json = file_get_contents('phar://' . $archive . '/config/defaults.json');
if ($json === false) {
    throw new RuntimeException('config/defaults.json отсутствует');
}
echo $json;

Фрагмент требует заранее созданный доверенный archive. phar:// поддерживает чтение, запись, одновременное чтение/запись и файловые операции, но не append. Создание и изменение зависят от phar.readonly и формата архива.

glob://: каталог по шаблону, а не содержимое файла

Wrapper отдаёт directory handle с совпавшими путями. Он не поддерживает обычные операции чтения/записи потока, stat, unlink, rename, mkdir или rmdir. Для массива путей есть отдельная функция glob(); wrapper удобен объектному итератору каталога.

Найти только CSV-файлы и получить стабильный порядокСамостоятельный пример
<?php
$files = [];
foreach (new DirectoryIterator('glob://' . __DIR__ . '/incoming/*.csv') as $entry) {
    if ($entry->isFile()) {
        $files[] = $entry->getFilename();
    }
}
sort($files, SORT_STRING);
echo implode("\n", $files), "\n";
Ожидаемый результат
orders-01.csv
orders-02.csv

glob:// предназначен для обхода каталогов по шаблону через DirectoryIterator. Порядок файловой системы не считается контрактом, поэтому пример явно сортирует имена.

data://: небольшие встроенные данные по RFC 2397

Форма data://media/type;base64,payload хранит данные прямо в URL. Без base64 байты должны быть корректно URL-encoded. Wrapper поддерживает только чтение, не stat и не изменения.

Прочитать маленький встроенный JSON из data://Самостоятельный пример
<?php
$json = '{"shop":"tea","open":true}';
$url = 'data://application/json;base64,' . base64_encode($json);
$decoded = json_decode(file_get_contents($url), true, flags: JSON_THROW_ON_ERROR);

echo $decoded['shop'], "\n";
echo $decoded['open'] ? "Открыт\n" : "Закрыт\n";
Ожидаемый результат
tea
Открыт

Base64 защищает служебные символы URI, но не шифрует данные. Wrapper читает inline payload без отдельного файла. Для большого содержимого обычный файл или поток лучше: data URL дублирует данные в памяти и ухудшает диагностику.

compress.zlib://, compress.bzip2:// и zip://

Сжать локальный текст gzip и прочитать его обратноСамостоятельный пример
<?php
$archive = __DIR__ . '/orders.txt.gz';
$payload = "Заказ 17\nЗаказ 18\n";

if (file_put_contents('compress.zlib://' . $archive, $payload) === false) {
    throw new RuntimeException('Запись gzip не удалась');
}

$restored = file_get_contents('compress.zlib://' . $archive);
echo $restored;
unlink($archive);
Ожидаемый результат
Заказ 17
Заказ 18

compress.zlib:// выполняет сжатие на границе потока: код работает с исходным текстом, а на диске находится gzip. Результаты записи и чтения проверяются строго на false.

WrapperЧтениеЗапись / appendОсобенность
compress.zlib://ДаДа / даzlib; старое неоднозначное zlib: не использовать
compress.bzip2://ДаДа / датребует ext-bz2
zip://archive#entryДаНет / неттребует ext-zip, выбирает entry

Эти wrappers не поддерживают обычные операции stat/unlink/rename/mkdir/rmdir. Для сложного управления архивом используйте соответствующий объектный API. Сжатие не подтверждает целостность или доверие — контрольная сумма и подпись решают другие задачи.

ftp:// и ftps://: удалённый файл как поток

Wrapper поддерживает чтение, запись и append, но не одновременное чтение/запись. Существующий удалённый файл не перезаписывается без context option overwrite. Набор stat-функций ограничен.

Скачать FTP-файл во временный поток и проверить результатПример для указанного окружения
<?php
$context = stream_context_create([
    'ftp' => ['resume_pos' => 0],
]);

$remote = fopen('ftp://user:password@ftp.example.net/export/orders.csv', 'rb', false, $context);
if ($remote === false) {
    throw new RuntimeException('FTP-файл не открыт');
}
$local = fopen('php://temp', 'w+b');
if (stream_copy_to_stream($remote, $local) === false) {
    throw new RuntimeException('Копирование оборвалось');
}
rewind($local);
echo stream_get_contents($local);

Контекстный пример требует отдельный учебный FTP-сервер. Реальный код не помещает пароль в исходник/URL: секрет подставляет конфигурация и он не попадает в журнал. Встроенный FTP-wrapper требует passive mode сервера и allow_url_fopen.

Если передача зависает, различайте DNS/TCP, аутентификацию, passive data connection, права, свободное место и неполную запись. Итог подтверждайте размером/хешем, а не только отсутствием exception.

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

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

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

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

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