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

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

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

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

Глава 103 · Практика

Файловая система: полный справочник операций

Пути, чтение и запись, CSV и INI, метаданные, блокировки, ссылки и временные файлы: от первого отчёта до границ ОС и конкурентности.

Сохранить отчёт выдачи и прочитать его позже

Наглядная модель

Отчёт переживает завершение PHP-запроса

В переменной лежит READY. Чтобы следующий запрос получил эти же пять байтов, сервис сохраняет их в собственный файл.

  1. Переменная $text

    READY находится в памяти текущего PHP-процесса.

  2. Запись в report.txt

    file_put_contents возвращает число записанных байтов; false означает отказ.

  3. Файл в хранилище

    Имя связано с данными файловой системы; права и конкурирующие процессы всё ещё имеют значение.

  4. Следующее чтение

    file_get_contents получает READY для другого действия или запроса.

Успешная запись не означает транзакцию нескольких файлов или гарантированную сохранность после аварии. Блокировка, буфер и физическое хранилище — разные уровни.

Мастерская готовит выдачу заказа 104: две дрели и одну пилу. Сотруднику нужен текстовый файл pickup.txt, который останется после завершения PHP. Сначала сохраняем готовую строку; затем покажем чтение по частям, ошибки, размер, копирование и каталог документов.

От списка к файлу
  1. $report: «Заказ 104: дрель — 2, пила — 1»
  2. file_put_contents сохраняет pickup.txt
  3. Файл остаётся после завершения скрипта
  4. file_get_contents читает его для сотрудника

$path — переменная с адресом. __DIR__ означает папку текущего PHP-файла, точка соединяет строки. Вызов получает аргументы в круглых скобках; ; завершает команду. echo показывает полученную строку.

Готовый список выдачи в обычном файлеСамостоятельный пример
<?php
declare(strict_types=1);

$path = __DIR__ . '/pickup.txt';
file_put_contents($path, "Заказ 104: дрель — 2, пила — 1\n");
echo file_get_contents($path);
Ожидаемый результат
Заказ 104: дрель — 2, пила — 1

Запустите в новой учебной папке, затем откройте pickup.txt. Здесь путь заранее доступен для записи; проверку false и предупреждений разбираем ниже. В следующих запусках эта операция заменяет файл.

Файл — не буквальная коробка внутри PHP. Имя, данные, буфер процесса, кэш ОС и физический носитель различаются. Один файл может иметь несколько имён, а проверка существования может устареть сразу после вызова. Пошагово: запись, дополнение, CSV; Поток и позиция.

Путь, CWD, обёртка и пользователь ОС

Путь report.txt относится к текущему рабочему каталогу CWD; папка PHP-файла может быть другой. Для собственных соседних файлов используйте __DIR__ . "/report.txt". На Windows допустимы прямые слеши; обратный слеш в PHP-строке требует внимания к экранированию. Регистр имён/права/ссылки зависят от файловой системы, а не только от строки.

ДействиеЧто на самом деле проверяется
basename, dirname, pathinfoРазбор текста пути без открытия. Не доказательство существования/безопасности.
realpathРазрешение существующего пути с .. и symlink. Не создаёт будущий путь и не убирает гонку.
is_file, is_readableМетаданные/доступ на момент проверки. Последующая операция всё равно может отказать.
fopenРеальная попытка доступа пользователя ОС, который выполняет PHP.

Схема https://, file://, php:// выбирает обёртку потока. У неё свои возможности seek/stat/write/context. Не передавайте произвольный URL/путь из формы в файловую функцию: приложение сопоставляет разрешённый ID с нужным ресурсом. Имя загрузки на компьютере посетителя не является путём сервера. CWD и каталоги; Обёртки и контексты; Загрузки.

Поток: читать список выдачи по одной строке

Вместо всей строки сразу можно открыть файл и получать по одному заданию. fopen возвращает ресурс — доступ к открытому файлу с текущей позицией. Ресурс не равен содержимому. fgets читает до перевода строки включительно; следующий вызов начинает со следующей позиции. fclose закрывает доступ, сохраняя файл.

Две строки выдачи
  1. fopen(pickup.txt, rb): позиция в начале
  2. Первый fgets → «Дрель: 2», позиция после LF
  3. Второй fgets → «Пила: 1»
  4. fclose освобождает открытый поток
Получить две отдельные позиции выдачиСамостоятельный пример
<?php
declare(strict_types=1);

$stream = fopen(__DIR__ . '/pickup.txt', 'rb');
if ($stream === false) { throw new RuntimeException('Не открыть список'); }
try {
    echo 'Сначала: ', fgets($stream);
    echo 'Затем: ', fgets($stream);
} finally { fclose($stream); }
Ожидаемый результат
Сначала: Дрель: 2
Затем: Пила: 1

Файл из архива содержит ровно две строки. rb открывает существующий файл для чтения; try/finally гарантирует закрытие после попытки. В произвольном файле строки могут закончиться раньше: карточка fgets показывает цикл со строгой проверкой false.

Официальный Resource Types этой ветки ссылается на streams. Поток может представлять файл, память, сеть или pipe; тип resource не обещает одинаковых возможностей. fread читает порции байтов, а не обязательно целые символы UTF-8. rewind возвращает позицию у совместимого потока. Для HTTP и сокета short read не означает конец сообщения. Позиция и чтение порциями.

Не потерять "0", поймать отказ и ограничить объём

У многих функций false обозначает отказ, но пустая строка или0 — успех. Поэтому === false сравнивает значение и тип. Файловый отказ обычно сопровождается E_WARNING; try/catch сам по себе обычное предупреждение не ловит. Приложение выбирает, как журналировать и преобразовывать такую диагностику, не показывая внутренние пути пользователю.

В следующем опыте временный set_error_handler превращает E_WARNING в ErrorException; остальные уровни возвращают false стандартному обработчику. try/catch ловит именно это исключение, finally восстанавливает прежний обработчик. Это локальная демонстрация, не новая глобальная политика для всего фреймворка.

Ожидаемый отказ чтения
  1. Вызов для missing.txt
  2. Файловое предупреждение
  3. Временный handler → ErrorException
  4. catch даёт прикладное сообщение; finally восстанавливает handler
Обработать реальный отказ без @Самостоятельный пример
<?php
set_error_handler(function ($severity, $message, $file, $line) {
    if ($severity === E_WARNING) { throw new ErrorException($message, 0, $severity, $file, $line); }
    return false;
});
try {
    file_get_contents(__DIR__ . '/missing.txt');
} catch (ErrorException $error) {
    echo "Отчёт недоступен\n";
} finally { restore_error_handler(); }
Ожидаемый результат
Отчёт недоступен

Внутренний message можно направить в закрытый журнал по политике приложения. Он не выводится посетителю.

Теперь обернём чтение в функцию. function smallReport($path, $limit) задаёт локальные параметры; return возвращает строку. Читаем limit+1 байт: лишний байт позволяет обнаружить превышение, не загружая файл целиком. Это локальный обычный файл; timeout/HTTP-статус для сети решаются отдельно.

Не читать произвольный файл целикомСамостоятельный пример
<?php
function smallReport($path, $limit) {
    $body = file_get_contents($path, false, null, 0, $limit + 1);
    if ($body === false) { throw new RuntimeException('read'); }
    if (strlen($body) > $limit) { throw new LengthException('too large'); }
    return $body;
}
echo smallReport(__DIR__ . '/small.txt', 4), "\n";
try { smallReport(__DIR__ . '/large.txt', 4); }
catch (LengthException $error) { echo "Нужна потоковая обработка\n"; }
Ожидаемый результат
0
Нужна потоковая обработка

limit выбирает приложение и проверяет как положительный небольшой int до вызова. false/null в file_get_contents пропускают include_path/context.

Проверка размера до чтения не резервирует размер: другой процесс может изменить файл. Лимит самого чтения ограничивает потребление лучше. Исключения TypeError/ValueError относятся к неверному вызову и не исправляются повторной попыткой. Ошибки и исключения.

Установка, php.ini и ограничения окружения

Файловые функции входят в стандартную поставку PHP; внешняя библиотека для этой ветки не нужна. Возможности ОС/обёрток остаются различными. Историческое введение Manual для Linux Large File Support указывает современную glibc и флаги компилятора -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64: это контекст сборки из исходников, а не команды для каждого готового пакета. Важны размер PHP int, поддержка FS и конкретная операция; тест здесь выполнен на64-битном PHP8.5.11 Windows.

INI_SYSTEM меняется при настройке/запуске PHP, а не произвольным ini_set внутри скрипта. INI_ALL допускает изменение в разрешённых контекстах, но долгоживущий процесс должен восстанавливать временную настройку. CLI и веб-SAPI могут читать разные ini. Обычная установка: PHP и окружение.

Настройка, default, режимЧто меняет
allow_url_fopen =1; INI_SYSTEMДоступ сетевых URL-aware обёрток, например HTTP/FTP; другие расширения могут зарегистрировать дополнительные обёртки. Не право читать любой URL по запросу пользователя.
allow_url_include =0; INI_SYSTEMРазрешала URL-aware include/include_once/require/require_once; требует allow_url_fopen. Deprecated7.4; не включайте для загрузки исполняемого кода из запроса.
user_agent =NULL; INI_ALLUser-Agent, отправляемый соответствующей обёрткой. Не превращает запрос в браузер.
default_socket_timeout =60; INI_ALLСекунды ожидания socket-based streams; отрицательное значение означает бесконечное. Это не общий deadline всей интеграции.
from =""; INI_ALLАдрес для unauthenticated FTP и HTTP From header соответствующих обёрток. Не аутентификация пользователя.
auto_detect_line_endings =0; INI_ALLИсторическое определение Unix/MS-DOS/старого Mac CR для fgets/file; небольшая работа на первой строке и изменение смысла CR. Deprecated8.1: явная нормализация формата.
sys_temp_dir =""; INI_SYSTEMВыбор системной временной папки PHP; tmpfile не принимает её аргументом. Должна существовать и быть доступна процессу.

Дополнительно влияют open_basedir, include_path, realpath_cache_size/ttl, лимиты памяти/времени и права ОС; это соседние настройки ядра, не новые параметры этих функций. Не отключайте TLS-проверку ради устранения предупреждения сети. Производственный сервер не должен отдавать конфиги и логи как статические файлы.

Все константы ветки и где их можно использовать

Константа — именованное значение без $; например LOCK_EX. Маска объединяется через | только там, где договор это разрешает. У параметра выбора одного режима (например INI scanner или pathinfo component) другая семантика. Список ниже сохраняет весь официальный каталог, включая исторические значения без эффекта.

КонстантыНазначение
SEEK_SET / SEEK_CUR / SEEK_ENDНачало/текущая позиция/конец для fseek; offset в байтах.
LOCK_SH / LOCK_EX / LOCK_UN / LOCK_NBСовместная/исключительная/снять; NB добавляет попытку без ожидания.
FILE_USE_INCLUDE_PATHДополнительный поиск include_path в поддерживающих функциях; у bool-параметра передают true.
FILE_NO_DEFAULT_CONTEXTНе использовать стандартный stream context в поддерживающем flags-параметре.
FILE_APPENDДописать при file_put_contents; не допустим для file() и с8.3 там ValueError.
FILE_IGNORE_NEW_LINES / FILE_SKIP_EMPTY_LINESДля file(): убрать концы строк / пропустить пустые.
FILE_BINARY / FILE_TEXTНет эффекта; deprecated8.1. Для fopen выбирают b/t в строке mode.
GLOB_AVAILABLE_FLAGSМаска объединения доступных GLOB_*; не обещает переносимость каждого поведения.
GLOB_BRACEРаскрыть {a,b,c}; отсутствует на некоторых non-GNU системах, например Solaris/Alpine.
GLOB_ERRОстановиться на ошибке чтения; обычно такие ошибки игнорируются.
GLOB_MARKДобавить разделитель к найденным каталогам: / либо Windows backslash.
GLOB_NOCHECKЕсли совпадений нет, вернуть сам шаблон: это не найденный файл.
GLOB_NOESCAPEBackslash не экранирует специальные знаки.
GLOB_NOSORTНе выполнять обычную алфавитную сортировку; порядок не обещан.
GLOB_ONLYDIRОставить только каталоги.
PATHINFO_ALLВсе части ассоциативным массивом.
PATHINFO_DIRNAME / PATHINFO_BASENAMEРодительский путь / конечное имя с расширением.
PATHINFO_EXTENSION / PATHINFO_FILENAMEПоследнее расширение / конечное имя без него. Не MIME.
INI_SCANNER_NORMAL / INI_SCANNER_RAW / INI_SCANNER_TYPEDОбычное вычисление / сырой разбор / сохранение поддерживаемых типов.
FNM_NOESCAPEОтключить backslash-escape в fnmatch.
FNM_PATHNAMEРазделитель / совпадает только с явно указанным /.
FNM_PERIODНачальная точка должна явно совпадать с точкой шаблона.
FNM_CASEFOLDСопоставление без регистра, GNU-расширение; проверяйте наличие на платформе.
Код $_FILES errorСмысл
UPLOAD_ERR_OK =0PHP завершил передачу; содержимое ещё требует проверки.
UPLOAD_ERR_INI_SIZE =1Превышен upload_max_filesize.
UPLOAD_ERR_FORM_SIZE =2Превышен MAX_FILE_SIZE из формы; клиентский лимит не заменяет серверный.
UPLOAD_ERR_PARTIAL =3Получена лишь часть файла.
UPLOAD_ERR_NO_FILE =4Файл не передан.
UPLOAD_ERR_NO_TMP_DIR =6Нет временной папки.
UPLOAD_ERR_CANT_WRITE =7Не удалось записать на диск.
UPLOAD_ERR_EXTENSION =8Загрузку остановило расширение; PHP не сообщает через этот код, какое именно. Исследуют конфигурацию в закрытой диагностике, не публичном phpinfo.

У кода5 нет соответствующей константы этой таблицы. Если весь POST превышает post_max_size, массив $_FILES может оказаться пустым: это отдельный случай обработчика, а не обязательно готовая запись с UPLOAD_ERR_INI_SIZE. Проверка загрузки и всех ошибок.

Выбор подхода: память, конкурентность, сохранность

ЗадачаПодход и граница
Маленький известный файл строкойfile_get_contents; объём в памяти пропорционален прочитанному.
Большой журналfgets построчно или fread порциями; максимальный размер строки тоже ограничивают.
CSV с кавычками/переносамиfgetcsv и fputcsv с одинаковым явным escape.
Просто дописать журналfile_put_contents FILE_APPEND|LOCK_EX; не заменяет общий протокол всех читателей.
Счётчик read→modify→writefopen c+ → flock → читать/изменять/усекать/писать → fflush → unlock.
Опубликовать готовый отчётtempnam в нужном каталоге → записать/закрыть → rename; атомарность зависит от одной FS/ОС, durable commit требует большего.
Попросить запись на носительfsync или fdatasync; высокая задержка возможна, это не транзакция нескольких сущностей.
Получить результат CLI-программыpopen/pclose для одного направления; proc_open для управляемых каналов.

Проверка/чтение/запись — отдельные моменты времени. Предварительная is_writable не гарантирует успешный fwrite, кэш метаданных не является блокировкой. Накопление массива file и миллионы мелких I/O дают другую стоимость, чем порционная обработка. Измеряйте реальный размер, FS, конкурентность и требования сохранности; не обещайте постоянный коэффициент ускорения. У критичных совместных данных БД с транзакцией может быть понятнее собственного файлового протокола.

Упражнение: прочитать задания, не потеряв ID 0

Очередь небольшого учебного сервиса хранит по одному ID в строке: 0, пустая строка, 12. Надо вывести только непустые строки, сохранив ID0, и вернуть число обработанных. Сначала попробуйте сами: условие if ($id) здесь неверно, потому что строка "0" ложноподобна.

while повторяет чтение до false; rtrim($line, " ") убирает только концы строк, continue пропускает пустую запись, ++ увеличивает счётчик. finally закрывает ресурс. Такая обработка не превращает файл в надёжную очередь нескольких workers: пример обучает чтению.

Путь конкретных строк
  1. 0 + LF → id0, вывести
  2. Пустая строка → пропустить
  3. 12 → id12, вывести
  4. EOF → вернуть count2
Прочитать задания и сохранить допустимый номер 0Самостоятельный пример
<?php
declare(strict_types=1);

function showJobs($path): int {
    $stream = fopen($path, 'rb');
    if ($stream === false) { throw new RuntimeException('Не открыть задания'); }
    $count = 0;
    try {
        while (($line = fgets($stream)) !== false) {
            $id = rtrim($line, "\r\n");
            if ($id === '') { continue; }
            echo 'В работу: заказ ', $id, "\n";
            $count++;
        }
        if (!feof($stream)) { throw new RuntimeException('Не дочитать задания'); }
    } finally { fclose($stream); }
    return $count;
}
$count = showJobs(__DIR__ . '/jobs.txt');
echo 'Принято заданий: ', $count, "\n";
Ожидаемый результат
В работу: заказ 0
В работу: заказ 12
Принято заданий: 2

Файл содержит три настоящие физические строки:0, пустую,12. Функция печатает задания как действие и возвращает только счётчик. Вызывающий код сохраняет число отдельным присваиванием, затем печатает итог; echo и return выполняют разные задачи.

Следующий шаг: добавьте проверку формата ID и максимальную длину строки, затем отдельно выберите настоящий механизм очереди с атомарным получением задачи. Вывод и return; Workers и развёртывание.

Все функции официальной ветки: указатель по задачам

Ссылки ведут на единственные карточки, включая ранее написанные в главах «Файлы», «Потоки» и «Загрузки». Alias не получает выдуманную отдельную семантику; удалённая fgetss и навигационный delete обозначены исторически. Это полный указатель данной ветки, а не заявление готовности всего PHP Manual.

ГруппаКарточки
Пути и поискbasename, dirname, pathinfo, realpath, clearstatcache, realpath_cache_get, realpath_cache_size, glob, fnmatch
Метаданные и доступstat, fstat, lstat, filemtime, fileatime, filectime, filesize, filetype, fileowner, filegroup, fileinode, fileperms, file_exists, is_dir, is_file, is_readable, is_writable, is_writeable, is_link, is_executable, disk_free_space, disk_total_space, diskfreespace
Открытый поток и позицияfopen, fclose, fread, fwrite, fputs, fgetc, fgets, feof, fseek, ftell, rewind, ftruncate
Файл целиком и именаfpassthru, readfile, file, file_get_contents, file_put_contents, copy, rename, unlink, delete
CSV, шаблон строки и INIfgetcsv, fputcsv, fscanf, parse_ini_file, parse_ini_string, fgetss
Права, ссылки, каталогиchgrp, chmod, chown, lchgrp, lchown, link, linkinfo, symlink, readlink, mkdir, rmdir, umask, touch
Блокировки и синхронизацияflock, fflush, fsync, fdatasync, set_file_buffer
Временные файлы, загрузки, процессыtempnam, tmpfile, is_uploaded_file, move_uploaded_file, popen, pclose

Смежные ветки: Каталоги и обход; Потоки, обёртки и контексты; Внешние программы; HTTP-загрузка.

Что ломалось в реальных задачах и как это воспроизвести

Следующие обсуждения использованы как постановки проблем. Примеры написаны для этого учебника; старые ответы не исполнялись и не перенесены как готовые решения.

ПроблемаПричина и современное решение
Почему отдельно успешные чтение и запись теряют измененияДругой процесс дописывал журнал между чтением и заменой. Нужен единый протокол блокировки всей операции; LOCK_EX только при последней записи не защищает прежнее чтение. Договор PHP.
Обратная косая черта нарушила обратное чтение CSVИсторический вопрос предшествует поддержке пустого escape. В современных примерах явно согласованы разделитель, кавычка, escape и перевод строки. Договор PHP.
Почему обход останавливается на файле 0Имя0 допустимо, но ложно при нестрогой проверке. Сравниваем результат readdir строго с false. Договор PHP.
Почему is_dir проверяет не тот каталогreaddir возвращает имя; проверку делают по исходной папке плюс это имя. Относительный путь может быть корректным, если известна его точка отсчёта. Договор PHP.
Когда нужен readdir, а когда scandirВыбор между поочерёдным получением имён и готовым массивом со своим порядком. Вопрос о скорости не даёт универсального коэффициента ускорения. Договор PHP.
Почему tempnam создал файл в другой папкеПри недоступном каталоге возможен системный fallback. Пример проверяет фактический каталог, а публикация отчёта требует совместимого хранилища. Договор PHP.

Функции и методы этой темы

Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.

basenameПоказать короткое имя отчёта вместо полного пути.

PHP 4+ · standard

basename(string $path, string $suffix = ""): string

Показать короткое имя отчёта вместо полного пути.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. function name($x) { ... } объявляет повторяемое действие; return отдаёт результат вызову. foreach берёт элементы массива по одному, форма as $key => $value также читает ключ. [...] создаёт массив; $row["size"] читает поле по ключу; [$a, $b] = ... раскладывает список. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
pathСтрока пути; относительный путь разрешается от текущего рабочего каталога (CWD), а не обязательно от папки этого исходника. Здесь файл не открывается: обрабатывается только текст.
suffixТочный суффикс для удаления с конца найденного имени; по умолчанию пустой.
ВозвратПоследний компонент пути строкой.
ОтказНесовместимый тип аргумента → TypeError; существование файла не проверяется.
ВерсияPHP 4+
Путь данных в первом опыте
  1. exports/monthly.csv
  2. Отбрасываем текст каталогов
  3. monthly.csv
Имя и удаление согласованного суффиксаСамостоятельный пример
<?php
echo basename('exports/monthly.csv'), "\n";
echo basename('exports/monthly.csv', '.csv'), "\n";
echo basename('exports/monthly.CSV', '.csv'), "\n";
Ожидаемый результат
monthly.csv
monthly
monthly.CSV

Суффикс чувствителен к регистру. Это не проверка расширения по содержимому.

Подписи подготовленных выгрузокСамостоятельный пример
<?php
function reportLabel($path) { return basename($path); }
foreach (['private/reports/jan.csv', 'private/reports/feb.csv'] as $path) {
    echo reportLabel($path), "\n";
}
Ожидаемый результат
jan.csv
feb.csv

В интерфейсе такую подпись ещё экранируют через htmlspecialchars; путь для чтения берут из собственного разрешённого каталога.

Применение и границы. Не понимает семантику .. и symlink. На Windows разделители / и \, на прочих ОС обычно только /. Функция зависит от locale для многобайтового имени; некорректные байты дают неопределённый результат. Это не разрешение доступа и не защита от подмены пути. Пользователь выбирает разрешённый идентификатор, приложение задаёт путь; права ОС и проверки самой операции остаются обязательными.

Сравните: dirname, pathinfo, realpath. Полный выбор файловых операций.

dirnameПолучить родительский путь для размещения соседнего файла.

PHP 4+ · standard

dirname(string $path, int $levels = 1): string

Получить родительский путь для размещения соседнего файла.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. function name($x) { ... } объявляет повторяемое действие; return отдаёт результат вызову. try выполняет попытку, catch обрабатывает указанный отказ, finally освобождает ресурс и не подавляет ошибку. throw new RuntimeException сообщает о сбое. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
pathСтрока пути; анализируется без обращения к файловой системе.
levelsСколько уровней подняться; целое > 0, по умолчанию 1.
ВозвратРодительский путь; для имени без разделителей — "." (текущий каталог).
Отказlevels ≤ 0 → ValueError; неподходящий тип → TypeError.
ВерсияPHP 4+

Параметр levels существует с PHP 7.0; здесь код рассчитан на PHP 8.2+.

Путь данных в первом опыте
  1. app/reports/daily.csv
  2. Убрать последний компонент
  3. app/reports
Один и два уровняСамостоятельный пример
<?php
echo dirname('app/reports/daily.csv'), "\n";
echo dirname('app/reports/daily.csv', 2), "\n";
echo dirname('daily.csv'), "\n";
Ожидаемый результат
app/reports
app
.

Возвращённая точка не означает найденный существующий файл: это строковое представление родителя относительного имени.

Соседний manifest по известному путиСамостоятельный пример
<?php
function manifestFor($report) { return dirname($report) . '/manifest.json'; }
echo manifestFor('export/report.csv'), "\n";
try { dirname('export/report.csv', 0); }
catch (ValueError $error) { echo "Нужен хотя бы один уровень\n"; }
Ожидаемый результат
export/manifest.json
Нужен хотя бы один уровень

Функция лишь конструирует имя: создание и проверка доступа выполняются отдельными операциями.

Применение и границы. Не разрешает .. и ссылки. Цикл подъёма должен останавливаться, когда родитель не меняется, иначе dirname(".") снова даёт ".". Windows учитывает обе косые черты и текущую codepage; другие ОС требуют ASCII-совместимой кодировки пути.

Сравните: basename, pathinfo, realpath. Полный выбор файловых операций.

pathinfoРазобрать текст пути на каталог, имя и расширение.

PHP 4.0.3+ · standard

pathinfo(string $path, int $flags = PATHINFO_ALL): array|string

