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

Дерево руководства
Глава 29 · Справочник и практика
Специальные wrappers PHP: архивы, шаблоны, inline-данные и удалённые файлы
Что означает каждая схема, что она реально поддерживает и где нужен внешний сервис.
ogg://: аудиопоток из необработанных PCM-данных
Этот wrapper существует только при установленном PECL OGG/Vorbis. При записи контекст задаёт pcm_mode, rate, bitrate, channels и comments. Они должны соответствовать реальному формату подаваемых PCM-байтов.
<?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 и требуют явной аутентификации.
<?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, но это не делает недоверенный архив безопасным.
<?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 удобен объектному итератору каталога.
<?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 и не изменения.
<?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://
<?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-функций ограничен.
<?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. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


