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

Дерево руководства
Глава 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. Сначала сохраняем готовую строку; затем покажем чтение по частям, ошибки, размер, копирование и каталог документов.
- $report: «Заказ 104: дрель — 2, пила — 1»
- file_put_contents сохраняет pickup.txt
- Файл остаётся после завершения скрипта
- 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 закрывает доступ, сохраняя файл.
- fopen(pickup.txt, rb): позиция в начале
- Первый fgets → «Дрель: 2», позиция после LF
- Второй fgets → «Пила: 1»
- 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 восстанавливает прежний обработчик. Это локальная демонстрация, не новая глобальная политика для всего фреймворка.
- Вызов для missing.txt
- Файловое предупреждение
- Временный handler → ErrorException
- 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_ALL | User-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_NOESCAPE | Backslash не экранирует специальные знаки. |
| 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 =0 | PHP завершил передачу; содержимое ещё требует проверки. |
| 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→write | fopen 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: пример обучает чтению.
- 0 + LF → id0, вывести
- Пустая строка → пропустить
- 12 → id12, вывести
- EOF → вернуть count2
<?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.
Смежные ветки: Каталоги и обход; Потоки, обёртки и контексты; Внешние программы; 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+ |
- exports/monthly.csv
- Отбрасываем текст каталогов
- 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+.
- app/reports/daily.csv
- Убрать последний компонент
- 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
.
Возвращённая точка не означает найденный существующий файл: это строковое представление родителя относительного имени.
<?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+ |
- Имена archive.tar.gz и README
- pathinfo разбирает последнюю точку
- Подпись 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_cache | true дополнительно очищает realpath-кэш, false только stat-кэш. |
| filename | Ограничивает очистку realpath-кэша этим именем только при true. Не означает выбор одного имени для stat-кэша. |
| Возврат | void, значимого результата нет. |
| Отказ | Не обновляет сам файл и не подтверждает успешность следующей операции. |
| Версия | PHP 4+ |
- events.log содержит created и LF: 8 байт
- Добавлена строка paid: стало 13 байт
- 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+ |
- Кэш путей очищен
- Разрешён существующий pickup.txt
- Из записи кэша видны имя 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+ |
- Кэш очищен
- Читаем текущий расход
- 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+ |
- Маска *.csv в учебной папке
- Поиск локальных записей
- a.csv затем b.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; Поток и позиция чтения.
| Параметр или результат | Договор |
|---|---|
| pattern | Shell-маска: ? один символ, * ноль/несколько, [0-9]/[abc] набор ASCII, [!A-Z] отрицание, \ экранирование. Не регулярное выражение. |
| filename | Проверяемая строка, файл не обязан существовать. |
| flags | Через |: FNM_NOESCAPE отключает экранирование; FNM_PATHNAME не даёт * пересекать /; FNM_PERIOD требует явной начальной точки; FNM_CASEFOLD игнорирует регистр (GNU-возможность). |
| Возврат | true при совпадении, иначе false. |
| Отказ | Доступность зависит от POSIX-совместимости, Windows поддерживается; типы должны соответствовать сигнатуре. |
| Версия | PHP 4.3+ |
- report-7.csv, report-10.csv, report-X.csv
- Маска report-[0-9].csv
- В подборку проходит только 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 работает со строками и не проверяет существование файлов.
<?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 / ino | Inode/идентификатор файла. |
| 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. Нижние права — другая часть битовой маски.
- pickup.txt содержит «104: ready» и LF
- stat читает метаданные
- 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 / ino | Inode/идентификатор файла. |
| 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. Нижние права — другая часть битовой маски.
- pickup.txt содержит «104: ready» и LF
- fstat читает метаданные
- 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 / ino | Inode/идентификатор файла. |
| 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. Нижние права — другая часть битовой маски.
- pickup.txt содержит «104: ready» и LF
- lstat читает метаданные
- 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+ |
- Существующий report.txt
- Читаем поле mtime
- Получаем метку времени; форматируем отдельно
<?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+ |
- Существующий report.txt
- Читаем поле atime
- Получаем метку времени; форматируем отдельно
<?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+ |
- Существующий report.txt
- Читаем поле ctime
- Получаем метку времени; форматируем отдельно
<?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+ |
- Файл содержит UTF-8 Чай
- Три буквы занимают 6 байтов
- 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+ |
- report.txt — обычный файл
- filetype
- Строка 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+ |
- Собственный report.txt
- Запрашиваем uid
- Получаем числовую метку ОС
<?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 конкретной машины.
<?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+ |
- Собственный report.txt
- Запрашиваем gid
- Получаем числовую метку ОС
<?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 конкретной машины.
<?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+ |
- pickup.txt и copy-name.txt — два имени одного файла
- Сравнение inode подтверждает общую файловую запись
- Запись через 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+ |
- pickup.txt — обычный файл
- 0170000 выделяет биты типа
- 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.
<?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+ |
- pickup.txt существует, missing.txt отсутствует
- file_exists выбирает подходящий путь
- Памятка прочитана; для 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+ |
- Известный путь в учебной папке
- Проверяем is_dir
- Получаем 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+ |
- pickup.txt существует, missing.txt отсутствует
- is_file выбирает подходящий путь
- Памятка прочитана; для 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+ |
- pickup.txt существует, missing.txt отсутствует
- is_readable выбирает подходящий путь
- Памятка прочитана; для 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+ |
- Известный путь в учебной папке
- Проверяем is_writable
- Получаем 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+ |
- Известный путь в учебной папке
- Проверяем is_writeable
- Получаем 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_linkПроверить, является ли сама запись символической ссылкой.
PHP 4+ · standard
is_link(string $filename): boolПроверить, является ли сама запись символической ссылкой.
$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". try выполняет попытку, catch обрабатывает указанный отказ, finally освобождает ресурс и не подавляет ошибку. throw new RuntimeException сообщает о сбое. Переменные; Вызов и return; Поток и позиция чтения.
| Параметр или результат | Договор |
|---|---|
| filename | Строка пути; относительный путь разрешается от текущего рабочего каталога (CWD), а не обязательно от папки этого исходника. |
| Возврат | true для символической ссылки, false иначе; не то же самое, что существование её цели. |
| Отказ | При отказе обычно false и E_WARNING: отсутствие файла, доступа, места или поддержки операции. Проверяйте === false; 0/пустая строка могут быть успехом. Неверный тип/значение аргумента в PHP 8 может дать TypeError/ValueError. |
| Версия | PHP 4+ |
- a.txt — обычный fixture
- is_link проверяет саму запись
- false
<?php
var_dump(is_link(__DIR__ . '/a.txt'));
var_dump(is_link(__DIR__ . '/missing'));
Ожидаемый результат
bool(false)
bool(false)
Отрицательный ответ ничего не говорит о читаемости или формате файла.
<?php
$path = __DIR__ . '/shortcut';
if (!symlink('missing-target.txt', $path)) { throw new RuntimeException('Создание ссылки'); }
try {
var_dump(is_link($path));
var_dump(file_exists($path));
} finally { unlink($path); }
При доступной функции создания symlink ожидаются true и false. Windows может требовать право/режим разработчика; этот пример только lint.
Применение и границы. Результат относится к моменту проверки и может кэшироваться; clearstatcache() обновляет stat-кэш, но не устраняет гонку между проверкой и действием. is_file/is_dir идут по ссылке, is_link исследует саму запись. Это не проверка hard link: у него нет отдельного «ссылочного» типа. Без контроля родительского каталога результат можно подменить до следующего вызова.
Сравните: readlink, symlink, lstat, file_exists. Полный выбор файловых операций.
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+ |
- README.txt с обычным текстом
- Проверка исполнимости
- На учебном Windows окружении false
<?php
var_dump(is_executable(__DIR__ . '/README.txt'));
var_dump(is_executable(__DIR__ . '/missing'));
Ожидаемый результат
bool(false)
bool(false)
Проверенный результат Windows. На POSIX x-бит может быть поставлен и тексту; факт исполнимости ещё не доказывает успешный запуск.
<?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+ |
- Каталог текущего примера
- Запрос доступное место на его томе
- Получаем байты 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+ |
- Каталог текущего примера
- Запрос общий объём на его томе
- Получаем байты 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+ |
- Каталог текущего примера
- Запрос доступное место на его томе
- Получаем байты 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+ |
- pickup.txt содержит 104: ready
- fgets читает памятку
- fclose освобождает поток
- Новый 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 повторно не используем.
<?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 | Строка байтов; перевод строк добавляете сами. |
| length | null — вся data; иначе максимум байтов, не больше длины data. В PHP8.5.11 length <= 0 возвращает 0 без записи, а не ValueError. |
| Возврат | Количество записанных байтов, включая 0; false при отказе. |
| Отказ | При отказе записи E_WARNING; несовместимый тип аргумента в PHP8 даёт TypeError. |
| Версия | PHP 4+; nullable length с PHP 8.0 |
- pickup.txt создаётся один раз
- Первая запись: «Выдача заказа 104»
- Вторая запись: «Дрель: 2»
- Обе строки остаются в файле
<?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 с тем же контрактом.
<?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+ |
- Файл 0A
- Первый байт 0
- Второй байт A
- Следующее чтение 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+ |
- Файл A
- Чтение A
- Попытка чтения за концом
- 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 | Смещение байтов; отрицательное допустимо, если итоговая позиция корректна. |
| whence | SEEK_SET — начало; SEEK_CUR — текущая позиция; SEEK_END — конец. |
| Возврат | 0 — успех, −1 — отказ: это не обычный bool-контракт. |
| Отказ | Некорректное направление/неподдерживаемый seek может дать −1 с диагностикой; используйте перечисленные SEEK_*. |
| Версия | PHP 4+ |
- stock.txt: TEA:12
- Сдвиг на −2 байта от SEEK_END
- Следующее чтение: 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+ |
- orders.txt: 104 + LF + 105 + LF
- fgets читает 104 и LF
- ftell возвращает 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+ |
- Первая строка pickup.txt: 104: ready
- fgets читает строку
- rewind ставит позицию 0
- 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+ |
- orders.txt содержит 104 и 105
- После первой строки ftell: 4
- ftruncate оставляет 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+ |
- document.txt начинается с FORMAT:1
- fgets пропускает служебную строку
- fpassthru выводит 104: ready
- Возврат: 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_path | true включает поиск в include_path. |
| context | Контекст обёртки или null. |
| Возврат | Число выведенных байтов или false. |
| Отказ | E_WARNING при отказе; возможен уже начавшийся вывод. |
| Версия | PHP 4+ |
- pickup.txt содержит 104: ready
- readfile сама выводит текст
- Возвращает 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-ответе с файлом её не добавляют.
<?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+ |
- Tea + пустая строка + Coffee
- file с двумя флагами
- Убрать LF и пустые строки
- Массив Tea, Coffee
<?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+ |
- draft.txt содержит 104: ready
- copy создаёт pickup.txt с теми же байтами
- Черновик остаётся под прежним именем
<?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+ |
- draft.txt содержит 104: ready
- rename переносит имя в pickup.txt
- Содержимое сохранилось; 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. Полный выбор файловых операций.
unlinkУдалить имя файла; удаление каталога выполняется другой функцией.
PHP 4+ · standard
unlink(string $filename, ?resource $context = null): boolУдалить имя файла; удаление каталога выполняется другой функцией.
$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". try выполняет попытку, catch обрабатывает указанный отказ, finally освобождает ресурс и не подавляет ошибку. throw new RuntimeException сообщает о сбое. Переменные; Вызов и return; Поток и позиция чтения.
| Параметр или результат | Договор |
|---|---|
| filename | Строка пути; относительный путь разрешается от текущего рабочего каталога (CWD), а не обязательно от папки этого исходника. Для символической ссылки удаляется ссылка. На Windows ссылку на каталог удаляют через rmdir. |
| context | Контекст обёртки или null. |
| Возврат | true при успехе, false при отказе. |
| Отказ | E_WARNING при отказе, например недостаточных правах. |
| Версия | PHP 4+ |
- draft-104.txt содержит 104: ready
- Сначала документ прочитан
- unlink удаляет только имя draft-104.txt
<?php
declare(strict_types=1);
$path = __DIR__ . '/draft-104.txt';
echo 'Черновик: ', file_get_contents($path);
if (!unlink($path)) { throw new RuntimeException('Не удалить черновик'); }
echo file_exists($path) ? "Черновик ещё существует.\n" : "draft-104.txt удалён.\n";
Ожидаемый результат
Черновик: 104: ready
draft-104.txt удалён.
Удаляется только точное имя fixture в папке примера. unlink не очищает переменные, не удаляет каталог и не отправляет файл в корзину.
<?php
$path = __DIR__ . '/work.txt';
try { echo file_get_contents($path), "
"; }
finally {
if (!unlink($path)) { throw new RuntimeException('cleanup'); }
}
Ожидаемый результат
READY
В реальном catch/finally сохраняйте исходную ошибку: исключение очистки может её заменить. Здесь чтение успешное.
Применение и границы. Это необратимая файловая операция, поэтому задавайте точный доверенный путь. Не используйте пользовательское имя как путь. На Windows с7.3 допускается unlink при открытых handles, но повторное создание имени до их закрытия всё ещё ограничено. На Unix освобождение содержимого зависит также от других имён/открытых handles.
Сравните: rmdir, rename, is_link. Полный выбор файловых операций.
deleteОфициальный пункт delete — указатель на разные операции, а не API.
Навигационный пункт Manual, не функция · standard
delete — такой встроенной функции и ключевого слова нетОфициальный пункт delete — указатель на разные операции, а не API.
$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. Переменные; Вызов и return; Поток и позиция чтения.
| Параметр или результат | Договор |
|---|---|
| Возврат | Вызова delete() нет; выбирайте unlink для файла или unset для переменной. |
| Отказ | Попытка вызвать необъявленную delete() даст Error. |
| Версия | Навигационный пункт Manual, не функция |
- Есть переменная и файл
- unset удаляет переменную
- Файл остаётся
- 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+ |
- TEA 8
- Шаблон %s %d
- Слово TEA и число 8
- Проверка полученных типов
<?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_sections | true сохраняет секции как вложенные массивы; false объединяет настройки без этого уровня. |
| scanner_mode | NORMAL по умолчанию; 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 как текст.
- [pickup]: enabled=true, max_items=3
- TYPED сохраняет bool и int
- config[pickup] выбирает секцию
- Самовывоз включён; максимум 3 предмета
<?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_sections | true сохраняет секции как вложенные массивы; false объединяет настройки без этого уровня. |
| scanner_mode | NORMAL по умолчанию; 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 как текст.
- [pickup]: enabled=true, max_items=3
- TYPED сохраняет bool и int
- config[pickup] выбирает секцию
- Самовывоз включён; максимум 3 предмета
<?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 |
- Старый вызов fgetss недоступен
- Выбираем цель: текст или HTML-показ
- Читаем байты
- Явно преобразуем для выбранной цели
<?php
$html = file_get_contents(__DIR__ . '/note.html');
echo strip_tags($html), "
";
Ожидаемый результат
Tea & coffee
Это снятие тегов, не полный HTML-парсер и не декодирование сущностей. Не эквивалент stateful fgetss между строками.
<?php
$html = file_get_contents(__DIR__ . '/note.html');
echo htmlspecialchars($html, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), "
";
Ожидаемый результат
<b>Tea</b>
Для вывода недоверенного текста в 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 и не право пользователя внутри вашего приложения.
- Учебный файл
- Узнать текущий gid
- Применить chgrp
- Проверить результат
<?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 и не право пользователя внутри вашего приложения.
- Учебный файл
- Узнать текущий uid
- Применить chown
- Проверить результат
<?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 зависит от прав/режима ОС, поэтому здесь такие примеры помечены условными.
- Учебный файл/ссылка
- Узнать текущий gid
- Применить lchgrp
- Проверить результат
<?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 зависит от прав/режима ОС, поэтому здесь такие примеры помечены условными.
- Учебный файл/ссылка
- Узнать текущий uid
- Применить lchown
- Проверить результат
<?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 и не право пользователя внутри вашего приложения.
- Учебный private.txt
- chmod(...,0600)
- Только owner read+write
- Проверить младшие биты
<?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; Поток и позиция чтения.
| Параметр или результат | Договор |
|---|---|
| mask | null/пропуск — прочитать текущую маску. Иначе установить 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 и не право пользователя внутри вашего приложения.
- Запрошено 0777
- Маска0027 убирает права
- Новый каталог0750
- Старая маска восстановлена
<?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 зависит от обёртки. |
| permissions | 0777 по умолчанию; модифицируется umask, на Windows игнорируется. |
| recursive | true создаёт отсутствующих родителей с тем же запрошенным режимом. |
| 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 и не право пользователя внутри вашего приложения.
- mkdir создаёт pickup
- file_put_contents создаёт pickup/104.txt
- Чтение показывает 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+ |
- Создана папка job-104
- Задание завершено, папка пуста
- 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), а не обязательно от папки этого исходника. |
| mtime | Unix timestamp или null для текущего времени. |
| atime | Отдельное время доступа; null использует mtime, а если оба null — текущее время. Время доступа меняется даже при одном аргументе. |
| Возврат | true при успехе, false при отказе. |
| Отказ | Права и поддержка файловой системы могут привести к отказу/предупреждению. |
| Версия | PHP4+; nullable mtime/atime8.0 |
- report.ready отсутствует
- touch создаёт пустой маркер
- mtime задан фиксированным timestamp
- Размер 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. Полный выбор файловых операций.
linkСоздать второе имя того же локального файла — жёсткую ссылку.
PHP 4+ · standard
link(string $target, string $link): boolСоздать второе имя того же локального файла — жёсткую ссылку.
$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". try выполняет попытку, catch обрабатывает указанный отказ, finally освобождает ресурс и не подавляет ошибку. throw new RuntimeException сообщает о сбое. Переменные; Вызов и return; Поток и позиция чтения.
| Параметр или результат | Договор |
|---|---|
| target | Существующий локальный файл. |
| link | Новое отсутствующее имя; обычно на той же файловой системе. |
| Возврат | true при успехе, false при отказе. |
| Отказ | E_WARNING если link уже существует, target отсутствует либо операция не поддержана/запрещена. |
| Версия | PHP 4+ |
Символическая ссылка хранит путь к другой записи; относительная цель разрешается от папки ссылки. Hard link — ещё одно имя того же файла в одной файловой системе: отдельного «содержимого ссылки» у него нет. Удаление имени и удаление всех данных — разные события. Создание symlink на Windows зависит от прав/режима ОС, поэтому здесь такие примеры помечены условными.
- a.txt содержит OLD
- link создаёт b.txt
- Запись через b.txt
- a.txt тоже видит NEW
<?php
$a = __DIR__ . '/a.txt'; $b = __DIR__ . '/b.txt';
if (!link($a, $b)) { throw new RuntimeException('hardlink'); }
try {
file_put_contents($b, 'NEW');
echo file_get_contents($a), "
";
} finally { unlink($b); }
Ожидаемый результат
NEW
Это не copy: запись меняет общий файл. Проверено на тестовом NTFS-томе.
<?php
$a = __DIR__ . '/a.txt'; $b = __DIR__ . '/b.txt';
if (!link($a, $b)) { throw new RuntimeException('hardlink'); }
unlink($a);
try { echo file_get_contents($b), "
"; }
finally { unlink($b); }
Ожидаемый результат
DATA
Данные ещё доступны по b.txt. Политика хранения должна учитывать все ссылки.
Применение и границы. Не работает с произвольным удалённым URL, обычно нельзя между томами или для каталогов. Копирование и резервирование независимых данных требует copy, а не hard link. Поддержка зависит от FS и разрешений.
Сравните: symlink, copy, unlink, fileinode. Полный выбор файловых операций.
symlinkСоздать запись, содержащую путь к целевому файлу или каталогу.
PHP 4+ · standard
symlink(string $target, string $link): boolСоздать запись, содержащую путь к целевому файлу или каталогу.
$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". try выполняет попытку, catch обрабатывает указанный отказ, finally освобождает ресурс и не подавляет ошибку. throw new RuntimeException сообщает о сбое. Переменные; Вызов и return; Поток и позиция чтения.
| Параметр или результат | Договор |
|---|---|
| target | Целевой путь. Относительный отсчитывается от папки создаваемой ссылки. POSIX допускает ещё отсутствующую цель; на Windows Manual требует существующую. |
| link | Имя новой ссылки; не должно уже существовать. |
| Возврат | true при успехе, false при отказе. |
| Отказ | E_WARNING если имя занято, права недостаточны или ОС не позволяет создание. |
| Версия | PHP 4+ |
Символическая ссылка хранит путь к другой записи; относительная цель разрешается от папки ссылки. Hard link — ещё одно имя того же файла в одной файловой системе: отдельного «содержимого ссылки» у него нет. Удаление имени и удаление всех данных — разные события. Создание symlink на Windows зависит от прав/режима ОС, поэтому здесь такие примеры помечены условными.
- data.txt
- shortcut хранит data.txt
- Чтение shortcut
- Получаем содержимое data.txt
<?php
$link = __DIR__ . '/shortcut';
if (!symlink('data.txt', $link)) { throw new RuntimeException('symlink'); }
try { echo file_get_contents($link), "
"; }
finally { unlink($link); }
При доступном создании symlink ожидается DATA. На Windows lint, без обещания нужных привилегий.
<?php
mkdir(__DIR__ . '/links');
$link = __DIR__ . '/links/shortcut';
if (!symlink('../data.txt', $link)) { throw new RuntimeException('symlink'); }
try { echo file_get_contents($link), "
"; }
finally { unlink($link); rmdir(__DIR__ . '/links'); }
Ожидается DATA; ../data.txt относится к links, не к произвольному CWD вызывающего процесса.
Применение и границы. Ссылки полезны для указателя на версию ресурса, но открывают путь за пределы дерева при неосторожном обходе. realpath помогает анализу существующего пути, но не исключает подмену между проверкой и действием.
Сравните: link, readlink, is_link, lstat, realpath. Полный выбор файловых операций.
readlinkПрочитать цель символической ссылки, а не содержимое целевого файла.
PHP 4+ · standard
readlink(string $path): string|falseПрочитать цель символической ссылки, а не содержимое целевого файла.
$name — переменная; = сохраняет результат, кавычки задают строку, ; завершает команду. name(...) вызывает функцию с аргументами через запятую. echo выводит; "\n" переносит строку, var_dump показывает также тип. __DIR__ — папка текущего PHP-файла; точка . соединяет строки. if выбирает ветку; === false отличает отказ от 0 байтов и пустой строки, а !== false допускает строку "0". try выполняет попытку, catch обрабатывает указанный отказ, finally освобождает ресурс и не подавляет ошибку. throw new RuntimeException сообщает о сбое. Переменные; Вызов и return; Поток и позиция чтения.
| Параметр или результат | Договор |
|---|---|
| path | Путь самой ссылки. |
| Возврат | Строка, сохранённая в ссылке, либо false при ошибке. |
| Отказ | Для обычного файла POSIX отказывает; Windows может вернуть нормализованный путь даже без symlink. Нельзя определять наличие ссылки только успешностью readlink. |
| Версия | PHP 4+ |
Символическая ссылка хранит путь к другой записи; относительная цель разрешается от папки ссылки. Hard link — ещё одно имя того же файла в одной файловой системе: отдельного «содержимого ссылки» у него нет. Удаление имени и удаление всех данных — разные события. Создание symlink на Windows зависит от прав/режима ОС, поэтому здесь такие примеры помечены условными.
- shortcut → data.txt
- readlink(shortcut)
- Строка data.txt
- Чтение тела требует отдельного вызова
<?php
$link = __DIR__ . '/shortcut';
if (!symlink('data.txt', $link)) { throw new RuntimeException('symlink'); }
try { echo readlink($link), "
"; }
finally { unlink($link); }
POSIX ожидает data.txt; детали нормализации пути Windows могут отличаться. Контекстный пример, lint.
<?php
$link = __DIR__ . '/shortcut';
if (!symlink('data.txt', $link)) { throw new RuntimeException('symlink'); }
try {
var_dump(is_link($link));
echo readlink($link), "
";
echo basename(realpath($link)), "
";
} finally { unlink($link); }
На POSIX ожидаются true, data.txt, data.txt; realpath проходит к существующей цели, readlink читает текст цели. Нормализация Windows может отличаться.
Применение и границы. Относительную цель нельзя бездумно передать как путь от другого CWD. Для проверки типа самой записи нужен is_link/lstat; для получения существующего конечного пути realpath.
Сравните: symlink, is_link, realpath, linkinfo. Полный выбор файловых операций.
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 зависит от прав/режима ОС, поэтому здесь такие примеры помечены условными.
- Обычный a.txt тоже имеет st_dev
- linkinfo читает метаданные
- Неотрицательное число
- Тип ссылки проверяет 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+ |
- В journal.txt записано 104: ready
- Проверен результат 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.
<?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+ |
- В journal.txt записано 104: ready
- Проверен результат 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.
<?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+ |
- В journal.txt записано 104: ready
- Проверен результат 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.
<?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.
- Открыт out.txt
- Запрос size0
- Проверка статуса
- Обычная запись с обработкой отказа
<?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
Тип результата стабилен; конкретный статус различается по обёртке. Запись сама по себе от этого не становится запрещённой.
<?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+ |
- tempnam создаёт пустой файл в папке примера
- Проверка фактического каталога
- Запись «Заказ 104 готов»
- 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+ |
- tmpfile создаёт w+b
- Запись READY
- rewind и чтение
- 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. |
| mode | r/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.
- PHP запускает свой worker.php
- worker пишет READY в stdout
- popen rb читает строку
- 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 только у изолированного дочернего примера. Общая конфигурация проекта не меняется.
<?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+ |
- worker выводит DONE
- Родитель читает stdout
- pclose ждёт завершение
- 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.
<?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. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