Разобрать текст пути на каталог, имя и расширение.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. [...] создаёт массив; $row["size"] читает поле по ключу; [$a, $b] = ... раскладывает список. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
pathСтрока пути; файл не открывается.
flagsБез аргумента/PATHINFO_ALL — массив; один из PATHINFO_DIRNAME/BASENAME/EXTENSION/FILENAME — соответствующая строка. Это не битовая маска.
ВозвратМассив dirname/basename/filename и extension, если точка расширения есть, либо выбранная строка.
ОтказСуществование не проверяет; неподходящий тип → TypeError. Для отсутствующего ключа используйте ?? или array_key_exists.
ВерсияPHP 4.0.3+
Действие на учебных данных
  1. Имена archive.tar.gz и README
  2. pathinfo разбирает последнюю точку
  3. Подпись gz либо «нет»
Подписать архив и файл без расширенияСамостоятельный пример
<?php
declare(strict_types=1);

foreach (['exports/archive.tar.gz', 'README'] as $path) {
    $parts = pathinfo($path);
    echo $parts['basename'], ' — расширение: ', $parts['extension'] ?? 'нет', "\n";
}
echo 'Основа архива: ', pathinfo('exports/archive.tar.gz', PATHINFO_FILENAME), "\n";
Ожидаемый результат
archive.tar.gz — расширение: gz
README — расширение: нет
Основа архива: archive.tar

pathinfo разбирает строку, даже если файла нет. Последняя точка отделяет только gz; tar остаётся в filename. ?? задаёт подпись для отсутствующего ключа extension. Такой разбор подходит для подписи, а не подтверждения содержимого архива.

Скрытое имя и пустое расширениеСамостоятельный пример
<?php
echo pathinfo('.env', PATHINFO_EXTENSION), "\n";
var_dump(pathinfo('.env', PATHINFO_FILENAME));
var_dump(pathinfo('report.', PATHINFO_EXTENSION));
Ожидаемый результат
env
string(0) ""
string(0) ""

У .env имя до последней точки пустое; у report. расширение существует как пустой текст. Расширение не подтверждает MIME или безопасность загрузки.

Применение и границы. На Windows \ — разделитель, на прочих ОС обычный символ. Для многобайтовых имён важна locale. Не разрешает symlink/..; для URL нужен разбор URL, а для проверки загруженного файла — содержимое и правила uploads.

Сравните: basename, dirname, realpath. Полный выбор файловых операций.

clearstatcacheПеречитать метаданные после изменения файла вместо использования старого stat-кэша.

PHP 4+ · standard

clearstatcache(bool $clear_realpath_cache = false, string $filename = ""): void

Перечитать метаданные после изменения файла вместо использования старого stat-кэша.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
clear_realpath_cachetrue дополнительно очищает realpath-кэш, false только stat-кэш.
filenameОграничивает очистку realpath-кэша этим именем только при true. Не означает выбор одного имени для stat-кэша.
Возвратvoid, значимого результата нет.
ОтказНе обновляет сам файл и не подтверждает успешность следующей операции.
ВерсияPHP 4+
Действие на учебных данных
  1. events.log содержит created и LF: 8 байт
  2. Добавлена строка paid: стало 13 байт
  3. clearstatcache обновляет следующий запрос размера
После дополнения пересчитать размер журналаСамостоятельный пример
<?php
declare(strict_types=1);

$path = __DIR__ . '/events.log';
echo 'До дополнения: ', filesize($path), " байт\n";
file_put_contents($path, "paid\n", FILE_APPEND);
clearstatcache();
echo 'После дополнения: ', filesize($path), " байт\n";
echo file_get_contents($path);
Ожидаемый результат
До дополнения: 8 байт
После дополнения: 13 байт
created
paid

clearstatcache не дописывает файл: это сделал предыдущий вызов. Очистка заставляет следующий запрос метаданных заново узнать размер. Не предполагаем, что каждая конкретная операция обязательно оставила старый кэш; явный вызов показывает намерение.

Обновить данные своего существующего путиСамостоятельный пример
<?php
$path = __DIR__ . '/state.txt';
realpath($path);
clearstatcache(true, $path);
echo basename(realpath($path)), "\n";
unlink($path);
var_dump(file_exists($path));
Ожидаемый результат
state.txt
bool(false)

unlink очищает соответствующий кэш автоматически; сведения о несуществующем файле PHP не кэширует. Здесь удаляется только объявленный fixture.

Применение и границы. Влияет на stat/lstat, file_exists, is_*, размеры, время, inode, владельца, группу, тип и права. Не вызывайте на каждой итерации без причины; при внешнем изменении он нужен для актуального запроса, но не блокирует конкурента. Результат относится к моменту проверки и может кэшироваться; clearstatcache() обновляет stat-кэш, но не устраняет гонку между проверкой и действием.

Сравните: stat, filesize, realpath_cache_get, realpath_cache_size. Полный выбор файловых операций.

realpath_cache_getИсследовать, какие пути процесс уже разрешил и сохранил в кэше.

PHP 5.3.2+ · standard

realpath_cache_get(): array

Исследовать, какие пути процесс уже разрешил и сохранил в кэше.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. foreach берёт элементы массива по одному, форма as $key => $value также читает ключ. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". try выполняет попытку, catch обрабатывает указанный отказ, finally освобождает ресурс и не подавляет ошибку. throw new RuntimeException сообщает о сбое. [...] создаёт массив; $row["size"] читает поле по ключу; [$a, $b] = ... раскладывает список. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
ПараметрыНет.
ВозвратМассив: ключи — исходные пути, значения — сведения key/is_dir/realpath/expires и возможные платформенные поля. Порядок и содержимое зависят от процесса.
ОтказПустой массив возможен при очищенном/отключённом кэше. Наличие записи не гарантирует, что цель не изменилась.
ВерсияPHP 5.3.2+
Путь конкретного документа
  1. Кэш путей очищен
  2. Разрешён существующий pickup.txt
  3. Из записи кэша видны имя pickup.txt и тип файл
Найти путь своего отчёта в кэше процессаСамостоятельный пример
<?php
declare(strict_types=1);

clearstatcache(true);
$target = realpath(__DIR__ . '/pickup.txt');
foreach (realpath_cache_get() as $original => $entry) {
    if ($entry['realpath'] === $target) {
        echo basename($original), ': ', $entry['is_dir'] ? 'каталог' : 'файл', "\n";
    }
}
Ожидаемый результат
pickup.txt: файл

Ключ массива — исходное имя, realpath — разрешённая цель, is_dir различает каталог и файл. Это диагностика включённого кэша без open_basedir; при отключённом кэше записей не будет. Внутренние абсолютные пути не отправляем посетителю.

Очистка списка после диагностикиСамостоятельный пример
<?php
realpath(__DIR__ . '/cache.txt');
clearstatcache(true);
echo count(realpath_cache_get()), "\n";
Ожидаемый результат
0

count считает оставшиеся записи в этом процессе сразу после полной очистки; это не глобальный кэш всех PHP workers.

Применение и границы. Не публикуйте диагностический дамп внутренних путей в веб-ответ. Опции realpath_cache_size и realpath_cache_ttl относятся к конфигурации ядра; open_basedir отключает realpath-кэш. expires — момент истечения, не гарантия существования файла.

Сравните: realpath_cache_size, clearstatcache, realpath. Полный выбор файловых операций.

realpath_cache_sizeУзнать текущий расход памяти кэша путей, а не число файлов.

PHP 5.3.2+ · standard

realpath_cache_size(): int

Узнать текущий расход памяти кэша путей, а не число файлов.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
ПараметрыНет.
Возвратint — занятые кэшем байты, не настроенный максимальный лимит.
Отказ0 допустим при пустом/отключённом кэше; конкретное число зависит от ОС, путей и процесса.
ВерсияPHP 5.3.2+
Путь данных в первом опыте
  1. Кэш очищен
  2. Читаем текущий расход
  3. 0 байтов
Отличить пустой кэш от лимитаСамостоятельный пример
<?php
clearstatcache(true);
echo realpath_cache_size(), "\n";
Ожидаемый результат
0

В ini одноимённая директива задаёт предел, а функция измеряет текущее использование.

Замерить, использует ли разрешение пути память кэшаСамостоятельный пример
<?php
declare(strict_types=1);

clearstatcache(true);
$before = realpath_cache_size();
realpath(__DIR__ . '/pickup.txt');
$after = realpath_cache_size();
echo 'Начальный расход: ', $before, " байт\n";
echo $after > $before
    ? "Путь отчёта добавлен в кэш процесса.\n"
    : "Кэш отключён или путь не добавлен.\n";
Ожидаемый результат
Начальный расход: 0 байт
Путь отчёта добавлен в кэш процесса.

Ожидаемый путь проверен при включённом realpath-кэше. $after содержит фактический расход; он зависит от длины абсолютных путей и ОС. Для своей диагностики выведите $after и сравните с настройкой лимита, не принимайте число байтов за количество файлов.

Применение и границы. Полезно при диагностике большого проекта, но увеличение лимита без измерения нагрузки не является универсальным ускорением. Кэш метаданных и realpath-кэш различаются.

Сравните: realpath_cache_get, clearstatcache. Полный выбор файловых операций.

globНайти локальные отчёты по маске, например только CSV в известной папке.

PHP 4.3+ · standard

glob(string $pattern, int $flags = 0): array|false

Найти локальные отчёты по маске, например только CSV в известной папке.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. foreach берёт элементы массива по одному, форма as $key => $value также читает ключ. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
patternМаска: * — любое число символов, ? — один, [...] — набор/диапазон, [!...] — отрицание; {a,b} требует GLOB_BRACE; \ экранирует при отсутствии GLOB_NOESCAPE. ~ и переменные не раскрываются.
flagsКомбинация GLOB_MARK/NOSORT/NOCHECK/NOESCAPE/ERR/ONLYDIR/BRACE, см. таблицу констант главы.
ВозвратМассив путей, [] при отсутствии совпадений, false при ошибке. По умолчанию сортирует имена, GLOB_NOSORT отключает сортировку.
ОтказПри отказе обычно false и E_WARNING: отсутствие файла, доступа, места или поддержки операции. Проверяйте === false; 0/пустая строка могут быть успехом. Неверный тип/значение аргумента в PHP 8 может дать TypeError/ValueError.
ВерсияPHP 4.3+
Путь данных в первом опыте
  1. Маска *.csv в учебной папке
  2. Поиск локальных записей
  3. a.csv затем b.csv
Выбрать CSVСамостоятельный пример
<?php
$paths = glob(__DIR__ . '/*.csv');
if ($paths === false) { throw new RuntimeException('Поиск не выполнен'); }
foreach ($paths as $path) { echo basename($path), "\n"; }
Ожидаемый результат
a.csv
b.csv

Список собирается целиком в память; на огромном каталоге рассмотрите последовательный readdir.

Отличить отсутствие отчётов от возвращённого шаблонаСамостоятельный пример
<?php
declare(strict_types=1);

$reports = glob(__DIR__ . '/missing-*.csv');
if ($reports === false) { throw new RuntimeException('Поиск не выполнен'); }
if ($reports === []) { echo "Готовых CSV-отчётов нет.\n"; }
$fallback = glob('missing-*.csv', GLOB_NOCHECK);
echo 'NOCHECK вернул шаблон: ', $fallback[0], "\n";
Ожидаемый результат
Готовых CSV-отчётов нет.
NOCHECK вернул шаблон: missing-*.csv

[] означает, что совпадений нет. GLOB_NOCHECK вместо пустого массива возвращает исходный шаблон: это не имя реально найденного файла. Не пытайтесь автоматически открыть такой результат как готовый отчёт.

Применение и границы. Только локальная файловая система, не HTTP/FTP. GLOB_BRACE не существует на некоторых не-GNU системах (например Alpine/Solaris); проверяйте defined(). Unix зависит от libc, Windows использует POSIX-совместимую реализацию. Это не рекурсивный обход и не подтверждение доступа.

Сравните: fnmatch, is_file, opendir. Полный выбор файловых операций.

fnmatchПроверить пользовательскую маску имени без чтения каталога.

PHP 4.3+ · standard

fnmatch(string $pattern, string $filename, int $flags = 0): bool

Проверить пользовательскую маску имени без чтения каталога.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. [...] создаёт массив; $row["size"] читает поле по ключу; [$a, $b] = ... раскладывает список. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
patternShell-маска: ? один символ, * ноль/несколько, [0-9]/[abc] набор ASCII, [!A-Z] отрицание, \ экранирование. Не регулярное выражение.
filenameПроверяемая строка, файл не обязан существовать.
flagsЧерез |: FNM_NOESCAPE отключает экранирование; FNM_PATHNAME не даёт * пересекать /; FNM_PERIOD требует явной начальной точки; FNM_CASEFOLD игнорирует регистр (GNU-возможность).
Возвратtrue при совпадении, иначе false.
ОтказДоступность зависит от POSIX-совместимости, Windows поддерживается; типы должны соответствовать сигнатуре.
ВерсияPHP 4.3+
Действие на учебных данных
  1. report-7.csv, report-10.csv, report-X.csv
  2. Маска report-[0-9].csv
  3. В подборку проходит только report-7.csv
Отобрать однозначные номера отчётов из спискаСамостоятельный пример
<?php
declare(strict_types=1);

$names = ['report-7.csv', 'report-10.csv', 'report-X.csv'];
foreach ($names as $name) {
    if (fnmatch('report-[0-9].csv', $name)) {
        echo 'В дневную подборку: ', $name, "\n";
    } else {
        echo 'Другой формат имени: ', $name, "\n";
    }
}
Ожидаемый результат
В дневную подборку: report-7.csv
Другой формат имени: report-10.csv
Другой формат имени: report-X.csv

[0-9] означает ровно одну ASCII-цифру. ? также берёт один символ, но допускает X. * допустил бы и многозначный номер. fnmatch работает со строками и не проверяет существование файлов.

Выбрать видимые CSV верхнего уровняСамостоятельный пример
<?php
declare(strict_types=1);

$names = ['report.csv', 'sub/report.csv', '.draft.csv'];
foreach ($names as $name) {
    if (fnmatch('*.csv', $name, FNM_PATHNAME | FNM_PERIOD)) {
        echo 'В подборку: ', $name, "\n";
    }
}
echo fnmatch('*.CSV', 'report.csv', FNM_CASEFOLD)
    ? "Режим без учёта регистра принял report.csv.\n"
    : "Регистр отличается.\n";
Ожидаемый результат
В подборку: report.csv
Режим без учёта регистра принял report.csv.

FNM_PATHNAME не даёт * пересечь /, FNM_PERIOD требует явно указать начальную точку, FNM_CASEFOLD отключает различение регистра там, где доступен. Эти флаги меняют правило выбора имени, а не права на файл.

Применение и границы. Используется и для обычных строк. Диапазоны описаны ASCII-кодами, не обещайте полноценное лингвистическое Unicode-сравнение. Это не разрешение доступа и не защита от подмены пути. Пользователь выбирает разрешённый идентификатор, приложение задаёт путь; права ОС и проверки самой операции остаются обязательными.

Сравните: glob, basename. Полный выбор файловых операций.

statПолучить набор метаданных файла; символическая ссылка ведёт к цели.

PHP 4+ · standard

stat(string $filename): array|false

Получить набор метаданных файла; символическая ссылка ведёт к цели.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. function name($x) { ... } объявляет повторяемое действие; return отдаёт результат вызову. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". [...] создаёт массив; $row["size"] читает поле по ключу; [$a, $b] = ... раскладывает список. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
filenameСтрока пути; относительный путь разрешается от текущего рабочего каталога (CWD), а не обязательно от папки этого исходника.
ВозвратМассив с 13 полями, продублированными числовыми и строковыми ключами; false при отказе.
ОтказПри отказе обычно false и E_WARNING: отсутствие файла, доступа, места или поддержки операции. Проверяйте === false; 0/пустая строка могут быть успехом. Неверный тип/значение аргумента в PHP 8 может дать TypeError/ValueError.
ВерсияPHP 4+
КлючиСодержание
0 / devИдентификатор устройства/тома.
1 / inoInode/идентификатор файла.
2 / modeТип и биты режима доступа.
3 / nlinkЧисло жёстких ссылок.
4 / uidЧисловой владелец.
5 / gidЧисловая группа.
6 / rdevТип устройства для специального файла.
7 / sizeРазмер в байтах.
8 / atimeПоследний доступ: Unix timestamp.
9 / mtimeИзменение содержимого: Unix timestamp.
10 / ctimeИзменение inode: Unix timestamp; не переносимая дата создания.
11 / blksizeРазмер блока ввода-вывода.
12 / blocksВыделенные блоки по 512 байт.

Тип в mode задаётся старшими битами: 0140000 socket, 0120000 link, 0100000 обычный файл, 0060000 block, 0040000 каталог, 0020000 char, 0010000 fifo. Нижние права — другая часть битовой маски.

Действие на учебных данных
  1. pickup.txt содержит «104: ready» и LF
  2. stat читает метаданные
  3. size: 11 байт; текст не прочитан
Подготовить подпись документа без чтения его содержимогоСамостоятельный пример
<?php
declare(strict_types=1);

$path = __DIR__ . '/pickup.txt';
$info = stat($path);
if ($info === false) { throw new RuntimeException('Не получить метаданные'); }
echo basename($path), ': ', $info['size'], " байт\n";
echo $info['size'] === 0 ? "Пустой документ\n" : "Документ содержит данные\n";
Ожидаемый результат
pickup.txt: 11 байт
Документ содержит данные

size — именованный ключ массива метаданных; то же значение доступно по числовому ключу 7. Для ясности используем имя. stat следует к цели символической ссылки, lstat описывает саму ссылку. Здесь fixture — обычный файл.

Собрать ограниченную запись метаданныхСамостоятельный пример
<?php
function reportInfo($path) {
    $info = stat($path);
    if ($info === false) { throw new RuntimeException('Метаданные'); }
    return ['name' => basename($path), 'bytes' => $info['size']];
}
$info = reportInfo(__DIR__ . '/report.txt');
echo $info['name'], ': ', $info['bytes'], "\n";
Ожидаемый результат
report.txt: 6

Функция отдаёт только нужные сведения; внутренние абсолютные пути и UID не уходят в ответ автоматически.

Применение и границы. Windows: uid/gid равны 0; blksize/blocks обычно −1. С PHP 7.4 dev — serial тома, ino — ID файла; это unsigned 64-bit значения и возможен выход за signed int (до 7.4 значения были иными). mode отражает readonly-атрибут одинаково для owner/group/other, не Windows ACL. На 32-bit возможны проблемы с файлами >2 ГБ; точность времени зависит от ФС. Не каждое поле имеет одинаковый смысл на разных ОС. Результат относится к моменту проверки и может кэшироваться; clearstatcache() обновляет stat-кэш, но не устраняет гонку между проверкой и действием. Некоторые обёртки поддерживают stat, другие нет.

Сравните: fstat, lstat, filesize, filemtime, clearstatcache. Полный выбор файловых операций.

fstatПолучить набор метаданных открытого файла.

PHP 4+ · standard

fstat(resource $stream): array|false

Получить набор метаданных открытого файла.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. fopen возвращает открытый поток (resource), а не содержимое файла. rb читает байты, w+b создаёт/очищает файл и разрешает чтение с записью. fclose освобождает поток. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". try выполняет попытку, catch обрабатывает указанный отказ, finally освобождает ресурс и не подавляет ошибку. throw new RuntimeException сообщает о сбое. [...] создаёт массив; $row["size"] читает поле по ключу; [$a, $b] = ... раскладывает список. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
streamОткрытый совместимый поток (resource). Закрытый или чужой ресурс в PHP 8 приводит к TypeError; возможности зависят от обёртки.
ВозвратМассив с 13 полями, продублированными числовыми и строковыми ключами; false при отказе.
ОтказПри отказе обычно false и E_WARNING: отсутствие файла, доступа, места или поддержки операции. Проверяйте === false; 0/пустая строка могут быть успехом. Неверный тип/значение аргумента в PHP 8 может дать TypeError/ValueError.
ВерсияPHP 4+
КлючиСодержание
0 / devИдентификатор устройства/тома.
1 / inoInode/идентификатор файла.
2 / modeТип и биты режима доступа.
3 / nlinkЧисло жёстких ссылок.
4 / uidЧисловой владелец.
5 / gidЧисловая группа.
6 / rdevТип устройства для специального файла.
7 / sizeРазмер в байтах.
8 / atimeПоследний доступ: Unix timestamp.
9 / mtimeИзменение содержимого: Unix timestamp.
10 / ctimeИзменение inode: Unix timestamp; не переносимая дата создания.
11 / blksizeРазмер блока ввода-вывода.
12 / blocksВыделенные блоки по 512 байт.

Тип в mode задаётся старшими битами: 0140000 socket, 0120000 link, 0100000 обычный файл, 0060000 block, 0040000 каталог, 0020000 char, 0010000 fifo. Нижние права — другая часть битовой маски.

Действие на учебных данных
  1. pickup.txt содержит «104: ready» и LF
  2. fstat читает метаданные
  3. size: 11 байт; текст не прочитан
Узнать размер открытого документа и затем прочитать егоСамостоятельный пример
<?php
declare(strict_types=1);

$stream = fopen(__DIR__ . '/pickup.txt', 'rb');
if ($stream === false) { throw new RuntimeException('Не открыть документ'); }
try {
    $info = fstat($stream);
    if ($info === false) { throw new RuntimeException('Не получить метаданные'); }
    echo 'Размер: ', $info['size'], " байт\n";
    echo 'Следующее чтение: ', fgets($stream);
} finally { fclose($stream); }
Ожидаемый результат
Размер: 11 байт
Следующее чтение: 104: ready

fstat получает сведения через уже открытый поток, не читает текст и не двигает позицию. Поэтому fgets всё ещё возвращает первую строку.

Проверить размер готового отчёта через тот же потокСамостоятельный пример
<?php
declare(strict_types=1);

$stream = fopen(__DIR__ . '/pickup.txt', 'w+b');
if ($stream === false) { throw new RuntimeException('Не создать отчёт'); }
try {
    fwrite($stream, "104: ready\n");
    fflush($stream);
    $info = fstat($stream);
    if ($info === false) { throw new RuntimeException('Не получить размер'); }
    rewind($stream);
    echo 'pickup.txt (', $info['size'], " байт):\n", stream_get_contents($stream);
} finally { fclose($stream); }
Ожидаемый результат
pickup.txt (11 байт):
104: ready

fflush передаёт буфер потока дальше, fstat читает текущие сведения открытого файла. Это не блокировка других процессов и не доказательство сохранности при отключении питания.

Применение и границы. Windows: uid/gid равны 0; blksize/blocks обычно −1. С PHP 7.4 dev — serial тома, ino — ID файла; это unsigned 64-bit значения и возможен выход за signed int (до 7.4 значения были иными). mode отражает readonly-атрибут одинаково для owner/group/other, не Windows ACL. На 32-bit возможны проблемы с файлами >2 ГБ; точность времени зависит от ФС. Не каждое поле имеет одинаковый смысл на разных ОС. Результат относится к моменту проверки и может кэшироваться; clearstatcache() обновляет stat-кэш, но не устраняет гонку между проверкой и действием. Для fstat нужен совместимый локальный файловый поток; удалённый HTTP-источник не получает такие гарантии.

Сравните: stat, lstat, filesize, filemtime, clearstatcache. Полный выбор файловых операций.

lstatПолучить набор метаданных самой ссылки или обычного файла.

PHP 4+ · standard

lstat(string $filename): array|false

Получить набор метаданных самой ссылки или обычного файла.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". try выполняет попытку, catch обрабатывает указанный отказ, finally освобождает ресурс и не подавляет ошибку. throw new RuntimeException сообщает о сбое. [...] создаёт массив; $row["size"] читает поле по ключу; [$a, $b] = ... раскладывает список. & оставляет биты маски, ~ инвертирует биты; число с ведущим 0 восьмеричное. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
filenameСтрока пути; относительный путь разрешается от текущего рабочего каталога (CWD), а не обязательно от папки этого исходника.
ВозвратМассив с 13 полями, продублированными числовыми и строковыми ключами; false при отказе.
ОтказПри отказе обычно false и E_WARNING: отсутствие файла, доступа, места или поддержки операции. Проверяйте === false; 0/пустая строка могут быть успехом. Неверный тип/значение аргумента в PHP 8 может дать TypeError/ValueError.
ВерсияPHP 4+
КлючиСодержание
0 / devИдентификатор устройства/тома.
1 / inoInode/идентификатор файла.
2 / modeТип и биты режима доступа.
3 / nlinkЧисло жёстких ссылок.
4 / uidЧисловой владелец.
5 / gidЧисловая группа.
6 / rdevТип устройства для специального файла.
7 / sizeРазмер в байтах.
8 / atimeПоследний доступ: Unix timestamp.
9 / mtimeИзменение содержимого: Unix timestamp.
10 / ctimeИзменение inode: Unix timestamp; не переносимая дата создания.
11 / blksizeРазмер блока ввода-вывода.
12 / blocksВыделенные блоки по 512 байт.

Тип в mode задаётся старшими битами: 0140000 socket, 0120000 link, 0100000 обычный файл, 0060000 block, 0040000 каталог, 0020000 char, 0010000 fifo. Нижние права — другая часть битовой маски.

Действие на учебных данных
  1. pickup.txt содержит «104: ready» и LF
  2. lstat читает метаданные
  3. size: 11 байт; текст не прочитан
Подготовить подпись документа без чтения его содержимогоСамостоятельный пример
<?php
declare(strict_types=1);

$path = __DIR__ . '/pickup.txt';
$info = lstat($path);
if ($info === false) { throw new RuntimeException('Не получить метаданные'); }
echo basename($path), ': ', $info['size'], " байт\n";
echo $info['size'] === 0 ? "Пустой документ\n" : "Документ содержит данные\n";
Ожидаемый результат
pickup.txt: 11 байт
Документ содержит данные

size — именованный ключ массива метаданных; то же значение доступно по числовому ключу 7. Для ясности используем имя. stat следует к цели символической ссылки, lstat описывает саму ссылку. Здесь fixture — обычный файл.

Сведения о ссылке, а не её целиПример для указанного окружения
<?php
$target = __DIR__ . '/target.txt';
$shortcut = __DIR__ . '/shortcut';
if (!symlink($target, $shortcut)) { throw new RuntimeException('Создание ссылки'); }
try {
    $linkInfo = lstat($shortcut);
    $fileInfo = stat($shortcut);
    if ($linkInfo === false || $fileInfo === false) { throw new RuntimeException('Метаданные'); }
    echo ($linkInfo['mode'] & 0170000) === 0120000 ? 'Ссылка' : 'Другой тип';
    echo "\n", $fileInfo['size'], "\n";
} finally { unlink($shortcut); }

Контекстный пример: POSIX либо Windows с разрешённым созданием symlink. Ожидаются подпись «Ссылка» и размер цели 4; здесь только lint. Маска & оставляет биты типа; 0 в начале числа обозначает восьмеричную запись.

Применение и границы. Windows: uid/gid равны 0; blksize/blocks обычно −1. С PHP 7.4 dev — serial тома, ino — ID файла; это unsigned 64-bit значения и возможен выход за signed int (до 7.4 значения были иными). mode отражает readonly-атрибут одинаково для owner/group/other, не Windows ACL. На 32-bit возможны проблемы с файлами >2 ГБ; точность времени зависит от ФС. Не каждое поле имеет одинаковый смысл на разных ОС. Результат относится к моменту проверки и может кэшироваться; clearstatcache() обновляет stat-кэш, но не устраняет гонку между проверкой и действием. Некоторые обёртки поддерживают stat, другие нет.

Сравните: stat, fstat, filesize, filemtime, clearstatcache. Полный выбор файловых операций.

filemtimeПоказать время последнего изменения содержимого отчёта.

PHP 4+ · standard

filemtime(string $filename): int|false

Показать время последнего изменения содержимого отчёта.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
filenameСтрока пути; относительный путь разрешается от текущего рабочего каталога (CWD), а не обязательно от папки этого исходника.
ВозвратUnix timestamp (секунды) либо false.
ОтказПри отказе обычно false и E_WARNING: отсутствие файла, доступа, места или поддержки операции. Проверяйте === false; 0/пустая строка могут быть успехом. Неверный тип/значение аргумента в PHP 8 может дать TypeError/ValueError.
ВерсияPHP 4+
Путь данных в первом опыте
  1. Существующий report.txt
  2. Читаем поле mtime
  3. Получаем метку времени; форматируем отдельно
Прочитать известный учебный timestampСамостоятельный пример
<?php
$path = __DIR__ . '/report.txt';
if (!touch($path, 1600000000, 1600000060)) { throw new RuntimeException('Время'); }
clearstatcache();
$time = filemtime($path);
if ($time === false) { throw new RuntimeException('Метаданные'); }
echo gmdate('Y-m-d H:i:s', $time), "\n";
Ожидаемый результат
2020-09-13 12:26:40

touch задаёт учебные mtime/atime; gmdate форматирует в UTC, не зависит от локальной зоны.

Сравнить метку с контрольным моментомСамостоятельный пример
<?php
$path = __DIR__ . '/report.txt';
touch($path, 1600000000, 1600000060);
clearstatcache();
$stamp = filemtime($path);
if ($stamp === false) { throw new RuntimeException('Нет метки'); }
echo $stamp < 1600000100 ? 'Старше контрольного момента' : 'Новее';
echo "\n";
Ожидаемый результат
Старше контрольного момента

Контрольный момент передаётся правилом задачи. Для atime это лишь диагностический фильтр, не основание безусловно удалять «неиспользуемые» файлы.

Применение и границы. Когда менялись блоки данных; подходит для «Обновлено». Это не всегда момент появления файла. Результат относится к моменту проверки и может кэшироваться; clearstatcache() обновляет stat-кэш, но не устраняет гонку между проверкой и действием. Точность и частота обновления зависят от ФС; некоторые wrappers поддерживают stat, не все.

Сравните: stat, touch, filectime. Полный выбор файловых операций.

fileatimeИсследовать время доступа к файлу.

PHP 4+ · standard

fileatime(string $filename): int|false

Исследовать время доступа к файлу.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
filenameСтрока пути; относительный путь разрешается от текущего рабочего каталога (CWD), а не обязательно от папки этого исходника.
ВозвратUnix timestamp (секунды) либо false.
ОтказПри отказе обычно false и E_WARNING: отсутствие файла, доступа, места или поддержки операции. Проверяйте === false; 0/пустая строка могут быть успехом. Неверный тип/значение аргумента в PHP 8 может дать TypeError/ValueError.
ВерсияPHP 4+
Путь данных в первом опыте
  1. Существующий report.txt
  2. Читаем поле atime
  3. Получаем метку времени; форматируем отдельно
Прочитать известный учебный timestampСамостоятельный пример
<?php
$path = __DIR__ . '/report.txt';
if (!touch($path, 1600000000, 1600000060)) { throw new RuntimeException('Время'); }
clearstatcache();
$time = fileatime($path);
if ($time === false) { throw new RuntimeException('Метаданные'); }
echo gmdate('Y-m-d H:i:s', $time), "\n";
Ожидаемый результат
2020-09-13 12:27:40

touch задаёт учебные mtime/atime; gmdate форматирует в UTC, не зависит от локальной зоны.

Сравнить метку с контрольным моментомСамостоятельный пример
<?php
$path = __DIR__ . '/report.txt';
touch($path, 1600000000, 1600000060);
clearstatcache();
$stamp = fileatime($path);
if ($stamp === false) { throw new RuntimeException('Нет метки'); }
echo $stamp < 1600000100 ? 'Старше контрольного момента' : 'Новее';
echo "\n";
Ожидаемый результат
Старше контрольного момента

Контрольный момент передаётся правилом задачи. Для atime это лишь диагностический фильтр, не основание безусловно удалять «неиспользуемые» файлы.

Применение и границы. Предполагаемое время чтения данных. noatime/relatime и политика ФС могут отключать/откладывать обновление; не журнал посещений. Результат относится к моменту проверки и может кэшироваться; clearstatcache() обновляет stat-кэш, но не устраняет гонку между проверкой и действием. Точность и частота обновления зависят от ФС; некоторые wrappers поддерживают stat, не все.

Сравните: stat, touch, filemtime. Полный выбор файловых операций.

filectimeРазличать изменение inode и изменение содержимого.

PHP 4+ · standard

filectime(string $filename): int|false

Различать изменение inode и изменение содержимого.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". [...] создаёт массив; $row["size"] читает поле по ключу; [$a, $b] = ... раскладывает список. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
filenameСтрока пути; относительный путь разрешается от текущего рабочего каталога (CWD), а не обязательно от папки этого исходника.
ВозвратUnix timestamp (секунды) либо false.
ОтказПри отказе обычно false и E_WARNING: отсутствие файла, доступа, места или поддержки операции. Проверяйте === false; 0/пустая строка могут быть успехом. Неверный тип/значение аргумента в PHP 8 может дать TypeError/ValueError.
ВерсияPHP 4+
Путь данных в первом опыте
  1. Существующий report.txt
  2. Читаем поле ctime
  3. Получаем метку времени; форматируем отдельно
Метка inode доступна как timestampСамостоятельный пример
<?php
$stamp = filectime(__DIR__ . '/report.txt');
if ($stamp === false) { throw new RuntimeException('Нет метки'); }
echo get_debug_type($stamp), "\n";
var_dump($stamp > 0);
Ожидаемый результат
int
bool(true)

Точное значение меняется при создании fixture, поэтому выводим тип и наличие положительной метки; не выдаём его за постоянное время.

Хранить время создания записи самостоятельноСамостоятельный пример
<?php
$record = ['created_at' => '2026-10-12T09:00:00Z', 'path' => __DIR__ . '/report.txt'];
$inodeChanged = filectime($record['path']);
if ($inodeChanged === false) { throw new RuntimeException('Нет метки'); }
echo $record['created_at'], "\n";
echo 'Метка файловой системы получена отдельно', "\n";
Ожидаемый результат
2026-10-12T09:00:00Z
Метка файловой системы получена отдельно

Дата создания бизнес-записи принадлежит БД/метаданным приложения. Копирование, развёртывание и изменение прав не должны незаметно переписывать её смысл.

Применение и границы. На Unix меняется при изменении прав/владельца/группы/метаданных. ctime не означает creation time; на Windows платформа может связывать его с созданием, это не переносимый договор. Результат относится к моменту проверки и может кэшироваться; clearstatcache() обновляет stat-кэш, но не устраняет гонку между проверкой и действием. Точность и частота обновления зависят от ФС; некоторые wrappers поддерживают stat, не все.

Сравните: stat, touch, filemtime. Полный выбор файловых операций.

filesizeПроверить размер небольшого файла до обработки или показать число байтов.

PHP 4+ · standard

filesize(string $filename): int|false

Проверить размер небольшого файла до обработки или показать число байтов.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
filenameСтрока пути; относительный путь разрешается от текущего рабочего каталога (CWD), а не обязательно от папки этого исходника.
ВозвратРазмер в байтах; пустой файл даёт 0, ошибка — false.
ОтказПри отказе обычно false и E_WARNING: отсутствие файла, доступа, места или поддержки операции. Проверяйте === false; 0/пустая строка могут быть успехом. Неверный тип/значение аргумента в PHP 8 может дать TypeError/ValueError.
ВерсияPHP 4+
Путь данных в первом опыте
  1. Файл содержит UTF-8 Чай
  2. Три буквы занимают 6 байтов
  3. filesize возвращает 6
Байты не равны символамСамостоятельный пример
<?php
echo filesize(__DIR__ . '/tea.txt'), "\n";
var_dump(filesize(__DIR__ . '/empty.txt'));
Ожидаемый результат
6
int(0)

0 — успешный размер пустого файла, а не отказ. Русский UTF-8 текст содержит несколько байтов на символ.

Ограничение размера учебного импортаСамостоятельный пример
<?php
$path = __DIR__ . '/import.txt';
$size = filesize($path);
if ($size === false) { throw new RuntimeException('Размер недоступен'); }
echo $size <= 1024 ? 'В пределах 1 КиБ' : 'Слишком большой';
echo "\n";
Ожидаемый результат
В пределах 1 КиБ

Предварительная проверка полезна для интерфейса, но файл может вырасти. Реальное чтение также ограничивают; нельзя считать HTTP длину универсально доступной через filesize.

Применение и границы. Результат относится к моменту проверки и может кэшироваться; clearstatcache() обновляет stat-кэш, но не устраняет гонку между проверкой и действием. На 32-bit файлы >2 ГБ могут дать непригодный результат. Размер каталога не равен сумме его файлов; для рекурсии нужен отдельный обход. Не загружайте файл целиком только ради подсчёта размера.

Сравните: stat, file_get_contents, fread. Полный выбор файловых операций.

filetypeУзнать вид записи файловой системы, не MIME содержимого.

PHP 4+ · standard

filetype(string $filename): string|false

Узнать вид записи файловой системы, не MIME содержимого.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. function name($x) { ... } объявляет повторяемое действие; return отдаёт результат вызову. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
filenameСтрока пути; относительный путь разрешается от текущего рабочего каталога (CWD), а не обязательно от папки этого исходника.
ВозвратОдна из строк fifo, char, dir, block, link, file, socket, unknown; false при отказе.
ОтказПри неудаче возможны E_WARNING; страница также отмечает E_NOTICE при невозможности stat/неизвестном типе. Обрабатывайте false, не текст диагностики.
ВерсияPHP 4+
Путь данных в первом опыте
  1. report.txt — обычный файл
  2. filetype
  3. Строка file
Файл и его каталогСамостоятельный пример
<?php
echo filetype(__DIR__ . '/report.txt'), "\n";
echo filetype(__DIR__), "\n";
Ожидаемый результат
file
dir

Для обычного текста и PHP-скрипта ответ одинаковый file: это не проверка безопасности содержимого.

Прочитать обычный файл и пропустить каталогСамостоятельный пример
<?php
declare(strict_types=1);

foreach (['report.txt', 'archive'] as $name) {
    $path = __DIR__ . '/' . $name;
    if (filetype($path) !== 'file') {
        echo 'Пропущен каталог: ', $name, "\n";
        continue;
    }
    echo 'Документ ', $name, ': ', file_get_contents($path);
}
Ожидаемый результат
Документ report.txt: 104: ready
Пропущен каталог: archive

Список здесь содержит только заранее известные обычный файл и каталог. filetype определяет вид записи файловой системы, а не MIME. Проверка не отменяет возможный отказ чтения и подмену цели в общей изменяемой папке.

Применение и границы. Результат относится к моменту проверки и может кэшироваться; clearstatcache() обновляет stat-кэш, но не устраняет гонку между проверкой и действием. link обозначает символическую ссылку; для решения «обычный файл по конечной цели» есть is_file. MIME проверяется отдельно, например через fileinfo. Не создавайте устройства/fifo для простого импорта.

Сравните: is_file, is_dir, is_link, lstat. Полный выбор файловых операций.

fileownerПолучить числовой ID владельца для диагностики доступа.

PHP 4+ · standard

fileowner(string $filename): int|false

Получить числовой ID владельца для диагностики доступа.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". try выполняет попытку, catch обрабатывает указанный отказ, finally освобождает ресурс и не подавляет ошибку. throw new RuntimeException сообщает о сбое. [...] создаёт массив; $row["size"] читает поле по ключу; [$a, $b] = ... раскладывает список. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
filenameСтрока пути; относительный путь разрешается от текущего рабочего каталога (CWD), а не обязательно от папки этого исходника.
ВозвратЧисловой ID, а не имя; false при отказе. На Windows возвращается 0, что не означает Unix root.
ОтказПри отказе обычно false и E_WARNING: отсутствие файла, доступа, места или поддержки операции. Проверяйте === false; 0/пустая строка могут быть успехом. Неверный тип/значение аргумента в PHP 8 может дать TypeError/ValueError.
ВерсияPHP 4+
Путь данных в первом опыте
  1. Собственный report.txt
  2. Запрашиваем uid
  3. Получаем числовую метку ОС
Проверить тип результата и общую принадлежностьСамостоятельный пример
<?php
$first = fileowner(__DIR__ . '/a.txt');
$second = fileowner(__DIR__ . '/b.txt');
if ($first === false || $second === false) { throw new RuntimeException('ID недоступен'); }
echo get_debug_type($first), "\n";
var_dump($first === $second);
Ожидаемый результат
int
bool(true)

Два fixture созданы одним пользователем в одной папке; вывод подтверждает общий ID, не жёстко зашитый UID конкретной машины.

Получить человекочитаемое имя в POSIX-окруженииПример для указанного окружения
<?php
$id = fileowner(__DIR__ . '/report.txt');
if ($id === false) { throw new RuntimeException('ID недоступен'); }
$entry = posix_getpwuid($id);
if ($entry === false) { throw new RuntimeException('Имя не найдено'); }
echo $entry['name'], "\n";

Требует Unix/POSIX extension и локальную учётную запись. В Windows проверен только синтаксис; конкретное имя зависит от системы.

Применение и границы. Результат относится к моменту проверки и может кэшироваться; clearstatcache() обновляет stat-кэш, но не устраняет гонку между проверкой и действием. UID/GID владельца файла не равен пользователю приложения из сессии. Веб-процесс работает под системной учётной записью сервера. ACL/группы и права прохода по каталогам также влияют на доступ.

Сравните: stat, filegroup, is_readable. Полный выбор файловых операций.

filegroupПолучить числовой ID группы для диагностики доступа.

PHP 4+ · standard

filegroup(string $filename): int|false

Получить числовой ID группы для диагностики доступа.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". try выполняет попытку, catch обрабатывает указанный отказ, finally освобождает ресурс и не подавляет ошибку. throw new RuntimeException сообщает о сбое. [...] создаёт массив; $row["size"] читает поле по ключу; [$a, $b] = ... раскладывает список. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
filenameСтрока пути; относительный путь разрешается от текущего рабочего каталога (CWD), а не обязательно от папки этого исходника.
ВозвратЧисловой ID, а не имя; false при отказе. На Windows возвращается 0, что не означает Unix root.
ОтказПри отказе обычно false и E_WARNING: отсутствие файла, доступа, места или поддержки операции. Проверяйте === false; 0/пустая строка могут быть успехом. Неверный тип/значение аргумента в PHP 8 может дать TypeError/ValueError.
ВерсияPHP 4+
Путь данных в первом опыте
  1. Собственный report.txt
  2. Запрашиваем gid
  3. Получаем числовую метку ОС
Проверить тип результата и общую принадлежностьСамостоятельный пример
<?php
$first = filegroup(__DIR__ . '/a.txt');
$second = filegroup(__DIR__ . '/b.txt');
if ($first === false || $second === false) { throw new RuntimeException('ID недоступен'); }
echo get_debug_type($first), "\n";
var_dump($first === $second);
Ожидаемый результат
int
bool(true)

Два fixture созданы одним пользователем в одной папке; вывод подтверждает общий ID, не жёстко зашитый UID конкретной машины.

Получить человекочитаемое имя в POSIX-окруженииПример для указанного окружения
<?php
$id = filegroup(__DIR__ . '/report.txt');
if ($id === false) { throw new RuntimeException('ID недоступен'); }
$entry = posix_getgrgid($id);
if ($entry === false) { throw new RuntimeException('Имя не найдено'); }
echo $entry['name'], "\n";

Требует Unix/POSIX extension и локальную учётную запись. В Windows проверен только синтаксис; конкретное имя зависит от системы.

Применение и границы. Результат относится к моменту проверки и может кэшироваться; clearstatcache() обновляет stat-кэш, но не устраняет гонку между проверкой и действием. UID/GID владельца файла не равен пользователю приложения из сессии. Веб-процесс работает под системной учётной записью сервера. ACL/группы и права прохода по каталогам также влияют на доступ.

Сравните: stat, fileowner, is_readable. Полный выбор файловых операций.

fileinodeПолучить файловый идентификатор и понять, что два жёстких имени могут вести к одному файлу.

PHP 4+ · standard

fileinode(string $filename): int|false

Получить файловый идентификатор и понять, что два жёстких имени могут вести к одному файлу.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". try выполняет попытку, catch обрабатывает указанный отказ, finally освобождает ресурс и не подавляет ошибку. throw new RuntimeException сообщает о сбое. [...] создаёт массив; $row["size"] читает поле по ключу; [$a, $b] = ... раскладывает список. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
filenameСтрока пути; относительный путь разрешается от текущего рабочего каталога (CWD), а не обязательно от папки этого исходника.
ВозвратЧисло inode/идентификатор файла; false при отказе.
ОтказПри отказе обычно false и E_WARNING: отсутствие файла, доступа, места или поддержки операции. Проверяйте === false; 0/пустая строка могут быть успехом. Неверный тип/значение аргумента в PHP 8 может дать TypeError/ValueError.
ВерсияPHP 4+
Путь конкретного документа
  1. pickup.txt и copy-name.txt — два имени одного файла
  2. Сравнение inode подтверждает общую файловую запись
  3. Запись через copy-name.txt видна через pickup.txt
Два имени ведут к одному содержимомуСамостоятельный пример
<?php
declare(strict_types=1);

$original = __DIR__ . '/pickup.txt';
$alias = __DIR__ . '/copy-name.txt';
if (!link($original, $alias)) { throw new RuntimeException('Не создать второе имя'); }
try {
    echo fileinode($original) === fileinode($alias)
        ? "Один файл под двумя именами.\n" : "Разные файловые записи.\n";
    file_put_contents($alias, "104: выдан\n");
    echo 'Через исходное имя: ', file_get_contents($original);
} finally { unlink($alias); }
Ожидаемый результат
Один файл под двумя именами.
Через исходное имя: 104: выдан

Hard link не копирует содержимое. Изменение через второе имя видно через первое. Сравнение inode имеет смысл на одном устройстве; удаление второго имени не удаляет первое. Опыт требует поддержку hard link на локальной ФС.

Составной идентификатор для локального сравненияСамостоятельный пример
<?php
$path = __DIR__ . '/a.txt';
$info = stat($path);
$inode = fileinode($path);
if ($info === false || $inode === false) { throw new RuntimeException('Метаданные'); }
$identity = ['device' => $info['dev'], 'inode' => $inode];
echo implode(', ', array_keys($identity)), "\n";
Ожидаемый результат
device, inode

Inode без устройства может совпасть на разных файловых системах. Это локальный диагностический ключ, не вечный ID документа.

Применение и границы. Результат относится к моменту проверки и может кэшироваться; clearstatcache() обновляет stat-кэш, но не устраняет гонку между проверкой и действием. Идентификаторы могут переиспользоваться после удаления. На Windows до PHP 7.4 inode всегда был 0, теперь это 64-битный ID с возможным переполнением signed int. Сравнение путей не заменяется одним inode без учёта тома.

Сравните: stat, link, lstat. Полный выбор файловых операций.

filepermsИсследовать биты типа и прав доступа, не смешивая их с итоговой проверкой доступа процесса.

PHP 4+ · standard

fileperms(string $filename): int|false

Исследовать биты типа и прав доступа, не смешивая их с итоговой проверкой доступа процесса.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". & оставляет биты маски, ~ инвертирует биты; число с ведущим 0 восьмеричное. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
filenameСтрока пути; относительный путь разрешается от текущего рабочего каталога (CWD), а не обязательно от папки этого исходника.
ВозвратЧисловой mode: младшие биты доступа и обычно старшие биты типа. false при отказе.
ОтказПри отказе обычно false и E_WARNING: отсутствие файла, доступа, места или поддержки операции. Проверяйте === false; 0/пустая строка могут быть успехом. Неверный тип/значение аргумента в PHP 8 может дать TypeError/ValueError.
ВерсияPHP 4+
Путь конкретного документа
  1. pickup.txt — обычный файл
  2. 0170000 выделяет биты типа
  3. 0100000 даёт подпись «обычный файл»
Подписать тип, выделенный из битов режимаСамостоятельный пример
<?php
declare(strict_types=1);

$mode = fileperms(__DIR__ . '/pickup.txt');
if ($mode === false) { throw new RuntimeException('Режим недоступен'); }
$type = $mode & 0170000;
echo $type === 0100000 ? "pickup.txt: обычный файл\n" : "pickup.txt: другой тип\n";
Ожидаемый результат
pickup.txt: обычный файл

& оставляет только биты типа; ведущий 0 означает восьмеричное число. Остальные биты относятся к правам. На Windows этот mode не является полным описанием ACL.

Показать POSIX-права созданного fixtureПример для указанного окружения
<?php
$path = __DIR__ . '/report.txt';
if (!chmod($path, 0640)) { throw new RuntimeException('Права'); }
clearstatcache();
$mode = fileperms($path);
if ($mode === false) { throw new RuntimeException('Режим'); }
printf("%04o\n", $mode & 07777);

Контекст POSIX: ожидается 0640. На Windows изменение POSIX-политики здесь не исполнялось; ACL и readonly устроены иначе. printf %o форматирует восьмерично.

Применение и границы. На POSIX 0400/0200/0100 — r/w/x владельца, 0040/0020/0010 группы, 0004/0002/0001 остальных; 04000 setuid, 02000 setgid, 01000 sticky. Для каталога x означает проход. Windows: uid/gid равны 0; blksize/blocks обычно −1. С PHP 7.4 dev — serial тома, ino — ID файла; это unsigned 64-bit значения и возможен выход за signed int (до 7.4 значения были иными). mode отражает readonly-атрибут одинаково для owner/group/other, не Windows ACL. На 32-bit возможны проблемы с файлами >2 ГБ; точность времени зависит от ФС. Не каждое поле имеет одинаковый смысл на разных ОС. Результат относится к моменту проверки и может кэшироваться; clearstatcache() обновляет stat-кэш, но не устраняет гонку между проверкой и действием.

Сравните: chmod, stat, is_readable, is_writable. Полный выбор файловых операций.

file_existsПроверить наличие файла или каталога.

PHP 4+ · standard

file_exists(string $filename): bool

Проверить наличие файла или каталога.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. function name($x) { ... } объявляет повторяемое действие; return отдаёт результат вызову. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
filenameСтрока пути; относительный путь разрешается от текущего рабочего каталога (CWD), а не обязательно от папки этого исходника.
Возвратtrue для существующей цели, false иначе. Битая символическая ссылка даёт false.
Отказfalse означает отрицательный результат или отказ; при части ошибок пути/прав возможен E_WARNING. Это не детализированный отчёт причины.
ВерсияPHP 4+
Действие на учебных данных
  1. pickup.txt существует, missing.txt отсутствует
  2. file_exists выбирает подходящий путь
  3. Памятка прочитана; для missing показано отсутствие
Выбрать доступные памятки для сотрудникаСамостоятельный пример
<?php
declare(strict_types=1);

foreach (['pickup.txt', 'missing.txt'] as $name) {
    $path = __DIR__ . '/' . $name;
    if (file_exists($path) && is_file($path)) {
        echo 'Памятка ', $name, ': ', file_get_contents($path);
    } else {
        echo 'Нет подходящей памятки: ', $name, "\n";
    }
}
Ожидаемый результат
Памятка pickup.txt: 104: ready
Нет подходящей памятки: missing.txt

file_exists даёт предварительный ответ о пути. Наша папка фиксирована и не меняется во время опыта; в рабочем приложении отдельно проверяют результат file_get_contents, потому что состояние может измениться.

Каталог с документами не является документомСамостоятельный пример
<?php
declare(strict_types=1);

foreach (['pickup.txt', 'archive'] as $name) {
    $path = __DIR__ . '/' . $name;
    $accepted = file_exists($path) && is_file($path);
    echo $name, $accepted ? ": можно предложить как файл\n" : ": не предлагать как файл\n";
}
Ожидаемый результат
pickup.txt: можно предложить как файл
archive: не предлагать как файл

Условие требует обычный файл, даже если существование или чтение каталога также разрешено. Это классификация, не авторизация пользователя и не резервирование доступа.

Применение и границы. Проверка не утверждает, что цель обычный файл или доступна для чтения. Windows UNC-путь использует //computer/share/file либо \\computer\share\file; проверка описана через real UID/GID. Результат относится к моменту проверки и может кэшироваться; clearstatcache() обновляет stat-кэш, но не устраняет гонку между проверкой и действием. Некоторые wrappers умеют stat; это не общий способ проверить HTTP URL. Это не разрешение доступа и не защита от подмены пути. Пользователь выбирает разрешённый идентификатор, приложение задаёт путь; права ОС и проверки самой операции остаются обязательными.

Сравните: is_file, is_dir, is_readable, is_writable, clearstatcache. Полный выбор файловых операций.

is_dirОтличить каталог от обычного файла.

PHP 4+ · standard

is_dir(string $filename): bool

Отличить каталог от обычного файла.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. function name($x) { ... } объявляет повторяемое действие; return отдаёт результат вызову. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
filenameСтрока пути; относительный путь разрешается от текущего рабочего каталога (CWD), а не обязательно от папки этого исходника.
Возвратtrue только для существующего каталога; ссылки разрешаются к цели.
Отказfalse означает отрицательный результат или отказ; при части ошибок пути/прав возможен E_WARNING. Это не детализированный отчёт причины.
ВерсияPHP 4+
Путь данных в первом опыте
  1. Известный путь в учебной папке
  2. Проверяем is_dir
  3. Получаем bool, не содержимое файла
Разделить папки и документыСамостоятельный пример
<?php
declare(strict_types=1);

foreach (['pickup.txt', 'archive'] as $name) {
    echo $name, is_dir(__DIR__ . '/' . $name) ? ": папка\n" : ": документ\n";
}
Ожидаемый результат
pickup.txt: документ
archive: папка

Вход — два известных существующих пути. Для произвольного пути false ещё может означать отсутствие или отказ; подпись «документ» только по отрицанию is_dir в общем случае неверна.

Создать учебную папку выдачи и сохранить в неё памяткуСамостоятельный пример
<?php
declare(strict_types=1);

$folder = __DIR__ . '/pickup';
if (!is_dir($folder) && !mkdir($folder)) {
    throw new RuntimeException('Не создать папку выдачи');
}
$path = $folder . '/104.txt';
$text = "Выдать две дрели\n";
if (file_put_contents($path, $text) !== strlen($text)) { throw new RuntimeException('Не записать памятку'); }
echo 'pickup/104.txt: ', file_get_contents($path);
Ожидаемый результат
pickup/104.txt: Выдать две дрели

mkdir создаёт только каталог этого отдельного примера. В общем каталоге конкурентный процесс может создать его между проверкой и mkdir; серверная политика обработки warning и повторной проверки нужна отдельно.

Применение и границы. CWD влияет на относительный путь. open_basedir может дополнительно ограничивать доступ; ссылка на каталог также даст true. Результат относится к моменту проверки и может кэшироваться; clearstatcache() обновляет stat-кэш, но не устраняет гонку между проверкой и действием. Некоторые wrappers умеют stat; это не общий способ проверить HTTP URL. Это не разрешение доступа и не защита от подмены пути. Пользователь выбирает разрешённый идентификатор, приложение задаёт путь; права ОС и проверки самой операции остаются обязательными.

Сравните: file_exists, is_file, is_readable, is_writable, clearstatcache. Полный выбор файловых операций.

is_fileОтобрать только обычные файлы по конечной цели.

PHP 4+ · standard

is_file(string $filename): bool

Отобрать только обычные файлы по конечной цели.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. function name($x) { ... } объявляет повторяемое действие; return отдаёт результат вызову. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
filenameСтрока пути; относительный путь разрешается от текущего рабочего каталога (CWD), а не обязательно от папки этого исходника.
Возвратtrue для существующего обычного файла, false для каталога/отсутствия/другого типа.
Отказfalse означает отрицательный результат или отказ; при части ошибок пути/прав возможен E_WARNING. Это не детализированный отчёт причины.
ВерсияPHP 4+
Действие на учебных данных
  1. pickup.txt существует, missing.txt отсутствует
  2. is_file выбирает подходящий путь
  3. Памятка прочитана; для missing показано отсутствие
Выбрать доступные памятки для сотрудникаСамостоятельный пример
<?php
declare(strict_types=1);

foreach (['pickup.txt', 'missing.txt'] as $name) {
    $path = __DIR__ . '/' . $name;
    if (is_file($path)) {
        echo 'Памятка ', $name, ': ', file_get_contents($path);
    } else {
        echo 'Нет подходящей памятки: ', $name, "\n";
    }
}
Ожидаемый результат
Памятка pickup.txt: 104: ready
Нет подходящей памятки: missing.txt

is_file даёт предварительный ответ о пути. Наша папка фиксирована и не меняется во время опыта; в рабочем приложении отдельно проверяют результат file_get_contents, потому что состояние может измениться.

Каталог с документами не является документомСамостоятельный пример
<?php
declare(strict_types=1);

foreach (['pickup.txt', 'archive'] as $name) {
    $path = __DIR__ . '/' . $name;
    $accepted = is_file($path) && is_file($path);
    echo $name, $accepted ? ": можно предложить как файл\n" : ": не предлагать как файл\n";
}
Ожидаемый результат
pickup.txt: можно предложить как файл
archive: не предлагать как файл

Условие требует обычный файл, даже если существование или чтение каталога также разрешено. Это классификация, не авторизация пользователя и не резервирование доступа.

Применение и границы. Символическая ссылка на обычный файл даст true. Для запрета самой ссылки дополнительно проверяют is_link, но две проверки сами по себе не устраняют гонку. Результат относится к моменту проверки и может кэшироваться; clearstatcache() обновляет stat-кэш, но не устраняет гонку между проверкой и действием. Некоторые wrappers умеют stat; это не общий способ проверить HTTP URL. Это не разрешение доступа и не защита от подмены пути. Пользователь выбирает разрешённый идентификатор, приложение задаёт путь; права ОС и проверки самой операции остаются обязательными.

Сравните: file_exists, is_dir, is_readable, is_writable, clearstatcache. Полный выбор файловых операций.

is_readableПредварительно проверить возможность чтения существующего пути.

PHP 4+ · standard

is_readable(string $filename): bool

Предварительно проверить возможность чтения существующего пути.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. function name($x) { ... } объявляет повторяемое действие; return отдаёт результат вызову. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
filenameСтрока пути; относительный путь разрешается от текущего рабочего каталога (CWD), а не обязательно от папки этого исходника.
Возвратtrue для существующего читаемого файла или каталога; false иначе.
Отказfalse означает отрицательный результат или отказ; при части ошибок пути/прав возможен E_WARNING. Это не детализированный отчёт причины.
ВерсияPHP 4+
Действие на учебных данных
  1. pickup.txt существует, missing.txt отсутствует
  2. is_readable выбирает подходящий путь
  3. Памятка прочитана; для missing показано отсутствие
Выбрать доступные памятки для сотрудникаСамостоятельный пример
<?php
declare(strict_types=1);

foreach (['pickup.txt', 'missing.txt'] as $name) {
    $path = __DIR__ . '/' . $name;
    if (is_readable($path) && is_file($path)) {
        echo 'Памятка ', $name, ': ', file_get_contents($path);
    } else {
        echo 'Нет подходящей памятки: ', $name, "\n";
    }
}
Ожидаемый результат
Памятка pickup.txt: 104: ready
Нет подходящей памятки: missing.txt

is_readable даёт предварительный ответ о пути. Наша папка фиксирована и не меняется во время опыта; в рабочем приложении отдельно проверяют результат file_get_contents, потому что состояние может измениться.

Каталог с документами не является документомСамостоятельный пример
<?php
declare(strict_types=1);

foreach (['pickup.txt', 'archive'] as $name) {
    $path = __DIR__ . '/' . $name;
    $accepted = is_readable($path) && is_file($path);
    echo $name, $accepted ? ": можно предложить как файл\n" : ": не предлагать как файл\n";
}
Ожидаемый результат
pickup.txt: можно предложить как файл
archive: не предлагать как файл

Условие требует обычный файл, даже если существование или чтение каталога также разрешено. Это классификация, не авторизация пользователя и не резервирование доступа.

Применение и границы. На POSIX проверяется real UID/GID, не effective. Пользователь ОС веб-сервера может отличаться от CLI. Читаемый каталог не является файлом. Результат относится к моменту проверки и может кэшироваться; clearstatcache() обновляет stat-кэш, но не устраняет гонку между проверкой и действием. Некоторые wrappers умеют stat; это не общий способ проверить HTTP URL. Это не разрешение доступа и не защита от подмены пути. Пользователь выбирает разрешённый идентификатор, приложение задаёт путь; права ОС и проверки самой операции остаются обязательными.

Сравните: file_exists, is_file, is_dir, is_writable, clearstatcache. Полный выбор файловых операций.

is_writableПроверить запись в существующий файл либо каталог назначения.

PHP 4+ · standard

is_writable(string $filename): bool

Проверить запись в существующий файл либо каталог назначения.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
filenameСтрока пути; относительный путь разрешается от текущего рабочего каталога (CWD), а не обязательно от папки этого исходника.
Возвратtrue для существующего доступного для записи пути, false иначе.
Отказfalse означает отрицательный результат или отказ; при части ошибок пути/прав возможен E_WARNING. Это не детализированный отчёт причины.
ВерсияPHP 4+
Путь данных в первом опыте
  1. Известный путь в учебной папке
  2. Проверяем is_writable
  3. Получаем bool, не содержимое файла
Отличить будущий файл от доступного каталогаСамостоятельный пример
<?php
declare(strict_types=1);

$future = __DIR__ . '/pickup.txt';
echo is_writable($future) ? "Файл допускает запись\n" : "Будущий файл ещё не существует\n";
echo is_writable(dirname($future)) ? "Родитель допускает создание файла\n" : "Нет доступа к родителю\n";
Ожидаемый результат
Будущий файл ещё не существует
Родитель допускает создание файла

Проверяется существующая папка. Положительный ответ не резервирует место и права: фактическая запись всё равно проверяется. is_writeable — псевдоним is_writable с тем же поведением.

После предварительной проверки действительно записать памяткуСамостоятельный пример
<?php
declare(strict_types=1);

$folder = __DIR__;
if (!is_writable($folder)) { throw new RuntimeException('Нет доступа к учебной папке'); }
$path = $folder . '/pickup.txt';
$text = "Заказ 104 готов\n";
if (file_put_contents($path, $text) !== strlen($text)) { throw new RuntimeException('Запись не завершена'); }
echo file_get_contents($path);
Ожидаемый результат
Заказ 104 готов

Проверка помогает сформулировать раннее сообщение, а проверка записи подтверждает результат. Путь задан приложением; имя из запроса сюда не подставляется.

Применение и границы. Для будущего файла проверяют родительский каталог, но успешное создание всё равно может сорваться: права, квота, место, гонка. Существующий файл и право создать новый — разные проверки. Результат относится к моменту проверки и может кэшироваться; clearstatcache() обновляет stat-кэш, но не устраняет гонку между проверкой и действием. Некоторые wrappers умеют stat; это не общий способ проверить HTTP URL. Это не разрешение доступа и не защита от подмены пути. Пользователь выбирает разрешённый идентификатор, приложение задаёт путь; права ОС и проверки самой операции остаются обязательными.

Сравните: file_exists, is_file, is_dir, is_readable, clearstatcache. Полный выбор файловых операций.

is_writeableРаспознать альтернативное имя is_writable в старом проекте.

PHP 4+ · standard

is_writeable(string $filename): bool

Распознать альтернативное имя is_writable в старом проекте.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
filenameСтрока пути; относительный путь разрешается от текущего рабочего каталога (CWD), а не обязательно от папки этого исходника.
ВозвратТот же bool-контракт, что у is_writable; самостоятельной другой проверки нет.
Отказfalse означает отрицательный результат или отказ; при части ошибок пути/прав возможен E_WARNING. Это не детализированный отчёт причины.
ВерсияPHP 4+
Путь данных в первом опыте
  1. Известный путь в учебной папке
  2. Проверяем is_writeable
  3. Получаем bool, не содержимое файла
Отличить будущий файл от доступного каталогаСамостоятельный пример
<?php
declare(strict_types=1);

$future = __DIR__ . '/pickup.txt';
echo is_writeable($future) ? "Файл допускает запись\n" : "Будущий файл ещё не существует\n";
echo is_writeable(dirname($future)) ? "Родитель допускает создание файла\n" : "Нет доступа к родителю\n";
Ожидаемый результат
Будущий файл ещё не существует
Родитель допускает создание файла

Проверяется существующая папка. Положительный ответ не резервирует место и права: фактическая запись всё равно проверяется. is_writeable — псевдоним is_writable с тем же поведением.

После предварительной проверки действительно записать памяткуСамостоятельный пример
<?php
declare(strict_types=1);

$folder = __DIR__;
if (!is_writeable($folder)) { throw new RuntimeException('Нет доступа к учебной папке'); }
$path = $folder . '/pickup.txt';
$text = "Заказ 104 готов\n";
if (file_put_contents($path, $text) !== strlen($text)) { throw new RuntimeException('Запись не завершена'); }
echo file_get_contents($path);
Ожидаемый результат
Заказ 104 готов

Проверка помогает сформулировать раннее сообщение, а проверка записи подтверждает результат. Путь задан приложением; имя из запроса сюда не подставляется.

Применение и границы. Alias не исправляет проблемы предшествующей проверки. В новом коде удобно последовательно использовать is_writable. Результат относится к моменту проверки и может кэшироваться; clearstatcache() обновляет stat-кэш, но не устраняет гонку между проверкой и действием. Некоторые wrappers умеют stat; это не общий способ проверить HTTP URL. Это не разрешение доступа и не защита от подмены пути. Пользователь выбирает разрешённый идентификатор, приложение задаёт путь; права ОС и проверки самой операции остаются обязательными.

Сравните: file_exists, is_file, is_dir, is_readable, is_writable, clearstatcache. Полный выбор файловых операций.

is_executableПредварительно узнать, считает ли ОС файл исполняемым.

PHP 4+ · standard

is_executable(string $filename): bool

Предварительно узнать, считает ли ОС файл исполняемым.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
filenameСтрока пути; относительный путь разрешается от текущего рабочего каталога (CWD), а не обязательно от папки этого исходника.
Возвратtrue для существующего исполняемого файла, false иначе/при отказе.
ОтказПри отказе обычно false и E_WARNING: отсутствие файла, доступа, места или поддержки операции. Проверяйте === false; 0/пустая строка могут быть успехом. Неверный тип/значение аргумента в PHP 8 может дать TypeError/ValueError.
ВерсияPHP 4+
Путь данных в первом опыте
  1. README.txt с обычным текстом
  2. Проверка исполнимости
  3. На учебном Windows окружении false
Текст не становится программой по содержимому командыСамостоятельный пример
<?php
var_dump(is_executable(__DIR__ . '/README.txt'));
var_dump(is_executable(__DIR__ . '/missing'));
Ожидаемый результат
bool(false)
bool(false)

Проверенный результат Windows. На POSIX x-бит может быть поставлен и тексту; факт исполнимости ещё не доказывает успешный запуск.

Проверить подготовленный локальный script на POSIXПример для указанного окружения
<?php
$path = __DIR__ . '/worker.sh';
if (!chmod($path, 0700)) { throw new RuntimeException('Права'); }
clearstatcache();
var_dump(is_executable($path));

POSIX-контекст: ожидается true после успешной смены режима; сам script не запускается. В Windows выполнен только lint.

Применение и границы. На POSIX важны исполняемые биты и доступ к пути. Windows с PHP 7.4 использует GetBinaryType, а .bat/.cmd оставлены исполняемыми для совместимости; PATHEXT не учитывается. Ранее хватало непустого .exe/.com. Это не разрешение запускать присланный пользователем файл. Результат относится к моменту проверки и может кэшироваться; clearstatcache() обновляет stat-кэш, но не устраняет гонку между проверкой и действием.

Сравните: fileperms, chmod, is_file. Полный выбор файловых операций.

disk_free_spaceУзнать доступное место файловой системы, содержащей каталог.

PHP 4.1+ · standard

disk_free_space(string $directory): float|false

Узнать доступное место файловой системы, содержащей каталог.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
directoryСуществующий локальный каталог нужного тома. Передача имени файла вместо каталога имеет неопределённое, платформенно зависимое поведение.
Возвратfloat — байты доступного пространства, false при неудаче.
ОтказПри отказе обычно false и E_WARNING: отсутствие файла, доступа, места или поддержки операции. Проверяйте === false; 0/пустая строка могут быть успехом. Неверный тип/значение аргумента в PHP 8 может дать TypeError/ValueError.
ВерсияPHP 4.1+
Путь данных в первом опыте
  1. Каталог текущего примера
  2. Запрос доступное место на его томе
  3. Получаем байты float, не размер каталога
Тип результата и проверка отказаСамостоятельный пример
<?php
$bytes = disk_free_space(__DIR__);
if ($bytes === false) { throw new RuntimeException('Объём недоступен'); }
echo get_debug_type($bytes), "\n";
var_dump($bytes >= 0);
Ожидаемый результат
float
bool(true)

Абсолютное число зависит от диска и текущей нагрузки; проверяем договор и не публикуем конфигурацию машины.

Диагностическое условие перед небольшим экспортомСамостоятельный пример
<?php
$bytes = disk_free_space(__DIR__);
if ($bytes === false) { throw new RuntimeException('Объём недоступен'); }
$plannedBytes = 1024;
echo $bytes >= $plannedBytes ? 'Объём больше учебного экспорта' : 'Объём меньше экспорта';
echo "\n";
Ожидаемый результат
Объём больше учебного экспорта

Результат подтверждён только для тестового тома. Проверка не резервирует место; квоты и параллельные записи могут привести к сбою фактической записи.

Применение и границы. Не работает для произвольного удалённого URL. Байты не равны МиБ: для представления делят на 1024², но сам результат уже float и не является произвольной точности целым. Для размера дерева нужен обход файлов.

Сравните: disk_total_space, filesize. Полный выбор файловых операций.

disk_total_spaceУзнать общий объём файловой системы, содержащей каталог.

PHP 4.1+ · standard

disk_total_space(string $directory): float|false

Узнать общий объём файловой системы, содержащей каталог.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
directoryСуществующий локальный каталог нужного тома. Передача имени файла вместо каталога имеет неопределённое, платформенно зависимое поведение.
Возвратfloat — байты всего тома, false при неудаче.
ОтказПри отказе обычно false и E_WARNING: отсутствие файла, доступа, места или поддержки операции. Проверяйте === false; 0/пустая строка могут быть успехом. Неверный тип/значение аргумента в PHP 8 может дать TypeError/ValueError.
ВерсияPHP 4.1+
Путь данных в первом опыте
  1. Каталог текущего примера
  2. Запрос общий объём на его томе
  3. Получаем байты float, не размер каталога
Тип результата и проверка отказаСамостоятельный пример
<?php
$bytes = disk_total_space(__DIR__);
if ($bytes === false) { throw new RuntimeException('Объём недоступен'); }
echo get_debug_type($bytes), "\n";
var_dump($bytes >= 0);
Ожидаемый результат
float
bool(true)

Абсолютное число зависит от диска и текущей нагрузки; проверяем договор и не публикуем конфигурацию машины.

Диагностическое условие перед небольшим экспортомСамостоятельный пример
<?php
$bytes = disk_total_space(__DIR__);
if ($bytes === false) { throw new RuntimeException('Объём недоступен'); }
$plannedBytes = 1024;
echo $bytes >= $plannedBytes ? 'Объём больше учебного экспорта' : 'Объём меньше экспорта';
echo "\n";
Ожидаемый результат
Объём больше учебного экспорта

Результат подтверждён только для тестового тома. Общий объём не показывает, осталось ли место: для решения о записи дополнительно нужен disk_free_space.

Применение и границы. Не работает для произвольного удалённого URL. Байты не равны МиБ: для представления делят на 1024², но сам результат уже float и не является произвольной точности целым. Для размера дерева нужен обход файлов.

Сравните: disk_free_space, filesize. Полный выбор файловых операций.

diskfreespaceАльтернативное имя disk_free_space: узнать доступное место.

PHP 4+ · standard

diskfreespace(string $directory): float|false

Альтернативное имя disk_free_space: узнать доступное место.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
directoryСуществующий локальный каталог нужного тома. Передача имени файла вместо каталога имеет неопределённое, платформенно зависимое поведение.
Возвратfloat — байты доступного пространства, false при неудаче.
ОтказПри отказе обычно false и E_WARNING: отсутствие файла, доступа, места или поддержки операции. Проверяйте === false; 0/пустая строка могут быть успехом. Неверный тип/значение аргумента в PHP 8 может дать TypeError/ValueError.
ВерсияPHP 4+
Путь данных в первом опыте
  1. Каталог текущего примера
  2. Запрос доступное место на его томе
  3. Получаем байты float, не размер каталога
Тип результата и проверка отказаСамостоятельный пример
<?php
$bytes = diskfreespace(__DIR__);
if ($bytes === false) { throw new RuntimeException('Объём недоступен'); }
echo get_debug_type($bytes), "\n";
var_dump($bytes >= 0);
Ожидаемый результат
float
bool(true)

Абсолютное число зависит от диска и текущей нагрузки; проверяем договор и не публикуем конфигурацию машины.

Диагностическое условие перед небольшим экспортомСамостоятельный пример
<?php
$bytes = diskfreespace(__DIR__);
if ($bytes === false) { throw new RuntimeException('Объём недоступен'); }
$plannedBytes = 1024;
echo $bytes >= $plannedBytes ? 'Объём больше учебного экспорта' : 'Объём меньше экспорта';
echo "\n";
Ожидаемый результат
Объём больше учебного экспорта

Результат подтверждён только для тестового тома. Проверка не резервирует место; квоты и параллельные записи могут привести к сбою фактической записи.

Применение и границы. Не работает для произвольного удалённого URL. Alias имеет тот же договор и не выполняет другую проверку. Байты не равны МиБ: для представления делят на 1024², но сам результат уже float и не является произвольной точности целым. Для размера дерева нужен обход файлов.

Сравните: disk_free_space, disk_total_space, filesize. Полный выбор файловых операций.

fcloseЗакрыть поток после последней операции и освободить файловый дескриптор.

PHP 4+ · standard

fclose(resource $stream): bool

Закрыть поток после последней операции и освободить файловый дескриптор.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. fopen возвращает открытый поток (resource), а не содержимое файла. rb читает байты, w+b создаёт/очищает файл и разрешает чтение с записью. fclose освобождает поток. try выполняет попытку, catch обрабатывает указанный отказ, finally освобождает ресурс и не подавляет ошибку. throw new RuntimeException сообщает о сбое. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
streamОткрытый совместимый поток (resource). Закрытый или чужой ресурс в PHP 8 приводит к TypeError; возможности зависят от обёртки.
Возвратtrue при успехе, false при отказе закрытия.
ОтказЗакрытый ресурс нельзя закрывать второй раз: в PHP 8 TypeError.
ВерсияPHP 4+
Путь конкретного документа
  1. pickup.txt содержит 104: ready
  2. fgets читает памятку
  3. fclose освобождает поток
  4. Новый file_get_contents читает сохранённый файл
Закрыть прочитанную памятку; файл остаётсяСамостоятельный пример
<?php
declare(strict_types=1);

$path = __DIR__ . '/pickup.txt';
$stream = fopen($path, 'rb');
if ($stream === false) { throw new RuntimeException('Не открыть памятку'); }
echo fgets($stream);
if (!fclose($stream)) { throw new RuntimeException('Не закрыть поток'); }
echo 'После закрытия файл читается заново: ', file_get_contents($path);
Ожидаемый результат
104: ready
После закрытия файл читается заново: 104: ready

fclose освобождает открытый канал, а не удаляет файл. file_get_contents открывает его отдельно заново. Старый $stream повторно не используем.

Закрыть импорт после некорректного JSONСамостоятельный пример
<?php
declare(strict_types=1);

$stream = fopen(__DIR__ . '/order.json', 'rb');
if ($stream === false) { throw new RuntimeException('Не открыть заказ'); }
try {
    try { json_decode(stream_get_contents($stream), true, 8, JSON_THROW_ON_ERROR); }
    finally { fclose($stream); }
} catch (JsonException $error) {
    echo "Заказ не импортирован: исправьте JSON.\n";
}
echo is_resource($stream) ? "Поток ещё открыт.\n" : "Файл закрыт после отказа.\n";
Ожидаемый результат
Заказ не импортирован: исправьте JSON.
Файл закрыт после отказа.

В order.json отсутствует значение после двоеточия. Исключение возникает при реальном разборе, finally закрывает поток, затем внешний catch объясняет действие человеку. Проверка ресурса здесь подтверждает именно путь очистки.

Применение и границы. Закрытие не означает бизнес-успех импорта и не обещает сохранность при отключении питания. Для процесса popen используйте pclose, чтобы получить статус дочерней программы.

Сравните: fopen, fflush, fsync, pclose. Полный выбор файловых операций.

fputsПсевдоним fwrite с теми же параметрами и правилами. Записать байты в открытый поток и узнать, сколько удалось записать.

PHP 4+; nullable length с PHP 8.0 · standard

fputs(resource $stream, string $data, ?int $length = null): int|false

Псевдоним fwrite с теми же параметрами и правилами. Записать байты в открытый поток и узнать, сколько удалось записать.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. fopen возвращает открытый поток (resource), а не содержимое файла. rb читает байты, w+b создаёт/очищает файл и разрешает чтение с записью. fclose освобождает поток. function name($x) { ... } объявляет повторяемое действие; return отдаёт результат вызову. while (условие) повторяет блок, пока условие истинно; после чтения важно различать конец и ошибку. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". try выполняет попытку, catch обрабатывает указанный отказ, finally освобождает ресурс и не подавляет ошибку. throw new RuntimeException сообщает о сбое. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
streamОткрытый совместимый поток (resource). Закрытый или чужой ресурс в PHP 8 приводит к TypeError; возможности зависят от обёртки. Должен разрешать запись.
dataСтрока байтов; перевод строк добавляете сами.
lengthnull — вся data; иначе максимум байтов, не больше длины data. В PHP8.5.11 length <= 0 возвращает 0 без записи, а не ValueError.
ВозвратКоличество записанных байтов, включая 0; false при отказе.
ОтказПри отказе записи E_WARNING; несовместимый тип аргумента в PHP8 даёт TypeError.
ВерсияPHP 4+; nullable length с PHP 8.0
Путь конкретного документа
  1. pickup.txt создаётся один раз
  2. Первая запись: «Выдача заказа 104»
  3. Вторая запись: «Дрель: 2»
  4. Обе строки остаются в файле
Записать заголовок и строку выдачи в один файлСамостоятельный пример
<?php
declare(strict_types=1);

$path = __DIR__ . '/pickup.txt';
$stream = fopen($path, 'w+b');
if ($stream === false) { throw new RuntimeException('Не создать памятку'); }
try {
    fputs($stream, "Выдача заказа 104\n");
    fputs($stream, "Дрель: 2\n");
    rewind($stream);
    echo stream_get_contents($stream);
} finally { fclose($stream); }
Ожидаемый результат
Выдача заказа 104
Дрель: 2

Каждый вызов продолжает запись с текущей позиции; w очистил файл при открытии, а не перед каждой строкой. Здесь успешный короткий путь; следующий помощник обрабатывает частичные записи. fputs — псевдоним fwrite с тем же контрактом.

Полностью записать памятку через помощник writeBytesСамостоятельный пример
<?php
function writeBytes($h, $data) {
    $offset = 0;
    while ($offset < strlen($data)) {
        $written = fputs($h, substr($data, $offset));
        if ($written === false || $written === 0) { throw new RuntimeException('write stopped'); }
        $offset += $written;
    }
    return $offset;
}
$h = fopen(__DIR__ . '/result.txt', 'w+b');
try { echo writeBytes($h, "104: ready\n"), "
"; }
finally { fclose($h); }
echo file_get_contents(__DIR__ . '/result.txt');
Ожидаемый результат
11
104: ready

writeBytes дописывает ещё не записанный хвост: substr берёт остаток, offset увеличивается на фактически записанные байты. false и 0 останавливают цикл. Возврат 11 подтверждает размер, после закрытия показано содержимое реального result.txt. Это локальный блокирующий поток.

Применение и границы. На сети возможна частичная запись. В append-режиме локальная ОС может обеспечивать неделимость одного небольшого write, но оговорки платформы, размера блока и файловой системы не дают общего обещания для записи из нескольких вызовов или чтения–изменения–записи. Для общей договорённости процессов нужен flock; для долговечности отдельно fflush/fsync. b сохраняет двоичные данные.

Сравните: fwrite, file_put_contents, flock, fflush. Полный выбор файловых операций.

fgetcПолучить один байт; строка "0" — полноценные данные.

PHP 4+ · standard

fgetc(resource $stream): string|false

Получить один байт; строка "0" — полноценные данные.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. fopen возвращает открытый поток (resource), а не содержимое файла. rb читает байты, w+b создаёт/очищает файл и разрешает чтение с записью. fclose освобождает поток. while (условие) повторяет блок, пока условие истинно; после чтения важно различать конец и ошибку. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". [...] создаёт массив; $row["size"] читает поле по ключу; [$a, $b] = ... раскладывает список. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
streamОткрытый совместимый поток (resource). Закрытый или чужой ресурс в PHP 8 приводит к TypeError; возможности зависят от обёртки.
ВозвратСтрока длиной 1 байт; false при EOF или отказе.
ОтказНеверный/закрытый ресурс — TypeError.
ВерсияPHP 4+
Путь данных в первом опыте
  1. Файл 0A
  2. Первый байт 0
  3. Второй байт A
  4. Следующее чтение false
Не потерять символ нольСамостоятельный пример
<?php
$h = fopen(__DIR__ . '/flags.txt', 'rb');
while (($byte = fgetc($h)) !== false) { echo '[', $byte, ']'; }
fclose($h);
echo "
";
Ожидаемый результат
[0][A]

Условие !== false не путает данные "0" с концом.

Байт не равен русской буквеСамостоятельный пример
<?php
$h = fopen(__DIR__ . '/letter.txt', 'rb');
echo bin2hex(fgetc($h)), ' ', bin2hex(fgetc($h)), "
";
fclose($h);
Ожидаемый результат
d0 af

UTF-8-буква Я занимает два байта. bin2hex показывает каждый байт; для букв сначала декодируйте строку через mbstring.

Применение и границы. Подходит для небольшого байтового протокола. Для большого файла вызов на каждый байт часто создаёт лишние вызовы PHP: fread порциями удобнее. Не используйте как Unicode-итератор.

Сравните: fgets, fread, feof. Полный выбор файловых операций.

feofУзнать состояние конца потока после чтения; это не прогноз успешности следующего чтения.

PHP 4+ · standard

feof(resource $stream): bool

Узнать состояние конца потока после чтения; это не прогноз успешности следующего чтения.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. fopen возвращает открытый поток (resource), а не содержимое файла. rb читает байты, w+b создаёт/очищает файл и разрешает чтение с записью. fclose освобождает поток. while (условие) повторяет блок, пока условие истинно; после чтения важно различать конец и ошибку. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". try выполняет попытку, catch обрабатывает указанный отказ, finally освобождает ресурс и не подавляет ошибку. throw new RuntimeException сообщает о сбое. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
streamОткрытый совместимый поток (resource). Закрытый или чужой ресурс в PHP 8 приводит к TypeError; возможности зависят от обёртки.
Возвратtrue при EOF или ошибке, включая socket timeout; иначе false.
ОтказPHP 8 отвергает false/закрытый ресурс через TypeError; старые предупреждения Manual о бесконечном цикле описывают также прежние версии.
ВерсияPHP 4+
Путь данных в первом опыте
  1. Файл A
  2. Чтение A
  3. Попытка чтения за концом
  4. feof true
Конец обнаруживается при попытке чтенияСамостоятельный пример
<?php
$h = fopen(__DIR__ . '/one.txt', 'rb');
var_dump(feof($h));
echo fgetc($h), "
";
var_dump(fgetc($h), feof($h));
fclose($h);
Ожидаемый результат
bool(false)
A
bool(false)
bool(true)

fgetc false после A устанавливает обнаруженный конец.

Прочитать обе заявки, включая последнюю без перевода строкиСамостоятельный пример
<?php
declare(strict_types=1);

$stream = fopen(__DIR__ . '/orders.txt', 'rb');
if ($stream === false) { throw new RuntimeException('Не открыть заявки'); }
try {
    while (($line = fgets($stream)) !== false) {
        echo 'Принята заявка: ', rtrim($line, "\r\n"), "\n";
    }
    if (!feof($stream)) { throw new RuntimeException('Чтение прервано'); }
} finally { fclose($stream); }
Ожидаемый результат
Принята заявка: 0
Принята заявка: 104

Первый номер равен строке "0", последний не заканчивается LF. Условие !== false сохраняет оба случая и не создаёт лишнюю заявку после конца.

Применение и границы. Для сокета true может означать тайм-аут, а ожидание данных способно блокировать. Настройте время ожидания и анализируйте stream_get_meta_data, лимит объёма и общий бюджет. feof не является гарантией полноты прикладного сообщения.

Сравните: fgets, fread, fgetc. Полный выбор файловых операций.

fseekПереставить позицию в байтах: от начала, текущего места или конца.

PHP 4+ · standard

fseek(resource $stream, int $offset, int $whence = SEEK_SET): int

Переставить позицию в байтах: от начала, текущего места или конца.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. fopen возвращает открытый поток (resource), а не содержимое файла. rb читает байты, w+b создаёт/очищает файл и разрешает чтение с записью. fclose освобождает поток. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
streamОткрытый совместимый поток (resource). Закрытый или чужой ресурс в PHP 8 приводит к TypeError; возможности зависят от обёртки. Нужна поддержка seek.
offsetСмещение байтов; отрицательное допустимо, если итоговая позиция корректна.
whenceSEEK_SET — начало; SEEK_CUR — текущая позиция; SEEK_END — конец.
Возврат0 — успех, −1 — отказ: это не обычный bool-контракт.
ОтказНекорректное направление/неподдерживаемый seek может дать −1 с диагностикой; используйте перечисленные SEEK_*.
ВерсияPHP 4+
Путь конкретного документа
  1. stock.txt: TEA:12
  2. Сдвиг на −2 байта от SEEK_END
  3. Следующее чтение: 12 шт.
Прочитать количество в конце фиксированной записиСамостоятельный пример
<?php
declare(strict_types=1);

$stream = fopen(__DIR__ . '/stock.txt', 'rb');
if ($stream === false) { throw new RuntimeException('Не открыть остаток'); }
try {
    if (fseek($stream, -2, SEEK_END) !== 0) { throw new RuntimeException('Не перейти к количеству'); }
    echo 'Чай на складе: ', fread($stream, 2), " шт.\n";
} finally { fclose($stream); }
Ожидаемый результат
Чай на складе: 12 шт.

Формат TEA:12 имеет ровно две цифры в конце. SEEK_END выбирает конец, -2 перемещает на два байта назад. У fseek успешный результат — 0; условие !fseek ошибочно сочло бы успех отказом.

Запись после конца оставляет нулевые байтыСамостоятельный пример
<?php
$h = fopen(__DIR__ . '/gap.bin', 'w+b');
fwrite($h, 'A');
fseek($h, 3, SEEK_SET);
fwrite($h, 'B');
rewind($h);
echo bin2hex(fread($h, 4)), "
";
fclose($h);
Ожидаемый результат
41000042

Промежуток — байты 00, не текстовые пробелы; некоторые потоки фиксированного размера так не умеют.

Применение и границы. В append запись всё равно идёт в конец. Не все обёртки поддерживают seek; движение вперёд иногда имитируется чтением и отбрасыванием, поэтому это может быть дорого и не обеспечивает произвольный доступ. Для UTF-8 нельзя считать байтовую позицию номером буквы.

Сравните: ftell, rewind, ftruncate. Полный выбор файловых операций.

ftellПолучить текущий байтовый адрес чтения или записи.

PHP 4+ · standard

ftell(resource $stream): int|false

Получить текущий байтовый адрес чтения или записи.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. fopen возвращает открытый поток (resource), а не содержимое файла. rb читает байты, w+b создаёт/очищает файл и разрешает чтение с записью. fclose освобождает поток. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
streamОткрытый совместимый поток (resource). Закрытый или чужой ресурс в PHP 8 приводит к TypeError; возможности зависят от обёртки.
ВозвратПозиция int от начала или false при отказе.
ОтказНе каждый поток имеет осмысленную позицию; результат append-only потока не определён договором.
ВерсияPHP 4+
Путь конкретного документа
  1. orders.txt: 104 + LF + 105 + LF
  2. fgets читает 104 и LF
  3. ftell возвращает 4
  4. Следующее чтение: 105
Показать, где начинается вторая заявкаСамостоятельный пример
<?php
declare(strict_types=1);

$stream = fopen(__DIR__ . '/orders.txt', 'rb');
if ($stream === false) { throw new RuntimeException('Не открыть заявки'); }
try {
    echo 'Первая заявка: ', fgets($stream);
    echo 'Следующая начинается с байта: ', ftell($stream), "\n";
    echo 'Вторая заявка: ', fgets($stream);
} finally { fclose($stream); }
Ожидаемый результат
Первая заявка: 104
Следующая начинается с байта: 4
Вторая заявка: 105

Три ASCII-цифры и LF занимают четыре байта. ftell возвращает адрес следующего чтения, а не номер строки. Для UTF-8 длина текста в буквах может отличаться.

Вернуться к заявке после пробного чтенияСамостоятельный пример
<?php
declare(strict_types=1);

$stream = fopen(__DIR__ . '/orders.txt', 'rb');
if ($stream === false) { throw new RuntimeException('Не открыть заявки'); }
try {
    fgets($stream);
    $checkpoint = ftell($stream);
    if ($checkpoint === false) { throw new RuntimeException('Нет позиции'); }
    echo 'Предпросмотр: ', fgets($stream);
    if (fseek($stream, $checkpoint) !== 0) { throw new RuntimeException('Не вернуться к записи'); }
    echo 'В обработку: ', fgets($stream);
} finally { fclose($stream); }
Ожидаемый результат
Предпросмотр: 105
В обработку: 105

Checkpoint — сохранённая байтовая позиция в этой неизменённой версии файла. Это полезно для повторного чтения, но не заменяет устойчивый ID заявки или сохранение версии источника.

Применение и границы. Ограничения размера PHP int особенно заметны в 32-битных сборках на файлах >2 ГиБ. Для CWD/сетевых/append-потоков не обещайте одинаковой семантики. При сохранении checkpoint отдельно фиксируйте версию файла.

Сравните: fseek, rewind. Полный выбор файловых операций.

rewindВернуться к началу потока; содержимое при этом не очищается.

PHP 4+ · standard

rewind(resource $stream): bool

Вернуться к началу потока; содержимое при этом не очищается.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. fopen возвращает открытый поток (resource), а не содержимое файла. rb читает байты, w+b создаёт/очищает файл и разрешает чтение с записью. fclose освобождает поток. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
streamОткрытый совместимый поток (resource). Закрытый или чужой ресурс в PHP 8 приводит к TypeError; возможности зависят от обёртки. Требуется seek.
Возвратtrue при успехе, false при отказе.
ОтказДля неперематываемого потока может отказать.
ВерсияPHP 4+
Путь конкретного документа
  1. Первая строка pickup.txt: 104: ready
  2. fgets читает строку
  3. rewind ставит позицию 0
  4. fgets снова читает ту же строку
Ещё раз прочитать начало списка выдачиСамостоятельный пример
<?php
declare(strict_types=1);

$stream = fopen(__DIR__ . '/pickup.txt', 'rb');
if ($stream === false) { throw new RuntimeException('Не открыть список'); }
try {
    echo 'Первый просмотр: ', fgets($stream);
    if (!rewind($stream)) { throw new RuntimeException('Не вернуться в начало'); }
    echo 'Повторный просмотр: ', fgets($stream);
} finally { fclose($stream); }
Ожидаемый результат
Первый просмотр: 104: ready
Повторный просмотр: 104: ready

rewind меняет только позицию чтения. Строка остаётся в файле. У сетевого или другого неперематываемого потока возврат может быть недоступен.

Короткая запись оставляет старый хвост: исправить егоСамостоятельный пример
<?php
declare(strict_types=1);

$stream = fopen(__DIR__ . '/state.txt', 'r+b');
if ($stream === false) { throw new RuntimeException('Не открыть состояние'); }
try {
    fwrite($stream, 'ready');
    rewind($stream);
    echo 'Без обрезания: ', stream_get_contents($stream), "\n";
    if (!ftruncate($stream, strlen('ready')) || !rewind($stream)) {
        throw new RuntimeException('Не завершить замену');
    }
    echo 'После обрезания: ', stream_get_contents($stream), "\n";
} finally { fclose($stream); }
Ожидаемый результат
Без обрезания: readyssing
После обрезания: ready

Изначально state.txt содержит processing: десять байтов. fwrite заменяет первые пять байтов на ready, оставляя хвост ssing; ftruncate задаёт итоговую длину пять. Для общей записи сначала нужна блокировка.

Применение и границы. Не путайте перемотку, обнуление и закрытие. При общей записи подготовьте блокировку до изменения.

Сравните: fseek, ftruncate, flock. Полный выбор файловых операций.

ftruncateИзменить длину открытого файла, не перемещая текущую позицию.

PHP 4+ · standard

ftruncate(resource $stream, int $size): bool

Изменить длину открытого файла, не перемещая текущую позицию.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. fopen возвращает открытый поток (resource), а не содержимое файла. rb читает байты, w+b создаёт/очищает файл и разрешает чтение с записью. fclose освобождает поток. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
streamОткрытый совместимый поток (resource). Закрытый или чужой ресурс в PHP 8 приводит к TypeError; возможности зависят от обёртки. Должен быть открыт для записи.
sizeНеотрицательная новая длина в байтах; больше текущей — дополнить нулями, меньше — удалить хвост.
Возвратtrue при успехе, false при отказе.
ОтказОтрицательный size даёт ValueError в PHP 8; поток без возможности усечения отказывает.
ВерсияPHP 4+
Путь конкретного документа
  1. orders.txt содержит 104 и 105
  2. После первой строки ftell: 4
  3. ftruncate оставляет 4 байта
  4. В файле осталась заявка 104
Убрать отменённую последнюю заявкуСамостоятельный пример
<?php
declare(strict_types=1);

$stream = fopen(__DIR__ . '/orders.txt', 'r+b');
if ($stream === false) { throw new RuntimeException('Не открыть заявки'); }
try {
    fgets($stream);
    $endOfFirst = ftell($stream);
    if ($endOfFirst === false || !ftruncate($stream, $endOfFirst)) {
        throw new RuntimeException('Не удалить отменённую заявку');
    }
    echo 'Позиция после обрезания: ', ftell($stream), "\n";
    rewind($stream);
    echo 'Осталась заявка: ', stream_get_contents($stream);
} finally { fclose($stream); }
Ожидаемый результат
Позиция после обрезания: 4
Осталась заявка: 104

ftell после первой строки даёт правильную байтовую границу, включая LF. ftruncate оставляет первые четыре байта, не двигая позицию. Пример изменяет только fixture; произвольное удаление записей требует правил и блокировки.

Расширение добавляет нулевые байтыСамостоятельный пример
<?php
$h = fopen(__DIR__ . '/data.txt', 'r+b');
ftruncate($h, 4);
echo bin2hex(fread($h, 4)), "
";
fclose($h);
Ожидаемый результат
41420000

Нулевые байты полезны в двоичном формате; это не четыре текстовых символа.

Применение и границы. При c+ и LOCK_EX обнуляйте только после получения блокировки. Для текстового обрезания на UTF-8 границе сначала определите корректную байтовую позицию.

Сравните: fopen, rewind, flock. Полный выбор файловых операций.

fpassthruОтправить оставшиеся байты потока в вывод, а не вернуть их строкой.

PHP 4+ · standard

fpassthru(resource $stream): int

Отправить оставшиеся байты потока в вывод, а не вернуть их строкой.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. fopen возвращает открытый поток (resource), а не содержимое файла. rb читает байты, w+b создаёт/очищает файл и разрешает чтение с записью. fclose освобождает поток. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
streamОткрытый совместимый поток (resource). Закрытый или чужой ресурс в PHP 8 приводит к TypeError; возможности зависят от обёртки.
ВозвратЧисло переданных байтов; уже переданный вывод отдельно не возвращается.
ОтказОшибка чтения может оставить уже частично отправленный ответ; неверный ресурс — TypeError.
ВерсияPHP 4+
Путь конкретного документа
  1. document.txt начинается с FORMAT:1
  2. fgets пропускает служебную строку
  3. fpassthru выводит 104: ready
  4. Возврат: 11 байт
Пропустить служебную строку и вывести памяткуСамостоятельный пример
<?php
declare(strict_types=1);

$stream = fopen(__DIR__ . '/document.txt', 'rb');
if ($stream === false) { throw new RuntimeException('Не открыть документ'); }
try {
    fgets($stream);
    $bytes = fpassthru($stream);
    echo 'Выведено: ', $bytes, " байт\n";
} finally { fclose($stream); }
Ожидаемый результат
104: ready
Выведено: 11 байт

Первая строка FORMAT:1 служебная. fpassthru выводит оставшийся текст сам, а возвращает число байтов. Это CLI-показ; для HTTP-скачивания нельзя добавлять диагностическое число к телу файла.

Захватить маленький вывод для тестаСамостоятельный пример
<?php
$h = fopen(__DIR__ . '/report.txt', 'rb');
ob_start();
$bytes = fpassthru($h);
$body = ob_get_clean();
fclose($h);
echo $body, ':', $bytes, "
";
Ожидаемый результат
OK:2

ob_start включает буфер вывода, ob_get_clean возвращает его и закрывает. Для больших файлов такой буфер уже потребляет память.

Применение и границы. Для HTTP скачивания сначала проверьте доступ к документу и отправьте заголовки до тела. Content-Length должен относиться к фактически отдаваемым байтам; нельзя добавлять echo после двоичного файла. После записи перед выводом нужен rewind. Для целого файла проще readfile.

Сравните: readfile, rewind, fread. Полный выбор файловых операций.

readfileОтдать весь файл в вывод; переменная получит число байтов, не текст.

PHP 4+ · standard

readfile(string $filename, bool $use_include_path = false, ?resource $context = null): int|false

Отдать весь файл в вывод; переменная получит число байтов, не текст.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". [...] создаёт массив; $row["size"] читает поле по ключу; [$a, $b] = ... раскладывает список. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
filenameСтрока пути; относительный путь разрешается от текущего рабочего каталога (CWD), а не обязательно от папки этого исходника. Поддерживаемая URL-обёртка также возможна.
use_include_pathtrue включает поиск в include_path.
contextКонтекст обёртки или null.
ВозвратЧисло выведенных байтов или false.
ОтказE_WARNING при отказе; возможен уже начавшийся вывод.
ВерсияPHP 4+
Путь конкретного документа
  1. pickup.txt содержит 104: ready
  2. readfile сама выводит текст
  3. Возвращает 11 байт
Вывести готовую памятку, отдельно показать размер выводаСамостоятельный пример
<?php
declare(strict_types=1);

$bytes = readfile(__DIR__ . '/pickup.txt');
if ($bytes === false) { throw new RuntimeException('Не показать памятку'); }
echo 'Выведено: ', $bytes, " байт\n";
Ожидаемый результат
104: ready
Выведено: 11 байт

Текст выводит сама readfile. echo readfile(...) приписало бы 11 сразу к содержимому. Здесь диагностическая строка нужна для CLI-урока; в HTTP-ответе с файлом её не добавляют.

Выбрать разрешённый документ по IDСамостоятельный пример
<?php
$documents = ['rules' => __DIR__ . '/rules.txt'];
$id = 'rules';
if (!isset($documents[$id])) { throw new RuntimeException('unknown document'); }
if (readfile($documents[$id]) === false) { throw new RuntimeException('read'); }
Ожидаемый результат
RULES

Путь задаёт приложение, пользователь выбирает ID. В веб-сервисе отдельно проверяется право конкретного пользователя на документ.

Применение и границы. Сама функция передаёт файл порциями, но output buffering/веб-сервер/прокси могут накопить ответ. Для больших выгрузок учитывайте весь маршрут и тайм-аут запроса. Файл PHP здесь читается как данные, а не исполняется; не отдавайте исходники и секретные конфиги.

Сравните: fpassthru, file_get_contents, file. Полный выбор файловых операций.

fileПолучить весь небольшой файл как массив строк.

PHP 4+ · standard

file(string $filename, int $flags = 0, ?resource $context = null): array|false

Получить весь небольшой файл как массив строк.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. foreach берёт элементы массива по одному, форма as $key => $value также читает ключ. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". | объединяет поддерживаемые флаги; это допустимо только для параметра-маски. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
filenameСтрока пути; относительный путь разрешается от текущего рабочего каталога (CWD), а не обязательно от папки этого исходника. Возможны поддерживаемые URL-обёртки.
flagsМаска FILE_USE_INCLUDE_PATH, FILE_IGNORE_NEW_LINES, FILE_SKIP_EMPTY_LINES, FILE_NO_DEFAULT_CONTEXT.
contextНастройки обёртки или null.
ВозвратМассив строк с переводами строк по умолчанию; false при отказе.
ОтказE_WARNING при недоступном файле. С 8.3 неподдерживаемые flags (например FILE_APPEND) дают ValueError.
ВерсияPHP 4+
Путь данных в первом опыте
  1. Tea + пустая строка + Coffee
  2. file с двумя флагами
  3. Убрать LF и пустые строки
  4. Массив Tea, Coffee
Прочитать непустые строки без LFСамостоятельный пример
<?php
$rows = file(__DIR__ . '/names.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
echo json_encode($rows), "
";
Ожидаемый результат
["Tea","Coffee"]

Пустая строка убрана; строка с пробелами не тождественна пустой.

Нумеровать строки инструкцииСамостоятельный пример
<?php
$rows = file(__DIR__ . '/guide.txt', FILE_IGNORE_NEW_LINES);
if ($rows === false) { throw new RuntimeException('read'); }
foreach ($rows as $index => $line) { echo $index + 1, ': ', $line, "
"; }
Ожидаемый результат
1: Open
2: Save

Массив начинается с индекса 0; человек видит номера с 1. В HTML строку нужно экранировать.

Применение и границы. В памяти одновременно массив и строки: большой журнал обрабатывайте fgets. Для CR-only файлов нужна явная нормализация; auto_detect_line_endings deprecated8.1. FILE_NO_DEFAULT_CONTEXT отключает стандартный контекст, не права и не проверку TLS.

Сравните: fgets, file_get_contents, readfile. Полный выбор файловых операций.

copyСкопировать файл, сохранив источник.

PHP 4+ · standard

copy(string $from, string $to, ?resource $context = null): bool

Скопировать файл, сохранив источник.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
fromСтрока пути; относительный путь разрешается от текущего рабочего каталога (CWD), а не обязательно от папки этого исходника. Источник.
toПолный путь назначения, а не только каталог. Существующий файл может быть перезаписан.
contextКонтекст обёртки или null.
Возвратtrue при успехе, false при отказе.
ОтказОбычно E_WARNING при отказе. Обёртка назначения должна поддерживать перезапись.
ВерсияPHP 4+
Путь конкретного документа
  1. draft.txt содержит 104: ready
  2. copy создаёт pickup.txt с теми же байтами
  3. Черновик остаётся под прежним именем
Подготовить документ под именем для сотрудникаСамостоятельный пример
<?php
declare(strict_types=1);

$from = __DIR__ . '/draft.txt';
$to = __DIR__ . '/pickup.txt';
if (!copy($from, $to)) { throw new RuntimeException('Не подготовить документ'); }
echo 'pickup.txt: ', file_get_contents($to);
echo file_exists($from) ? "Черновик остался.\n" : "Имя черновика перенесено.\n";
Ожидаемый результат
pickup.txt: 104: ready
Черновик остался.

copy создаёт отдельную копию содержимого и сохраняет источник; rename меняет имя/местоположение. Оба пути принадлежат отдельной папке примера, назначение передаётся с именем файла.

Заменить прежний отчёт подготовленнымСамостоятельный пример
<?php
$from = __DIR__ . '/new.txt';
$to = __DIR__ . '/current.txt';
if (!copy($from, $to)) { throw new RuntimeException('copy'); }
echo file_get_contents($to), "
";
Ожидаемый результат
NEW

Назначение уже существует. В примере оба файла принадлежат этой изолированной папке.

Применение и границы. copy не копирует дерево каталога и не обещает сохранить все метаданные/ACL. Читатель назначения может увидеть процесс записи; для смены готового файла применяют отдельно подготовку и rename.

Сравните: rename, unlink, move_uploaded_file. Полный выбор файловых операций.

renameПереместить или переименовать файл/каталог.

PHP 4+ · standard

rename(string $from, string $to, ?resource $context = null): bool

Переместить или переименовать файл/каталог.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
fromСтрока пути; относительный путь разрешается от текущего рабочего каталога (CWD), а не обязательно от папки этого исходника. Источник.
toПолный путь назначения, а не только каталог. Существующий файл может быть перезаписан.
contextКонтекст обёртки или null.
Возвратtrue при успехе, false при отказе.
ОтказОбычно E_WARNING при отказе. Обе стороны должны использовать одну обёртку; существующий каталог назначения даёт отказ. На Windows существующий файл назначения должен быть записываемым.
ВерсияPHP 4+
Путь конкретного документа
  1. draft.txt содержит 104: ready
  2. rename переносит имя в pickup.txt
  3. Содержимое сохранилось; draft.txt больше нет
Подготовить документ под именем для сотрудникаСамостоятельный пример
<?php
declare(strict_types=1);

$from = __DIR__ . '/draft.txt';
$to = __DIR__ . '/pickup.txt';
if (!rename($from, $to)) { throw new RuntimeException('Не подготовить документ'); }
echo 'pickup.txt: ', file_get_contents($to);
echo file_exists($from) ? "Черновик остался.\n" : "Имя черновика перенесено.\n";
Ожидаемый результат
pickup.txt: 104: ready
Имя черновика перенесено.

copy создаёт отдельную копию содержимого и сохраняет источник; rename меняет имя/местоположение. Оба пути принадлежат отдельной папке примера, назначение передаётся с именем файла.

Заменить прежний отчёт подготовленнымСамостоятельный пример
<?php
$from = __DIR__ . '/new.txt';
$to = __DIR__ . '/current.txt';
if (!rename($from, $to)) { throw new RuntimeException('rename'); }
echo file_get_contents($to), "
";
Ожидаемый результат
NEW

Назначение уже существует. В примере оба файла принадлежат этой изолированной папке.

Применение и границы. Неделимую смену имени обычно обсуждают для одной локальной файловой системы. Не переносите это обещание на разные тома, сетевые обёртки и все Windows-сценарии с открытыми handles. Не обещает fsync/сохранность питания. Права и итог операции проверяются даже после предварительных проверок.

Сравните: copy, unlink, move_uploaded_file. Полный выбор файловых операций.

deleteОфициальный пункт delete — указатель на разные операции, а не API.

Навигационный пункт Manual, не функция · standard

delete — такой встроенной функции и ключевого слова нет

Официальный пункт delete — указатель на разные операции, а не API.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
ВозвратВызова delete() нет; выбирайте unlink для файла или unset для переменной.
ОтказПопытка вызвать необъявленную delete() даст Error.
ВерсияНавигационный пункт Manual, не функция
Путь данных в первом опыте
  1. Есть переменная и файл
  2. unset удаляет переменную
  3. Файл остаётся
  4. unlink удаляет файл
Удалить переменную, продолжая хранить памяткуСамостоятельный пример
<?php
declare(strict_types=1);

$path = __DIR__ . '/pickup.txt';
$text = file_get_contents($path);
unset($text);
echo 'Повторное чтение с диска: ', file_get_contents($path);
Ожидаемый результат
Повторное чтение с диска: 104: ready

unset удаляет переменную $text. Файл остаётся и читается повторно. Универсальной встроенной функции delete в PHP нет.

После удаления файла уже прочитанная строка остаётсяСамостоятельный пример
<?php
declare(strict_types=1);

$path = __DIR__ . '/pickup.txt';
$text = file_get_contents($path);
if ($text === false || !unlink($path)) { throw new RuntimeException('Операция не завершена'); }
echo 'Сохранено в переменной: ', $text;
echo file_exists($path) ? "Файл существует.\n" : "Файл удалён с диска.\n";
Ожидаемый результат
Сохранено в переменной: 104: ready
Файл удалён с диска.

unlink удаляет имя на диске, но не ранее полученную строку. Исходник примера фиксирован; чужие файлы не затрагиваются.

Применение и границы. У PHP нет универсального delete для всех сущностей. Для строки базы данных нужен отдельный запрос, для файла unlink, для переменной unset.

Сравните: unlink, rmdir. Полный выбор файловых операций.

fscanfПрочитать физическую строку и извлечь значения по известному текстовому формату.

PHP4.0.1+ · standard

fscanf(resource $stream, string $format, mixed &...$vars): array|int|false|null

Прочитать физическую строку и извлечь значения по известному текстовому формату.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. fopen возвращает открытый поток (resource), а не содержимое файла. rb читает байты, w+b создаёт/очищает файл и разрешает чтение с записью. fclose освобождает поток. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
streamОткрытый совместимый поток (resource). Закрытый или чужой ресурс в PHP 8 приводит к TypeError; возможности зависят от обёртки.
formatШаблон преобразований: %s слово до whitespace, %d decimal, %D decimal, %i целое с определением базы; %f float, %x/%o основание, %c байты, %n число обработанных символов. Ширина ограничивает поле; %*d читает без присваивания. Пробел шаблона соответствует whitespace, не обязательно одному пробелу.
varsНеобязательные переменные по ссылке: функция присваивает им результат; число переменных должно соответствовать непропущенным преобразованиям.
ВозвратБез vars — массив полей (неполные поля могут быть null); с vars — число присваиваний. false/null предусмотрены договором для отказа/неполного разбора. Проверяйте также каждый элемент.
ОтказНеправильный format/число vars в PHP8 может дать ValueError. Manual описывает также −1 при исчерпании входа до присваивания; на проверенном PHP8.5.11 физический EOF даёт false и с vars, поэтому не привязывайте цикл только к −1.
ВерсияPHP4.0.1+
Путь данных в первом опыте
  1. TEA 8
  2. Шаблон %s %d
  3. Слово TEA и число 8
  4. Проверка полученных типов
Получить слово и количествоСамостоятельный пример
<?php
$h = fopen(__DIR__ . '/stock.txt', 'rb');
$row = fscanf($h, '%s %d');
echo json_encode($row), "
";
fclose($h);
Ожидаемый результат
["TEA",8]

%s не читает имя с пробелами целиком; для такого формата выберите CSV.

Отвергнуть неполный остаток вместо подстановки нуляСамостоятельный пример
<?php
declare(strict_types=1);

$stream = fopen(__DIR__ . '/stock.txt', 'rb');
if ($stream === false) { throw new RuntimeException('Не открыть остатки'); }
try {
    while (($row = fscanf($stream, '%s %d')) !== false) {
        if (!is_array($row) || count($row) !== 2 || !is_string($row[0]) || !is_int($row[1])) {
            echo "Строка отклонена: нет целого количества.\n";
            continue;
        }
        echo $row[0], ': ', $row[1], " шт.\n";
    }
} finally { fclose($stream); }
Ожидаемый результат
TEA: 8 шт.
Строка отклонена: нет целого количества.

%s читает слово, %d — целое. У строки COFFEE недостающее второе поле даёт null; это не нулевой остаток. Первый пример показывает массив, этот — решение по схеме. Вариант с переменными по ссылке возвращает число присваиваний и сохраняется в полном контракте карточки.

Применение и границы. Парсер не locale-aware; F/g/G/b не поддерживаются в отличие от семейства форматирования. В scanf * подавляет присваивание, а не задаёт динамическую ширину; позиционное argnum$ здесь не тот договор, что у sprintf. Каждый вызов потребляет строку. Проверка синтаксиса числа не заменяет диапазон и обязательность полей.

Сравните: fgets, fgetcsv. Полный выбор файловых операций.

Второй способ получения результата — передать переменные, которые fscanf заполнит по ссылке. Вы не пишете & перед аргументами вызова: это свойство параметров самой функции. Возврат тогда означает число присваиваний, а значения лежат в переменных.

Получить артикул и количество в отдельные переменныеСамостоятельный пример
<?php
declare(strict_types=1);

$stream = fopen(__DIR__ . '/stock.txt', 'rb');
if ($stream === false) { throw new RuntimeException('Нет остатков'); }
try {
    $sku = null; $quantity = null;
    $assigned = fscanf($stream, '%s %d', $sku, $quantity);
    if ($assigned !== 2) { throw new UnexpectedValueException('Нужны артикул и целое количество'); }
    echo $sku, ': доступно ', $quantity, " шт.\n";
} finally { fclose($stream); }
Ожидаемый результат
TEA: доступно 8 шт.

%s заполняет sku словом, %d — quantity числом;2 подтверждает два присваивания. Это разбор известного текстового формата с пробелом. Для названий с пробелами и кавычками используйте CSV, для строгой проверки всей строки — подходящий parser.

parse_ini_fileРазобрать файл конфигурации INI в ассоциативный массив.

PHP4+ · standard

parse_ini_file(string $filename, bool $process_sections = false, int $scanner_mode = INI_SCANNER_NORMAL): array|false

Разобрать файл конфигурации INI в ассоциативный массив.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". [...] создаёт массив; $row["size"] читает поле по ключу; [$a, $b] = ... раскладывает список. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
filenameСтрока пути; относительный путь разрешается от текущего рабочего каталога (CWD), а не обязательно от папки этого исходника. Для относительного имени затем учитывается include_path.
process_sectionstrue сохраняет секции как вложенные массивы; false объединяет настройки без этого уровня.
scanner_modeNORMAL по умолчанию; RAW для недоверенного текста; TYPED для типов доверенной конфигурации.
ВозвратАссоциативный массив, false при отказе.
ОтказСинтаксические ошибки дают warning и false; неизвестный scanner_mode может дать ValueError.
ВерсияPHP4+

INI — строки ключ = значение, комментарии после ;, секции [mail]. roles[] добавляет элемент списка, urls[docs] задаёт ключ вложенного массива. Это разбор данных приложения: он не меняет уже загруженный php.ini. Для внешнего текста допустим только RAW, после которого всё равно нужны собственные проверки ключей и значений.

РежимЧто получается
INI_SCANNER_NORMALОбычные значения преимущественно строки; on/yes/true → "1", off/no/false/null → "". Константы и интерполяция разрешены.
INI_SCANNER_TYPEDС5.6.1 сохраняет bool/null и подходящие целые числа; числовое значение не обязательно float. Кавычки помогают сохранить строку.
INI_SCANNER_RAWНе вычисляет значения констант/выражения и не выполняет обычные escape-преобразования.

В NORMAL/TYPED отдельное имя константы может раскрыть её значение; magic constants вроде __FILE__ не вычисляются этим правилом. ${NAME} читает окружение или ранее определённую настройку; | & ^ ~ и скобки имеют значение в выражении. Для буквального ${...} в двойных кавычках экранируют доллар. Не передавайте недоверенный INI этим режимам: он способен раскрыть секретную константу.

Ключами не служат null, yes, no, true, false, on, off, none; специальные ?{}|&~!()^" также запрещены в ключах, квадратные скобки имеют синтаксическое назначение массивов. Строка без = игнорируется, а key = создаёт пустое значение. Небуквенно-цифровые значения заключайте в двойные кавычки. Экранирование кавычки/backslash отличается от PHP: обычные / не превращаются в перенос и табуляцию. Есть особое правило завершающего backslash Windows-пути перед концом строки; для сложного многострочного текста лучше выбрать явный формат данных. Соседние строки в кавычках могут соединяться. Храните конфигурацию с секретами вне public: веб-сервер обычно отдаёт .ini как текст.

Путь конкретного документа
  1. [pickup]: enabled=true, max_items=3
  2. TYPED сохраняет bool и int
  3. config[pickup] выбирает секцию
  4. Самовывоз включён; максимум 3 предмета
Настроить выдачу по секции INIСамостоятельный пример
<?php
declare(strict_types=1);

$config = parse_ini_file(__DIR__ . '/settings.ini', true, INI_SCANNER_TYPED);
if ($config === false) { throw new RuntimeException('Не разобрать настройки'); }
$settings = $config['pickup'] ?? null;
if (!is_array($settings) || !is_bool($settings['enabled'] ?? null) || !is_int($settings['max_items'] ?? null)) {
    throw new UnexpectedValueException('Нужны enabled и max_items');
}
echo $settings['enabled'] ? "Самовывоз включён.\n" : "Самовывоз выключен.\n";
echo 'Предметов за одну выдачу: ', $settings['max_items'], "\n";
Ожидаемый результат
Самовывоз включён.
Предметов за одну выдачу: 3

true во втором аргументе сохраняет секцию pickup, INI_SCANNER_TYPED даёт bool и int для доверенных настроек. ?? null обнаруживает отсутствующее поле; проверка типов не заменяет проверку диапазона max_items. Этот файл не меняет настройки самого PHP.

Сохранить буквальное имя константыСамостоятельный пример
<?php
define("APP_LABEL", "internal");
$config = parse_ini_file(__DIR__ . '/input.ini', false, INI_SCANNER_RAW);
echo $config["label"], "\n";
echo implode(",", $config["roles"]), "\n";
Ожидаемый результат
APP_LABEL
reader,author

RAW не подставляет значение APP_LABEL. Это не автоматическая проверка допустимых настроек.

Применение и границы. Не отдавайте разобранные настройки пользователю целиком. Поддерживаемые ключи, типы, длины и значения проверяются после разбора. PHP-конфигурация уже загружена: этот вызов её не переустанавливает.

Сравните: parse_ini_string, file_get_contents. Полный выбор файловых операций.

parse_ini_stringРазобрать строку конфигурации INI в ассоциативный массив.

PHP5.3+ · standard

parse_ini_string(string $ini_string, bool $process_sections = false, int $scanner_mode = INI_SCANNER_NORMAL): array|false

Разобрать строку конфигурации INI в ассоциативный массив.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". [...] создаёт массив; $row["size"] читает поле по ключу; [$a, $b] = ... раскладывает список. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
ini_stringПолный текст INI, не имя файла.
process_sectionstrue сохраняет секции как вложенные массивы; false объединяет настройки без этого уровня.
scanner_modeNORMAL по умолчанию; RAW для недоверенного текста; TYPED для типов доверенной конфигурации.
ВозвратАссоциативный массив, false при отказе.
ОтказСинтаксические ошибки дают warning и false; неизвестный scanner_mode может дать ValueError.
ВерсияPHP5.3+

INI — строки ключ = значение, комментарии после ;, секции [mail]. roles[] добавляет элемент списка, urls[docs] задаёт ключ вложенного массива. Это разбор данных приложения: он не меняет уже загруженный php.ini. Для внешнего текста допустим только RAW, после которого всё равно нужны собственные проверки ключей и значений.

РежимЧто получается
INI_SCANNER_NORMALОбычные значения преимущественно строки; on/yes/true → "1", off/no/false/null → "". Константы и интерполяция разрешены.
INI_SCANNER_TYPEDС5.6.1 сохраняет bool/null и подходящие целые числа; числовое значение не обязательно float. Кавычки помогают сохранить строку.
INI_SCANNER_RAWНе вычисляет значения констант/выражения и не выполняет обычные escape-преобразования.

В NORMAL/TYPED отдельное имя константы может раскрыть её значение; magic constants вроде __FILE__ не вычисляются этим правилом. ${NAME} читает окружение или ранее определённую настройку; | & ^ ~ и скобки имеют значение в выражении. Для буквального ${...} в двойных кавычках экранируют доллар. Не передавайте недоверенный INI этим режимам: он способен раскрыть секретную константу.

Ключами не служат null, yes, no, true, false, on, off, none; специальные ?{}|&~!()^" также запрещены в ключах, квадратные скобки имеют синтаксическое назначение массивов. Строка без = игнорируется, а key = создаёт пустое значение. Небуквенно-цифровые значения заключайте в двойные кавычки. Экранирование кавычки/backslash отличается от PHP: обычные / не превращаются в перенос и табуляцию. Есть особое правило завершающего backslash Windows-пути перед концом строки; для сложного многострочного текста лучше выбрать явный формат данных. Соседние строки в кавычках могут соединяться. Храните конфигурацию с секретами вне public: веб-сервер обычно отдаёт .ini как текст.

Путь конкретного документа
  1. [pickup]: enabled=true, max_items=3
  2. TYPED сохраняет bool и int
  3. config[pickup] выбирает секцию
  4. Самовывоз включён; максимум 3 предмета
Настроить выдачу по секции INIСамостоятельный пример
<?php
declare(strict_types=1);

$config = parse_ini_string("[pickup]\nenabled = true\nmax_items = 3\n", true, INI_SCANNER_TYPED);
if ($config === false) { throw new RuntimeException('Не разобрать настройки'); }
$settings = $config['pickup'] ?? null;
if (!is_array($settings) || !is_bool($settings['enabled'] ?? null) || !is_int($settings['max_items'] ?? null)) {
    throw new UnexpectedValueException('Нужны enabled и max_items');
}
echo $settings['enabled'] ? "Самовывоз включён.\n" : "Самовывоз выключен.\n";
echo 'Предметов за одну выдачу: ', $settings['max_items'], "\n";
Ожидаемый результат
Самовывоз включён.
Предметов за одну выдачу: 3

true во втором аргументе сохраняет секцию pickup, INI_SCANNER_TYPED даёт bool и int для доверенных настроек. ?? null обнаруживает отсутствующее поле; проверка типов не заменяет проверку диапазона max_items. Этот файл не меняет настройки самого PHP.

Сохранить буквальное имя константыСамостоятельный пример
<?php
define("APP_LABEL", "internal");
$config = parse_ini_string("label = APP_LABEL\nroles[] = reader\nroles[] = author\n", false, INI_SCANNER_RAW);
echo $config["label"], "\n";
echo implode(",", $config["roles"]), "\n";
Ожидаемый результат
APP_LABEL
reader,author

RAW не подставляет значение APP_LABEL. Это не автоматическая проверка допустимых настроек.

Применение и границы. Не отдавайте разобранные настройки пользователю целиком. Поддерживаемые ключи, типы, длины и значения проверяются после разбора. PHP-конфигурация уже загружена: этот вызов её не переустанавливает.

Сравните: parse_ini_file, file_get_contents. Полный выбор файловых операций.

fgetssУдалённая функция чтения со снятием тегов; изучается для сопровождения старого кода, не для вызова в PHP8.

PHP4–7; deprecated7.3, removed8.0 · standard

Исторически: fgetss(resource $handle, int $length = ?, string $allowable_tags = ?): string|false

Удалённая функция чтения со снятием тегов; изучается для сопровождения старого кода, не для вызова в PHP8.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. fopen возвращает открытый поток (resource), а не содержимое файла. rb читает байты, w+b создаёт/очищает файл и разрешает чтение с записью. fclose освобождает поток. | объединяет поддерживаемые флаги; это допустимо только для параметра-маски. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
handleОткрытый поток старого API.
lengthДо length−1 байтов, как у fgets.
allowable_tagsНеобязательные теги, которые старый алгоритм оставлял.
ВозвратИсторически строка без NUL/HTML/PHP-тегов либо false при ошибке.
ОтказDeprecated7.3, удалена8.0: вызов в PHP8 даёт Error undefined function.
ВерсияPHP4–7; deprecated7.3, removed8.0
Путь данных в первом опыте
  1. Старый вызов fgetss недоступен
  2. Выбираем цель: текст или HTML-показ
  3. Читаем байты
  4. Явно преобразуем для выбранной цели
Взять простой текст из маленького HTMLСамостоятельный пример
<?php
$html = file_get_contents(__DIR__ . '/note.html');
echo strip_tags($html), "
";
Ожидаемый результат
Tea &amp; coffee

Это снятие тегов, не полный HTML-парсер и не декодирование сущностей. Не эквивалент stateful fgetss между строками.

Показать исходник как текст в HTMLСамостоятельный пример
<?php
$html = file_get_contents(__DIR__ . '/note.html');
echo htmlspecialchars($html, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), "
";
Ожидаемый результат
&lt;b&gt;Tea&lt;/b&gt;

Для вывода недоверенного текста в HTML нужна контекстная обработка, а не надежда на удаление тегов.

Применение и границы. fgetss сохраняла состояние парсера между вызовами: механическая замена каждой строки на strip_tags(fgets(...)) может изменить смысл разорванных тегов. Для полноценного HTML используйте подходящий парсер/санитайзер с явной политикой. Сохранение allowable_tags не делало атрибуты безопасными.

Сравните: fgets, file_get_contents. Полный выбор файловых операций.

chgrpИзменить группу локального файла.

PHP4+ · standard

chgrp(string $filename, string|int $group): bool

Изменить группу локального файла.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". [...] создаёт массив; $row["size"] читает поле по ключу; [$a, $b] = ... раскладывает список. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
filenameСтрока пути; относительный путь разрешается от текущего рабочего каталога (CWD), а не обязательно от папки этого исходника. Обычный chown/chgrp следует к цели символической ссылки.
groupИмя группы или числовой GID.
Возвратtrue при успехе, false при отказе.
ОтказНужны полномочия менять группу; обычный пользователь ограничен своими группами.На Windows для обычного файла chown/chgrp молча отказывают.
ВерсияPHP4+

На POSIX права разделены на owner/group/other. В каждой восьмеричной цифре чтение =4, запись =2, исполнение =1: 0600 оставляет чтение+запись владельцу; 0640 ещё разрешает группе чтение; 0750 подходит для каталога владельца/группы. У каталога x означает проход, r — чтение имён, w — изменение записей (обычно вместе с x). Ноль в начале задаёт восьмеричное число: 755 — другое десятичное значение. С8.1 есть явная запись 0o750. Это не модель Windows ACL и не право пользователя внутри вашего приложения.

Путь данных в первом опыте
  1. Учебный файл
  2. Узнать текущий gid
  3. Применить chgrp
  4. Проверить результат
Передать числовой идентификатор ОСПример для указанного окружения
<?php
$path = __DIR__ . '/data.txt';
$id = filegroup($path);
var_dump(chgrp($path, $id));

Это пример для POSIX и процесса с необходимыми правами; на Windows проверен только синтаксис. Он меняет только приложенный файл/созданную здесь ссылку, а не системные пути. При допустимой операции ожидается true; это демонстрация договора без выдуманного пользователя www-data.

Передать имя ОС и перечитать результатПример для указанного окружения
<?php
$path = __DIR__ . '/data.txt';
$id = filegroup($path);
$record = posix_getgrgid($id);
if ($record === false) { throw new RuntimeException('identity lookup'); }
$name = $record['name'];
if (!chgrp($path, $name)) { throw new RuntimeException('ownership'); }
clearstatcache();
$actual = filegroup($path);
var_dump($actual === $id);

Это пример для POSIX и процесса с необходимыми правами; на Windows проверен только синтаксис. Он меняет только приложенный файл/созданную здесь ссылку, а не системные пути. Дополнительно требуется POSIX extension: posix_getgrgid превращает числовой ID в запись с name. После clearstatcache ожидается true. В деплое нужное имя задаёт конфигурация окружения, не пользователь формы.

Применение и границы. Не работает на произвольном удалённом URL. Обычно права/владельца готовят при развёртывании, а веб-процесс не запускают с root ради загрузки файла. UID/GID ОС не равны ID пользователя в таблице сайта. Результат относится к моменту проверки и может кэшироваться; clearstatcache() обновляет stat-кэш, но не устраняет гонку между проверкой и действием.

Сравните: chown, lchown, lchgrp, chmod, fileowner, filegroup. Полный выбор файловых операций.

chownИзменить владельца локального файла.

PHP4+ · standard

chown(string $filename, string|int $user): bool

Изменить владельца локального файла.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". [...] создаёт массив; $row["size"] читает поле по ключу; [$a, $b] = ... раскладывает список. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
filenameСтрока пути; относительный путь разрешается от текущего рабочего каталога (CWD), а не обязательно от папки этого исходника. Обычный chown/chgrp следует к цели символической ссылки.
userИмя пользователя ОС или числовой UID.
Возвратtrue при успехе, false при отказе.
ОтказДля произвольной смены владельца требуются привилегии ОС, обычно superuser.На Windows для обычного файла chown/chgrp молча отказывают.
ВерсияPHP4+

На POSIX права разделены на owner/group/other. В каждой восьмеричной цифре чтение =4, запись =2, исполнение =1: 0600 оставляет чтение+запись владельцу; 0640 ещё разрешает группе чтение; 0750 подходит для каталога владельца/группы. У каталога x означает проход, r — чтение имён, w — изменение записей (обычно вместе с x). Ноль в начале задаёт восьмеричное число: 755 — другое десятичное значение. С8.1 есть явная запись 0o750. Это не модель Windows ACL и не право пользователя внутри вашего приложения.

Путь данных в первом опыте
  1. Учебный файл
  2. Узнать текущий uid
  3. Применить chown
  4. Проверить результат
Передать числовой идентификатор ОСПример для указанного окружения
<?php
$path = __DIR__ . '/data.txt';
$id = fileowner($path);
var_dump(chown($path, $id));

Это пример для POSIX и процесса с необходимыми правами; на Windows проверен только синтаксис. Он меняет только приложенный файл/созданную здесь ссылку, а не системные пути. При допустимой операции ожидается true; это демонстрация договора без выдуманного пользователя www-data.

Передать имя ОС и перечитать результатПример для указанного окружения
<?php
$path = __DIR__ . '/data.txt';
$id = fileowner($path);
$record = posix_getpwuid($id);
if ($record === false) { throw new RuntimeException('identity lookup'); }
$name = $record['name'];
if (!chown($path, $name)) { throw new RuntimeException('ownership'); }
clearstatcache();
$actual = fileowner($path);
var_dump($actual === $id);

Это пример для POSIX и процесса с необходимыми правами; на Windows проверен только синтаксис. Он меняет только приложенный файл/созданную здесь ссылку, а не системные пути. Дополнительно требуется POSIX extension: posix_getpwuid превращает числовой ID в запись с name. После clearstatcache ожидается true. В деплое нужное имя задаёт конфигурация окружения, не пользователь формы.

Применение и границы. Не работает на произвольном удалённом URL. Обычно права/владельца готовят при развёртывании, а веб-процесс не запускают с root ради загрузки файла. UID/GID ОС не равны ID пользователя в таблице сайта. Результат относится к моменту проверки и может кэшироваться; clearstatcache() обновляет stat-кэш, но не устраняет гонку между проверкой и действием.

Сравните: chgrp, lchown, lchgrp, chmod, fileowner, filegroup. Полный выбор файловых операций.

lchgrpИзменить группу самой символической ссылки, не её цели.

PHP5.1.3+ · standard

lchgrp(string $filename, string|int $group): bool

Изменить группу самой символической ссылки, не её цели.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". [...] создаёт массив; $row["size"] читает поле по ключу; [$a, $b] = ... раскладывает список. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
filenameСтрока пути; относительный путь разрешается от текущего рабочего каталога (CWD), а не обязательно от папки этого исходника. Путь к символической ссылке.
groupИмя группы или числовой GID.
Возвратtrue при успехе, false при отказе.
ОтказНужны полномочия менять группу; обычный пользователь ограничен своими группами. На Windows lchown/lchgrp не реализованы.
ВерсияPHP5.1.3+

Символическая ссылка хранит путь к другой записи; относительная цель разрешается от папки ссылки. Hard link — ещё одно имя того же файла в одной файловой системе: отдельного «содержимого ссылки» у него нет. Удаление имени и удаление всех данных — разные события. Создание symlink на Windows зависит от прав/режима ОС, поэтому здесь такие примеры помечены условными.

Путь данных в первом опыте
  1. Учебный файл/ссылка
  2. Узнать текущий gid
  3. Применить lchgrp
  4. Проверить результат
Передать числовой идентификатор ОСПример для указанного окружения
<?php
symlink('data.txt', __DIR__ . '/shortcut');
$path = __DIR__ . '/shortcut';
$id = lstat($path)['gid'];
var_dump(lchgrp($path, $id));
unlink($path);

Это пример для POSIX и процесса с необходимыми правами; на Windows проверен только синтаксис. Он меняет только приложенный файл/созданную здесь ссылку, а не системные пути. При допустимой операции ожидается true; это демонстрация договора без выдуманного пользователя www-data.

Передать имя ОС и перечитать результатПример для указанного окружения
<?php
symlink('data.txt', __DIR__ . '/shortcut');
$path = __DIR__ . '/shortcut';
$id = lstat($path)['gid'];
$record = posix_getgrgid($id);
if ($record === false) { throw new RuntimeException('identity lookup'); }
$name = $record['name'];
if (!lchgrp($path, $name)) { throw new RuntimeException('ownership'); }
clearstatcache();
$actual = lstat($path)['gid'];
var_dump($actual === $id);
unlink($path);

Это пример для POSIX и процесса с необходимыми правами; на Windows проверен только синтаксис. Он меняет только приложенный файл/созданную здесь ссылку, а не системные пути. Дополнительно требуется POSIX extension: posix_getgrgid превращает числовой ID в запись с name. После clearstatcache ожидается true. В деплое нужное имя задаёт конфигурация окружения, не пользователь формы.

Применение и границы. Не работает на произвольном удалённом URL. Обычно права/владельца готовят при развёртывании, а веб-процесс не запускают с root ради загрузки файла. UID/GID ОС не равны ID пользователя в таблице сайта. Результат относится к моменту проверки и может кэшироваться; clearstatcache() обновляет stat-кэш, но не устраняет гонку между проверкой и действием.

Сравните: chown, chgrp, lchown, chmod, fileowner, filegroup. Полный выбор файловых операций.

lchownИзменить владельца самой символической ссылки, не её цели.

PHP5.1.3+ · standard

lchown(string $filename, string|int $user): bool

Изменить владельца самой символической ссылки, не её цели.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". [...] создаёт массив; $row["size"] читает поле по ключу; [$a, $b] = ... раскладывает список. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
filenameСтрока пути; относительный путь разрешается от текущего рабочего каталога (CWD), а не обязательно от папки этого исходника. Путь к символической ссылке.
userИмя пользователя ОС или числовой UID.
Возвратtrue при успехе, false при отказе.
ОтказДля произвольной смены владельца требуются привилегии ОС, обычно superuser. На Windows lchown/lchgrp не реализованы.
ВерсияPHP5.1.3+

Символическая ссылка хранит путь к другой записи; относительная цель разрешается от папки ссылки. Hard link — ещё одно имя того же файла в одной файловой системе: отдельного «содержимого ссылки» у него нет. Удаление имени и удаление всех данных — разные события. Создание symlink на Windows зависит от прав/режима ОС, поэтому здесь такие примеры помечены условными.

Путь данных в первом опыте
  1. Учебный файл/ссылка
  2. Узнать текущий uid
  3. Применить lchown
  4. Проверить результат
Передать числовой идентификатор ОСПример для указанного окружения
<?php
symlink('data.txt', __DIR__ . '/shortcut');
$path = __DIR__ . '/shortcut';
$id = lstat($path)['uid'];
var_dump(lchown($path, $id));
unlink($path);

Это пример для POSIX и процесса с необходимыми правами; на Windows проверен только синтаксис. Он меняет только приложенный файл/созданную здесь ссылку, а не системные пути. При допустимой операции ожидается true; это демонстрация договора без выдуманного пользователя www-data.

Передать имя ОС и перечитать результатПример для указанного окружения
<?php
symlink('data.txt', __DIR__ . '/shortcut');
$path = __DIR__ . '/shortcut';
$id = lstat($path)['uid'];
$record = posix_getpwuid($id);
if ($record === false) { throw new RuntimeException('identity lookup'); }
$name = $record['name'];
if (!lchown($path, $name)) { throw new RuntimeException('ownership'); }
clearstatcache();
$actual = lstat($path)['uid'];
var_dump($actual === $id);
unlink($path);

Это пример для POSIX и процесса с необходимыми правами; на Windows проверен только синтаксис. Он меняет только приложенный файл/созданную здесь ссылку, а не системные пути. Дополнительно требуется POSIX extension: posix_getpwuid превращает числовой ID в запись с name. После clearstatcache ожидается true. В деплое нужное имя задаёт конфигурация окружения, не пользователь формы.

Применение и границы. Не работает на произвольном удалённом URL. Обычно права/владельца готовят при развёртывании, а веб-процесс не запускают с root ради загрузки файла. UID/GID ОС не равны ID пользователя в таблице сайта. Результат относится к моменту проверки и может кэшироваться; clearstatcache() обновляет stat-кэш, но не устраняет гонку между проверкой и действием.

Сравните: chown, chgrp, lchgrp, chmod, fileowner, filegroup. Полный выбор файловых операций.

chmodИзменить режим доступа POSIX-файла; числовая маска отличается от текста команды shell.

PHP 4+ · standard

chmod(string $filename, int $permissions): bool

Изменить режим доступа POSIX-файла; числовая маска отличается от текста команды shell.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". & оставляет биты маски, ~ инвертирует биты; число с ведущим 0 восьмеричное. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
filenameСтрока пути; относительный путь разрешается от текущего рабочего каталога (CWD), а не обязательно от папки этого исходника. Локальная файловая система.
permissionsЧисло режима, обычно восьмеричное 0600/0640/0750. Строки u+rwx и g+w не являются синтаксисом PHP-функции.
Возвратtrue при успехе, false при отказе.
ОтказE_WARNING при отказе; обычно менять режим может владелец файла или привилегированный процесс.
ВерсияPHP 4+

На POSIX права разделены на owner/group/other. В каждой восьмеричной цифре чтение =4, запись =2, исполнение =1: 0600 оставляет чтение+запись владельцу; 0640 ещё разрешает группе чтение; 0750 подходит для каталога владельца/группы. У каталога x означает проход, r — чтение имён, w — изменение записей (обычно вместе с x). Ноль в начале задаёт восьмеричное число: 755 — другое десятичное значение. С8.1 есть явная запись 0o750. Это не модель Windows ACL и не право пользователя внутри вашего приложения.

Путь данных в первом опыте
  1. Учебный private.txt
  2. chmod(...,0600)
  3. Только owner read+write
  4. Проверить младшие биты
Оставить файл только владельцуПример для указанного окружения
<?php
$path = __DIR__ . '/private.txt';
if (!chmod($path, 0600)) { throw new RuntimeException('chmod'); }
clearstatcache();
echo decoct(fileperms($path) & 0777), "
";

Это пример для POSIX и процесса с необходимыми правами; на Windows проверен только синтаксис. Он меняет только приложенный файл/созданную здесь ссылку, а не системные пути. Ожидается 600. & оставляет биты маски; decoct показывает число в восьмеричной записи.

Дать группе чтение готового отчётаПример для указанного окружения
<?php
$path = __DIR__ . '/report.txt';
if (!chmod($path, 0640)) { throw new RuntimeException('chmod'); }
clearstatcache();
echo decoct(fileperms($path) & 0777), "
";

Это пример для POSIX и процесса с необходимыми правами; на Windows проверен только синтаксис. Он меняет только приложенный файл/созданную здесь ссылку, а не системные пути. Ожидается 640; членство процесса в группе и право пройти родительские каталоги проверяются отдельно.

Применение и границы. Не лечите каждый отказ режимом 0777: сначала определите пользователя процесса и нужные права. Windows chmod в основном управляет read-only атрибутом и не заменяет ACL. chmod после создания не устраняет окно доступа, если изначально файл создан слишком открыто; начальные режимы/umask готовят на уровне окружения.

Сравните: fileperms, umask, mkdir, chown, chgrp. Полный выбор файловых операций.

umaskУзнать или временно изменить маску прав, убираемых при создании новых файлов.

PHP4+; nullable mask8.0 · standard

umask(?int $mask = null): int

Узнать или временно изменить маску прав, убираемых при создании новых файлов.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. try выполняет попытку, catch обрабатывает указанный отказ, finally освобождает ресурс и не подавляет ошибку. throw new RuntimeException сообщает о сбое. & оставляет биты маски, ~ инвертирует биты; число с ведущим 0 восьмеричное. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
masknull/пропуск — прочитать текущую маску. Иначе установить mask & 0777; это маска запретов, не итоговые права.
ВозвратПри чтении текущая маска, при установке предыдущая маска.
ОтказВ многопоточном сервере изменение затрагивает общий процесс и может повлиять на соседние запросы.
ВерсияPHP4+; nullable mask8.0

На POSIX права разделены на owner/group/other. В каждой восьмеричной цифре чтение =4, запись =2, исполнение =1: 0600 оставляет чтение+запись владельцу; 0640 ещё разрешает группе чтение; 0750 подходит для каталога владельца/группы. У каталога x означает проход, r — чтение имён, w — изменение записей (обычно вместе с x). Ноль в начале задаёт восьмеричное число: 755 — другое десятичное значение. С8.1 есть явная запись 0o750. Это не модель Windows ACL и не право пользователя внутри вашего приложения.

Путь данных в первом опыте
  1. Запрошено 0777
  2. Маска0027 убирает права
  3. Новый каталог0750
  4. Старая маска восстановлена
Увидеть маску как число без измененияСамостоятельный пример
<?php
$requested = 0777;
$mask = 0027;
echo decoct($requested & ~$mask), "
";
var_dump(is_int(umask()));
Ожидаемый результат
750
bool(true)

~ инвертирует биты, & оставляет разрешённые. Вычисление показывает POSIX-правило, но не обещает Windows ACL.

Восстановить прежнее значение после созданияПример для указанного окружения
<?php
$old = umask(0027);
try {
    mkdir(__DIR__ . '/private-dir', 0777);
    clearstatcache();
    echo decoct(fileperms(__DIR__ . '/private-dir') & 0777), "
";
} finally { umask($old); }

Это пример для POSIX и процесса с необходимыми правами; на Windows проверен только синтаксис. Он меняет только приложенный файл/созданную здесь ссылку, а не системные пути. Ожидается 750. Этот пример для отдельного CLI-процесса, а не общего многопоточного веб-сервера.

Применение и границы. PHP server-module восстанавливает маску после запроса, но это не предотвращает гонки во время запроса. Для процесса с потоками не меняйте umask на ходу; задайте безопасное окружение при запуске. Маска влияет на создание, а не переписывает режим уже существующего файла.

Сравните: chmod, mkdir, fopen. Полный выбор файловых операций.

mkdirСоздать каталог, при необходимости вместе с отсутствующими родителями.

PHP 4+ · standard

mkdir(string $directory, int $permissions = 0777, bool $recursive = false, ?resource $context = null): bool

Создать каталог, при необходимости вместе с отсутствующими родителями.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
directoryСтрока пути; относительный путь разрешается от текущего рабочего каталога (CWD), а не обязательно от папки этого исходника. Поддержка URL зависит от обёртки.
permissions0777 по умолчанию; модифицируется umask, на Windows игнорируется.
recursivetrue создаёт отсутствующих родителей с тем же запрошенным режимом.
contextКонтекст обёртки или null.
Возвратtrue если создан, false если не получилось; уже существующий каталог тоже считается отказом.
ОтказE_WARNING при существующем каталоге/недостатке прав.
ВерсияPHP 4+

На POSIX права разделены на owner/group/other. В каждой восьмеричной цифре чтение =4, запись =2, исполнение =1: 0600 оставляет чтение+запись владельцу; 0640 ещё разрешает группе чтение; 0750 подходит для каталога владельца/группы. У каталога x означает проход, r — чтение имён, w — изменение записей (обычно вместе с x). Ноль в начале задаёт восьмеричное число: 755 — другое десятичное значение. С8.1 есть явная запись 0o750. Это не модель Windows ACL и не право пользователя внутри вашего приложения.

Путь конкретного документа
  1. mkdir создаёт pickup
  2. file_put_contents создаёт pickup/104.txt
  3. Чтение показывает 104: ready
Создать папку выдачи и первый документСамостоятельный пример
<?php
declare(strict_types=1);

$folder = __DIR__ . '/pickup';
if (!mkdir($folder, 0700)) { throw new RuntimeException('Не создать папку'); }
$text = "104: ready\n";
if (file_put_contents($folder . '/104.txt', $text) !== strlen($text)) {
    throw new RuntimeException('Не сохранить документ');
}
echo 'pickup/104.txt: ', file_get_contents($folder . '/104.txt');
Ожидаемый результат
pickup/104.txt: 104: ready

mkdir создаёт каталог, file_put_contents — файл внутри. Права 0700 относятся к POSIX и дополнительно ограничиваются umask; Windows использует ACL. Повторное mkdir существующего каталога — отказ, поэтому первый опыт запускают в новой папке.

Создать вложенный каталог месячного отчётаСамостоятельный пример
<?php
declare(strict_types=1);

$folder = __DIR__ . '/reports/2026/10';
if (!mkdir($folder, 0700, true)) { throw new RuntimeException('Не создать цепочку папок'); }
$text = "Октябрь: выдано 3 заказа\n";
if (file_put_contents($folder . '/summary.txt', $text) !== strlen($text)) { throw new RuntimeException('Не записать итог'); }
echo 'reports/2026/10/summary.txt: ', file_get_contents($folder . '/summary.txt');
Ожидаемый результат
reports/2026/10/summary.txt: Октябрь: выдано 3 заказа

Третий аргумент true разрешает создавать отсутствующих родителей. Это не изменение прав всех уже существующих папок. Путь полностью задан учебным кодом.

Применение и границы. is_dir перед mkdir помогает выбрать ветку, но другой процесс может создать каталог между проверкой и вызовом. Обрабатывайте фактический результат и диагностику. Не превращайте пользовательскую строку в произвольный путь дерева.

Сравните: is_dir, rmdir, umask, chmod. Полный выбор файловых операций.

rmdirУдалить пустой каталог; функция не обходит и не стирает всё дерево.

PHP 4+ · standard

rmdir(string $directory, ?resource $context = null): bool

Удалить пустой каталог; функция не обходит и не стирает всё дерево.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
directoryСтрока пути; относительный путь разрешается от текущего рабочего каталога (CWD), а не обязательно от папки этого исходника. Каталог должен быть пустым.
contextКонтекст обёртки или null.
Возвратtrue при успехе, false при отказе.
ОтказE_WARNING при непустом каталоге/недостатке прав/другом отказе.
ВерсияPHP 4+
Путь конкретного документа
  1. Создана папка job-104
  2. Задание завершено, папка пуста
  3. rmdir удаляет job-104
Удалить пустую рабочую папку завершённого заданияСамостоятельный пример
<?php
declare(strict_types=1);

$folder = __DIR__ . '/job-104';
if (!mkdir($folder)) { throw new RuntimeException('Не создать рабочую папку'); }
if (!rmdir($folder)) { throw new RuntimeException('Не удалить пустую папку'); }
echo is_dir($folder) ? "Рабочая папка ещё существует.\n" : "job-104 удалена после завершения задания.\n";
Ожидаемый результат
job-104 удалена после завершения задания.

rmdir удаляет только пустой каталог; файл удаляют через unlink. Здесь удаляется только папка, созданная этим же запуском, без рекурсивного обхода.

Закончить отчёт и убрать его известный временный файлСамостоятельный пример
<?php
declare(strict_types=1);

$folder = __DIR__ . '/job-104';
if (!mkdir($folder)) { throw new RuntimeException('Не создать рабочую папку'); }
$path = $folder . '/part.txt';
file_put_contents($path, "104: ready\n");
echo 'Готовый текст: ', file_get_contents($path);
if (!unlink($path) || !rmdir($folder)) { throw new RuntimeException('Не убрать рабочие файлы'); }
echo "Промежуточный файл и пустая папка удалены.\n";
Ожидаемый результат
Готовый текст: 104: ready
Промежуточный файл и пустая папка удалены.

Сначала удаляется точно известный part.txt, затем пустой каталог. Универсальную рекурсивную очистку из этого примера не выводим: там отдельно задаются границы, ссылки и чужие файлы.

Применение и границы. Для Windows symlink на каталог применяется rmdir к самой ссылке. Не переходите по символическим ссылкам при очистке дерева; чужие файлы и concurrent writers способны сделать каталог непустым снова.

Сравните: mkdir, unlink, is_dir. Полный выбор файловых операций.

touchПоставить время изменения/доступа; отсутствующий файл будет создан пустым.

PHP4+; nullable mtime/atime8.0 · standard

touch(string $filename, ?int $mtime = null, ?int $atime = null): bool

Поставить время изменения/доступа; отсутствующий файл будет создан пустым.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
filenameСтрока пути; относительный путь разрешается от текущего рабочего каталога (CWD), а не обязательно от папки этого исходника.
mtimeUnix timestamp или null для текущего времени.
atimeОтдельное время доступа; null использует mtime, а если оба null — текущее время. Время доступа меняется даже при одном аргументе.
Возвратtrue при успехе, false при отказе.
ОтказПрава и поддержка файловой системы могут привести к отказу/предупреждению.
ВерсияPHP4+; nullable mtime/atime8.0
Путь конкретного документа
  1. report.ready отсутствует
  2. touch создаёт пустой маркер
  3. mtime задан фиксированным timestamp
  4. Размер 0; время показано в UTC
Создать метку готовности отчёта с известным временемСамостоятельный пример
<?php
declare(strict_types=1);

$path = __DIR__ . '/report.ready';
if (!touch($path, 1600000000)) { throw new RuntimeException('Не создать метку'); }
clearstatcache();
echo 'Метка готовности: ', basename($path), "\n";
echo 'Время UTC: ', gmdate('Y-m-d H:i:s', filemtime($path)), "\n";
echo 'Содержимое: ', filesize($path), " байт\n";
Ожидаемый результат
Метка готовности: report.ready
Время UTC: 2020-09-13 12:26:40
Содержимое: 0 байт

Маркер — пустой файл, смысл которого задаёт приложение. touch создаёт его и задаёт mtime; фиксированное время делает опыт повторяемым. Наличие маркера не заменяет межпроцессную блокировку и не доказывает целостность отчёта.

Времена меняются, содержимое остаётсяСамостоятельный пример
<?php
$path = __DIR__ . '/report.txt';
touch($path, 1600000000, 1600000060);
clearstatcache();
echo filemtime($path), ':', fileatime($path), "
";
echo file_get_contents($path), "
";
Ожидаемый результат
1600000000:1600000060
REPORT

atime читается до чтения тела: само чтение на некоторых FS тоже меняет время доступа.

Применение и границы. Разрешение timestamp зависит от файловой системы. Маркер существования не является межпроцессной блокировкой и не заменяет транзакцию. Для честной бизнес-даты храните отдельное поле, а не полагайтесь на файловый mtime.

Сравните: filemtime, fileatime, flock. Полный выбор файловых операций.

linkinfoПолучить поле устройства st_dev через lstat; это не текст цели и не надёжный bool-тест symlink.

PHP 4+ · standard

linkinfo(string $path): int|false

Получить поле устройства st_dev через lstat; это не текст цели и не надёжный bool-тест symlink.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
pathЛокальный путь записи.
ВозвратНеотрицательный номер устройства при успехе; −1 если запись не найдена; false при нарушении open_basedir.
ОтказСбой может сопровождаться warning. Нулевой номер устройства допустим, поэтому if (!linkinfo(...)) ошибочен.
ВерсияPHP 4+

Символическая ссылка хранит путь к другой записи; относительная цель разрешается от папки ссылки. Hard link — ещё одно имя того же файла в одной файловой системе: отдельного «содержимого ссылки» у него нет. Удаление имени и удаление всех данных — разные события. Создание symlink на Windows зависит от прав/режима ОС, поэтому здесь такие примеры помечены условными.

Путь данных в первом опыте
  1. Обычный a.txt тоже имеет st_dev
  2. linkinfo читает метаданные
  3. Неотрицательное число
  4. Тип ссылки проверяет is_link
Обычный файл тоже даёт информациюСамостоятельный пример
<?php
$path = __DIR__ . '/a.txt';
$device = linkinfo($path);
var_dump(is_int($device) && $device >= 0, is_link($path));
Ожидаемый результат
bool(true)
bool(false)

Успех linkinfo не означает, что запись символическая.

Сравнить устройство двух собственных файловСамостоятельный пример
<?php
$a = linkinfo(__DIR__ . '/a.txt');
$b = linkinfo(__DIR__ . '/b.txt');
if ($a === false || $a < 0 || $b === false || $b < 0) { throw new RuntimeException('lstat'); }
var_dump($a === $b);
Ожидаемый результат
bool(true)

Одинаковый device в этой папке не говорит, что это один и тот же файл; для этого нужны дополнительные идентификаторы.

Применение и границы. Общую фразу Manual о проверке существования ссылки следует читать вместе с фактическим возвратом st_dev: используйте is_link для типа, readlink для цели. Значение устройства платформенно зависимо, не бизнес-ID.

Сравните: is_link, readlink, lstat, fileinode. Полный выбор файловых операций.

fflushПередать накопленный буфер потока нижележащей системе.

PHP4.0.1+ · standard

fflush(resource $stream): bool

Передать накопленный буфер потока нижележащей системе.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. fopen возвращает открытый поток (resource), а не содержимое файла. rb читает байты, w+b создаёт/очищает файл и разрешает чтение с записью. fclose освобождает поток. foreach берёт элементы массива по одному, форма as $key => $value также читает ключ. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". try выполняет попытку, catch обрабатывает указанный отказ, finally освобождает ресурс и не подавляет ошибку. throw new RuntimeException сообщает о сбое. [...] создаёт массив; $row["size"] читает поле по ключу; [$a, $b] = ... раскладывает список. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
streamОткрытый совместимый поток (resource). Закрытый или чужой ресурс в PHP 8 приводит к TypeError; возможности зависят от обёртки. Для fsync/fdatasync необходим поток с поддержкой системной синхронизации, обычно локальный файл.
Возвратtrue при успехе, false при отказе.
ОтказНеподходящий поток/FS может отказать с диагностикой; закрытый ресурс PHP8 — TypeError.
ВерсияPHP4.0.1+
Путь конкретного документа
  1. В journal.txt записано 104: ready
  2. Проверен результат fflush
  3. Открытый ресурс закрыт
  4. Содержимое журнала показано после записи
Сохранить памятку и проверить fflushСамостоятельный пример
<?php
declare(strict_types=1);

$path = __DIR__ . '/journal.txt';
$stream = fopen($path, 'w+b');
if ($stream === false) { throw new RuntimeException('Не открыть журнал'); }
try {
    foreach (['104: ready'] as $event) {
        $line = $event . "\n";
        if (fwrite($stream, $line) !== strlen($line)) { throw new RuntimeException('Неполная запись'); }
    }
    if (!fflush($stream)) { throw new RuntimeException('Не выполнить fflush'); }
} finally { fclose($stream); }
echo file_get_contents($path);
Ожидаемый результат
104: ready

fflush проверяется после одной записи. fflush передаёт буфер нижележащей системе; fsync и fdatasync запрашивают системную синхронизацию. Успешный локальный вызов не является экспериментом с отключением питания. На Windows fdatasync — alias fsync.

Сохранить партию памяток и проверить fflushСамостоятельный пример
<?php
declare(strict_types=1);

$path = __DIR__ . '/journal.txt';
$stream = fopen($path, 'w+b');
if ($stream === false) { throw new RuntimeException('Не открыть журнал'); }
try {
    foreach (['104: ready', '105: ready'] as $event) {
        $line = $event . "\n";
        if (fwrite($stream, $line) !== strlen($line)) { throw new RuntimeException('Неполная запись'); }
    }
    if (!fflush($stream)) { throw new RuntimeException('Не выполнить fflush'); }
} finally { fclose($stream); }
echo file_get_contents($path);
Ожидаемый результат
104: ready
105: ready

fflush проверяется после всей партии. fflush передаёт буфер нижележащей системе; fsync и fdatasync запрашивают системную синхронизацию. Успешный локальный вызов не является экспериментом с отключением питания. На Windows fdatasync — alias fsync.

Применение и границы. fflush очищает буфер потока; это не приказ устойчиво сохранить носитель. Он нужен, например, до снятия flock, но не заменяет fsync. Дорогая синхронизация способна увеличить задержку запросов. Успешный тест не доказывает поведение при аварии питания.

Сравните: fsync, fdatasync, flock. Полный выбор файловых операций.

fsyncПопросить ОС синхронизировать данные файла и метаданные с хранилищем.

PHP8.1+ · standard

fsync(resource $stream): bool

Попросить ОС синхронизировать данные файла и метаданные с хранилищем.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. fopen возвращает открытый поток (resource), а не содержимое файла. rb читает байты, w+b создаёт/очищает файл и разрешает чтение с записью. fclose освобождает поток. foreach берёт элементы массива по одному, форма as $key => $value также читает ключ. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". try выполняет попытку, catch обрабатывает указанный отказ, finally освобождает ресурс и не подавляет ошибку. throw new RuntimeException сообщает о сбое. [...] создаёт массив; $row["size"] читает поле по ключу; [$a, $b] = ... раскладывает список. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
streamОткрытый совместимый поток (resource). Закрытый или чужой ресурс в PHP 8 приводит к TypeError; возможности зависят от обёртки. Для fsync/fdatasync необходим поток с поддержкой системной синхронизации, обычно локальный файл.
Возвратtrue при успехе, false при отказе.
ОтказНеподходящий поток/FS может отказать с диагностикой; закрытый ресурс PHP8 — TypeError.
ВерсияPHP8.1+
Путь конкретного документа
  1. В journal.txt записано 104: ready
  2. Проверен результат fsync
  3. Открытый ресурс закрыт
  4. Содержимое журнала показано после записи
Сохранить памятку и проверить fsyncСамостоятельный пример
<?php
declare(strict_types=1);

$path = __DIR__ . '/journal.txt';
$stream = fopen($path, 'w+b');
if ($stream === false) { throw new RuntimeException('Не открыть журнал'); }
try {
    foreach (['104: ready'] as $event) {
        $line = $event . "\n";
        if (fwrite($stream, $line) !== strlen($line)) { throw new RuntimeException('Неполная запись'); }
    }
    if (!fsync($stream)) { throw new RuntimeException('Не выполнить fsync'); }
} finally { fclose($stream); }
echo file_get_contents($path);
Ожидаемый результат
104: ready

fsync проверяется после одной записи. fflush передаёт буфер нижележащей системе; fsync и fdatasync запрашивают системную синхронизацию. Успешный локальный вызов не является экспериментом с отключением питания. На Windows fdatasync — alias fsync.

Сохранить партию памяток и проверить fsyncСамостоятельный пример
<?php
declare(strict_types=1);

$path = __DIR__ . '/journal.txt';
$stream = fopen($path, 'w+b');
if ($stream === false) { throw new RuntimeException('Не открыть журнал'); }
try {
    foreach (['104: ready', '105: ready'] as $event) {
        $line = $event . "\n";
        if (fwrite($stream, $line) !== strlen($line)) { throw new RuntimeException('Неполная запись'); }
    }
    if (!fsync($stream)) { throw new RuntimeException('Не выполнить fsync'); }
} finally { fclose($stream); }
echo file_get_contents($path);
Ожидаемый результат
104: ready
105: ready

fsync проверяется после всей партии. fflush передаёт буфер нижележащей системе; fsync и fdatasync запрашивают системную синхронизацию. Успешный локальный вызов не является экспериментом с отключением питания. На Windows fdatasync — alias fsync.

Применение и границы. fsync включает метаданные файла, но не делает несколько файлов/rename/запись БД единой транзакцией. Для устойчивого протокола важны также каталог, FS, контроллер и порядок операций. Дорогая синхронизация способна увеличить задержку запросов. Успешный тест не доказывает поведение при аварии питания.

Сравните: fflush, fdatasync, flock. Полный выбор файловых операций.

fdatasyncСинхронизировать данные файла без общего требования синхронизировать все метаданные.

PHP8.1+ · standard

fdatasync(resource $stream): bool

Синхронизировать данные файла без общего требования синхронизировать все метаданные.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. fopen возвращает открытый поток (resource), а не содержимое файла. rb читает байты, w+b создаёт/очищает файл и разрешает чтение с записью. fclose освобождает поток. foreach берёт элементы массива по одному, форма as $key => $value также читает ключ. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". try выполняет попытку, catch обрабатывает указанный отказ, finally освобождает ресурс и не подавляет ошибку. throw new RuntimeException сообщает о сбое. [...] создаёт массив; $row["size"] читает поле по ключу; [$a, $b] = ... раскладывает список. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
streamОткрытый совместимый поток (resource). Закрытый или чужой ресурс в PHP 8 приводит к TypeError; возможности зависят от обёртки. Для fsync/fdatasync необходим поток с поддержкой системной синхронизации, обычно локальный файл.
Возвратtrue при успехе, false при отказе.
ОтказНеподходящий поток/FS может отказать с диагностикой; закрытый ресурс PHP8 — TypeError.
ВерсияPHP8.1+
Путь конкретного документа
  1. В journal.txt записано 104: ready
  2. Проверен результат fdatasync
  3. Открытый ресурс закрыт
  4. Содержимое журнала показано после записи
Сохранить памятку и проверить fdatasyncСамостоятельный пример
<?php
declare(strict_types=1);

$path = __DIR__ . '/journal.txt';
$stream = fopen($path, 'w+b');
if ($stream === false) { throw new RuntimeException('Не открыть журнал'); }
try {
    foreach (['104: ready'] as $event) {
        $line = $event . "\n";
        if (fwrite($stream, $line) !== strlen($line)) { throw new RuntimeException('Неполная запись'); }
    }
    if (!fdatasync($stream)) { throw new RuntimeException('Не выполнить fdatasync'); }
} finally { fclose($stream); }
echo file_get_contents($path);
Ожидаемый результат
104: ready

fdatasync проверяется после одной записи. fflush передаёт буфер нижележащей системе; fsync и fdatasync запрашивают системную синхронизацию. Успешный локальный вызов не является экспериментом с отключением питания. На Windows fdatasync — alias fsync.

Сохранить партию памяток и проверить fdatasyncСамостоятельный пример
<?php
declare(strict_types=1);

$path = __DIR__ . '/journal.txt';
$stream = fopen($path, 'w+b');
if ($stream === false) { throw new RuntimeException('Не открыть журнал'); }
try {
    foreach (['104: ready', '105: ready'] as $event) {
        $line = $event . "\n";
        if (fwrite($stream, $line) !== strlen($line)) { throw new RuntimeException('Неполная запись'); }
    }
    if (!fdatasync($stream)) { throw new RuntimeException('Не выполнить fdatasync'); }
} finally { fclose($stream); }
echo file_get_contents($path);
Ожидаемый результат
104: ready
105: ready

fdatasync проверяется после всей партии. fflush передаёт буфер нижележащей системе; fsync и fdatasync запрашивают системную синхронизацию. Успешный локальный вызов не является экспериментом с отключением питания. На Windows fdatasync — alias fsync.

Применение и границы. fdatasync отличается от fsync по метаданным на POSIX; на Windows является alias fsync. Метаданные, нужные для чтения данных (например размер), могут всё же требоваться ОС. Дорогая синхронизация способна увеличить задержку запросов. Успешный тест не доказывает поведение при аварии питания.

Сравните: fflush, fsync, flock. Полный выбор файловых операций.

set_file_bufferПсевдоним stream_set_write_buffer: попросить поток изменить размер буфера записи.

PHP 4+ · standard

set_file_buffer(resource $stream, int $size): int

Псевдоним stream_set_write_buffer: попросить поток изменить размер буфера записи.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. fopen возвращает открытый поток (resource), а не содержимое файла. rb читает байты, w+b создаёт/очищает файл и разрешает чтение с записью. fclose освобождает поток. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
streamОткрытый совместимый поток (resource). Закрытый или чужой ресурс в PHP 8 приводит к TypeError; возможности зависят от обёртки. Поток должен поддержать эту настройку.
sizeРазмер буфера в байтах; 0 — запрос записи без буферизации.
Возврат0 — запрос принят; другое число — не удалось выполнить. Проверяйте !== 0, не bool.
ОтказПоддержка зависит от потока; успешный fopen не обещает поддержку настройки.
ВерсияPHP 4+

Основной контракт: stream_set_write_buffer.

Путь данных в первом опыте
  1. Открыт out.txt
  2. Запрос size0
  3. Проверка статуса
  4. Обычная запись с обработкой отказа
Проверить поддержку без предположения о результатеСамостоятельный пример
<?php
$h = fopen(__DIR__ . '/out.txt', 'wb');
if ($h === false) { throw new RuntimeException('open'); }
$result = set_file_buffer($h, 0);
var_dump(is_int($result));
fwrite($h, 'OK');
fclose($h);
echo file_get_contents(__DIR__ . '/out.txt'), "
";
Ожидаемый результат
bool(true)
OK

Тип результата стабилен; конкретный статус различается по обёртке. Запись сама по себе от этого не становится запрещённой.

Сравнить alias с основным именемСамостоятельный пример
<?php
$h = fopen(__DIR__ . '/out.txt', 'wb');
if ($h === false) { throw new RuntimeException('open'); }
$alias = set_file_buffer($h, 4096);
$main = stream_set_write_buffer($h, 4096);
var_dump($alias === $main);
fclose($h);
Ожидаемый результат
bool(true)

Оба имени вызывают одну реализацию; необязательно дают0 в конкретном потоке.

Применение и границы. Отключение буфера не является flock и не гарантирует, что несколько вызовов fwrite другой процесс увидит как одно действие. Это также не fsync. Размер буфера выбирают измерением, а не правилом «чем больше, тем быстрее».

Сравните: fflush, fwrite, flock. Полный выбор файловых операций.

tempnamСоздать пустой временный файл с уникальным именем и получить полный путь к уже созданному файлу.

PHP 4+ · standard

tempnam(string $directory, string $prefix): string|false

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

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". try выполняет попытку, catch обрабатывает указанный отказ, finally освобождает ресурс и не подавляет ошибку. throw new RuntimeException сообщает о сбое. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
directoryПредпочтительная папка. Если отсутствует/незаписываема, возможен fallback в системную temp; проверяйте фактическую папку.
prefixНачало имени, не полный filename/суффикс. Используются первые63 символа; на Windows первые3.
ВозвратПолный путь нового файла, false при отказе; POSIX-запрошенные права0600.
ОтказС7.1 fallback сопровождается notice. Длина имени зависит от платформы; с8.4 создаваемые имена стали на13байтов длиннее, не стройте код на фиксированной длине.
ВерсияPHP 4+
Путь конкретного документа
  1. tempnam создаёт пустой файл в папке примера
  2. Проверка фактического каталога
  3. Запись «Заказ 104 готов»
  4. finally удаляет временный файл
Получить уже созданный временный файл и записать памяткуСамостоятельный пример
<?php
declare(strict_types=1);

$path = tempnam(__DIR__, 'job');
if ($path === false) { throw new RuntimeException('Не создать временный файл'); }
try {
    if (realpath(dirname($path)) !== realpath(__DIR__)) { throw new RuntimeException('Файл создан в другой папке'); }
    echo 'Начальный размер: ', filesize($path), " байт\n";
    $text = "Заказ 104 готов\n";
    if (file_put_contents($path, $text) !== strlen($text)) { throw new RuntimeException('Не записать памятку'); }
    echo file_get_contents($path);
} finally { unlink($path); }
Ожидаемый результат
Начальный размер: 0 байт
Заказ 104 готов

tempnam уже создаёт пустой файл и возвращает путь. Это не каталог и не свободное имя для будущего создания. Случайное имя зависит от ОС; после работы finally удаляет именно этот файл. Проверка папки обнаруживает fallback.

Подготовить новый отчёт рядом с окончательным файломСамостоятельный пример
<?php
declare(strict_types=1);

$folder = __DIR__;
$temporary = tempnam($folder, 'rep');
if ($temporary === false) { throw new RuntimeException('Не создать временный файл'); }
$moved = false;
try {
    if (realpath(dirname($temporary)) !== realpath($folder)) { throw new RuntimeException('Неверная временная папка'); }
    $text = "Сегодня выдать: 3 заказа\n";
    if (file_put_contents($temporary, $text) !== strlen($text)) { throw new RuntimeException('Не дописать отчёт'); }
    if (!rename($temporary, $folder . '/report.txt')) { throw new RuntimeException('Не переименовать готовый отчёт'); }
    $moved = true;
    echo 'report.txt: ', file_get_contents($folder . '/report.txt');
} finally { if (!$moved) { unlink($temporary); } }
Ожидаемый результат
report.txt: Сегодня выдать: 3 заказа

Временный файл создаётся рядом, записывается целиком, затем получает окончательное имя. Это полезная последовательность подготовки; переносимость замены существующего файла, одновременные читатели и аварийная устойчивость зависят от ОС/ФС и отдельного протокола.

Применение и границы. Функция создаёт файл, не папку и не имя без файла. Резервирование имени не защищает от злоумышленника, который уже имеет право менять каталог. Manual описывает также NTFS fallback при очень большом количестве записей; контролируйте собственную temp-папку, очистку и фактический путь.

Сравните: tmpfile, unlink, rename, mkdir. Полный выбор файловых операций.

tmpfileПолучить автоматически удаляемый временный файл как открытый поток w+b.

PHP 4+ · standard

tmpfile(): resource|false

Получить автоматически удаляемый временный файл как открытый поток w+b.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. fopen возвращает открытый поток (resource), а не содержимое файла. rb читает байты, w+b создаёт/очищает файл и разрешает чтение с записью. fclose освобождает поток. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". try выполняет попытку, catch обрабатывает указанный отказ, finally освобождает ресурс и не подавляет ошибку. throw new RuntimeException сообщает о сбое. [...] создаёт массив; $row["size"] читает поле по ключу; [$a, $b] = ... раскладывает список. Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
ВозвратОткрытый поток или false; у функции нет аргумента каталога.
ОтказПри недоступной temp-папке создание отказывает. Файл удаляется при закрытии/утрате последней ссылки/нормальном окончании скрипта; аварийное завершение может оставить его.
ВерсияPHP 4+
Путь данных в первом опыте
  1. tmpfile создаёт w+b
  2. Запись READY
  3. rewind и чтение
  4. fclose удаляет файл
Временный поток вместо самостоятельно выбранного имениПример для указанного окружения
<?php
$h = tmpfile();
if ($h === false) { throw new RuntimeException('tmpfile'); }
try {
    fwrite($h, 'READY');
    rewind($h);
    echo fread($h, 5), "
";
} finally { fclose($h); }

Ожидается READY. Для изолированного опыта PHP запускается с sys_temp_dir, указывающим на папку этого опыта. Настройка INI_SYSTEM задаётся до запуска, не ini_set внутри запроса. Контекст отдельно исполнен в evidence.

Проверить удаление при закрытииПример для указанного окружения
<?php
$h = tmpfile();
if ($h === false) { throw new RuntimeException('tmpfile'); }
$meta = stream_get_meta_data($h);
$path = $meta['uri'];
var_dump(is_file($path));
fclose($h);
clearstatcache();
var_dump(file_exists($path));

При локальной temp-папке ожидаются true, false. URI берётся из метаданных, но сам ресурс — основной способ доступа; случайное имя не бизнес-ID.

Применение и границы. Не используйте как постоянное хранилище или гарантированную уборку после kill/аварии. Если надо назначить конкретную папку и передавать путь другой программе, удобнее tempnam с явным finally. php://temp — другой механизм: память с переходом на временный файл при пороге.

Сравните: tempnam, fclose, fopen. Полный выбор файловых операций.

popenЗапустить команду и открыть одно направление общения: читать stdout либо писать stdin.

PHP 4+ · standard

popen(string $command, string $mode): resource|false

Запустить команду и открыть одно направление общения: читать stdout либо писать stdin.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. fopen возвращает открытый поток (resource), а не содержимое файла. rb читает байты, w+b создаёт/очищает файл и разрешает чтение с записью. fclose освобождает поток. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
commandСтрока команды для shell, не массив argv. В примерах только доверенный PHP_BINARY и собственный worker.php.
moder/rb читают stdout; w/wb пишут stdin. В Windows text mode переводит переносы, b сохраняет байты.
ВозвратОднонаправленный поток или false. Даже отсутствующая команда может оставить валидный поток shell: успешный popen не равен успешной программе.
ОтказНекорректный mode в PHP8 даёт ValueError; ошибка открытия pipe — warning/false. Ошибка дочерней программы определяется также pclose и stderr.
ВерсияPHP 4+

PHP_BINARY — путь текущего PHP CLI; escapeshellarg оформляет один доверенный аргумент для shell. Приложенный worker — отдельный процесс с отдельными переменными. Полный обмен JSON и proc_open.

Путь данных в первом опыте
  1. PHP запускает свой worker.php
  2. worker пишет READY в stdout
  3. popen rb читает строку
  4. pclose получает статус0
Прочитать результат собственной программыСамостоятельный пример
<?php
$command = escapeshellarg(PHP_BINARY) . ' -n ' . escapeshellarg(__DIR__ . '/worker.php');
$h = popen($command, 'rb');
if ($h === false) { throw new RuntimeException('popen'); }
$body = stream_get_contents($h);
$status = pclose($h);
echo $body;
echo 'status=', $status, "
";
Ожидаемый результат
READY
status=0

-n отключает php.ini только у изолированного дочернего примера. Общая конфигурация проекта не меняется.

Передать текст в stdin дочерней программыСамостоятельный пример
<?php
$command = escapeshellarg(PHP_BINARY) . ' -n ' . escapeshellarg(__DIR__ . '/worker.php');
$h = popen($command, 'wb');
if ($h === false) { throw new RuntimeException('popen'); }
if (fwrite($h, 'tea') !== 3) { throw new RuntimeException('write'); }
$status = pclose($h);
echo 'status=', $status, "
";
echo file_get_contents(__DIR__ . '/result.txt'), "
";
Ожидаемый результат
status=0
TEA

Закрытие pipe сообщает EOF: worker заканчивает чтение stdin и пишет результат только в собственную папку.

Применение и границы. stderr не входит автоматически в stdout; shell-перенаправление 2>&1 смешивает каналы. Для отдельных stdin/stdout/stderr и обхода shell лучше proc_open с массивом аргументов. escapeshellarg имеет различия POSIX/Windows и не превращает произвольную пользовательскую команду в безопасную; не подставляйте запрос в command. popen и чтение могут блокировать: это не очередь, не timeout manager.

Сравните: pclose, fread, fwrite. Полный выбор файловых операций.

pcloseЗакрыть pipe из popen и дождаться завершения дочерней программы.

PHP 4+ · standard

pclose(resource $handle): int

Закрыть pipe из popen и дождаться завершения дочерней программы.

$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. fopen возвращает открытый поток (resource), а не содержимое файла. rb читает байты, w+b создаёт/очищает файл и разрешает чтение с записью. fclose освобождает поток. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". Переменные; Вызов и return; Поток и позиция чтения.

Параметр или результатДоговор
handleОткрытый ресурс именно из popen; для обычного fopen используйте fclose.
ВозвратСтатус завершения процесса; −1 при ошибке закрытия/ожидания. 0 обычно успех, ненулевой код определяется программой.
ОтказСборка --enable-sigchild делает возврат неопределённым по Manual. Неверный ресурс в PHP8 — TypeError.
ВерсияPHP 4+
Путь данных в первом опыте
  1. worker выводит DONE
  2. Родитель читает stdout
  3. pclose ждёт завершение
  4. status0
Вывод не заменяет проверку статусаСамостоятельный пример
<?php
$h = popen(escapeshellarg(PHP_BINARY) . ' -n ' . escapeshellarg(__DIR__ . '/worker.php'), 'rb');
if ($h === false) { throw new RuntimeException('popen'); }
echo stream_get_contents($h);
echo 'status=', pclose($h), "
";
Ожидаемый результат
DONE
status=0

pclose вызывается даже после прочитанного stdout.

Непустой stdout при ненулевом выходеСамостоятельный пример
<?php
$h = popen(escapeshellarg(PHP_BINARY) . ' -n ' . escapeshellarg(__DIR__ . '/worker.php'), 'rb');
if ($h === false) { throw new RuntimeException('popen'); }
echo stream_get_contents($h);
$status = pclose($h);
echo $status === 0 ? 'accepted' : 'rejected';
echo "
";
Ожидаемый результат
PARTIAL
rejected

worker сам завершился с exit7. Часть вывода не становится готовым отчётом; ожидаемый пример не привязывает код к иной ОС.

Применение и границы. Manual содержит Unix-замечание о waitpid и pcntl_wexitstatus. В исходнике PHP8.5.11 main/streams/plain_wrapper.c обычное Unix-завершение уже проходит WIFEXITED → WEXITSTATUS: не декодируйте такой код второй раз. Для сигнального завершения и другой сборки проверьте её договор. Windows-тесты подтвердили успешный и ненулевой выход; Unix здесь не запускался. pclose может ждать долго и не реализует тайм-аут. Для управления процессом используйте proc_open и договор процесса.

Сравните: popen, fclose. Полный выбор файловых операций.

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

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

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

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

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