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

Дерево руководства
Глава 126 · С нуля → полный справочник
PHP Options and Information: процесс, конфигурация, память и полный API
Все 55 функций и 5 структурных страниц официальной книги: от безопасной проверки среды до ini, окружения, GC, памяти, CLI, платформы и честной миграции удалённых API.
Зачем программе спрашивать PHP о самом себе
Интеграция работает в терминале, но сайт пишет «неизвестная функция». Импорт неожиданно упирается в память. Два worker трудно различить. Временный файл создаётся не там, где ожидалось. Эта ветка даёт программе факты о своём текущем процессе: какой SAPI её запустил, какие расширения и настройки действуют, сколько памяти занято и какие платформенные возможности доступны.
Полезный результат — короткий безопасный отчёт и ясное решение: продолжить работу, остановиться с понятной ошибкой, выбрать fallback или исправить развёртывание. Полный phpinfo для этого почти никогда не нужен. Мы читаем один факт, проверяем его тип и не публикуем пути, окружение и токены.
- Код формулирует конкретный вопрос: есть ли json, какой memory_limit, CLI ли это
- Функция PHP читает состояние текущего процесса или главного файла
- Возвращённое значение сохраняется: строка, bool, int, массив либо false
- Код строго разбирает нормальный результат и отказ
- Пользователь получает полезное действие или понятное сообщение, без конфигурационного дампа
Сначала разберём самый маленький вызов. <?php открывает PHP-код, а автоматически добавленная строка declare(strict_types=1); включает строгую передачу scalar-типов в этом файле и здесь не меняет результат. Имя с $ — переменная; знак = записывает в неё значение. extension_loaded — имя функции, круглые скобки выполняют вызов, строка 'json' внутри — один аргумент, а ; завершает инструкцию. Функция возвращает bool: true или false. Второй вызов var_dump($available) явно печатает тип и значение.
<?php
declare(strict_types=1);
$available = extension_loaded('json');
var_dump($available);
Ожидаемый результат
bool(true)
extension_loaded возвращает bool. В поддерживаемой ветке PHP расширение JSON обязательно, поэтому учебный запуск предсказуемо показывает true. В реальном проекте следующий шаг — до первого использования зависимости явно обработать false понятной ошибкой или альтернативой.
Получив этот первый результат, дальше учимся превращать false в понятную ошибку или fallback. Подробности: как работает вызов функции, переменная и тип значения, условие if.
Карта по реальной задаче
| Что нужно сделать | С чего начать | Следующий шаг |
|---|---|---|
| Проверить зависимость приложения | extension_loaded · phpversion | get_extension_funcs · get_loaded_extensions |
| Прочитать/изменить настройку | ini_get · ini_set | ini_get_all · get_cfg_var · ini_parse_quantity |
| Понять, какие ini загрузились | php_ini_loaded_file · php_ini_scanned_files | php_sapi_name |
| Передать настройку процессу | getenv · putenv | Граница FastCGI, пустая строка и дочерний процесс |
| Исследовать память/циклы | memory_get_usage · memory_get_peak_usage | gc_status · gc_collect_cycles |
| Создать временный файл | sys_get_temp_dir | tempnam/tmpfile, права и уборка |
| Разобрать CLI-команду | getopt | cli_set_process_title · getmypid |
| Определить среду | php_sapi_name · php_uname | zend_thread_id только для debug + ZTS |
| Сравнить версии | phpversion · version_compare | zend_version для движка |
| Диагностировать include | get_included_files · get_include_path | set_include_path |
| Посмотреть открытые ресурсы | get_resources | Закрыть конкретного владельца, а не дампить всё |
| Мигрировать старый проект | get_magic_quotes_gpc · restore_include_path | assert_options и современная альтернатива |
Установка и область действия: Core, standard, SAPI и один процесс
Книга PHP Options/Info относится к базовым возможностям PHP. Отдельный PECL-пакет для неё не устанавливают. Но отдельные функции условны: zend_thread_id есть только при одновременных ZTS и debug-сборке, CLI-заголовок зависит от платформы, dl ограничен SAPI/сборкой, а три исторические функции удалены. Поэтому точный справочник сохраняет узлы и честно отмечает доступность.
| Понятие | Практический смысл |
|---|---|
| Процесс | Один запущенный php/php-fpm worker со своей памятью, окружением и runtime-изменениями. |
| SAPI | Способ запуска: cli, fpm-fcgi, apache2handler, cli-server и другие. У каждого может быть свой ini. |
| Core / standard | Функции встроены в PHP; часть зарегистрирована ядром, часть стандартным модулем. Это не обещает одинаковую ОС-поддержку. |
| Запрос | В web-модели один worker обслуживает последовательность запросов. Runtime-состояние и окружение не превращают в пользовательское хранилище. |
| Главный файл | getmyuid/getlastmod и соседи описывают entrypoint, а не все include и не посетителя. |
<?php
declare(strict_types=1);
$name = php_sapi_name();
echo $name === PHP_SAPI ? "имя SAPI согласовано\n" : "неожиданное различие\n";
echo $name === 'cli' ? "запуск из терминала\n" : "другой интерфейс\n";
Ожидаемый результат
имя SAPI согласовано
запуск из терминала
Проверенный пример запущен CLI. У сайта возможны fpm-fcgi, apache2handler или cli-server; это влияет на окружение и жизненный цикл.
CLI-проверка относится к CLI. Для сайта сделайте временный закрытый endpoint с белым списком фактов или используйте штатную диагностику платформы. После проверки endpoint удалите. zend_thread_id требует не просто ZTS, а одновременно debug-сборку.
Все директивы PHP Options/Info и уровни изменения
Настройка проходит слоями: основной php.ini → scan-файлы → SAPI/per-directory → допустимый ini_set. ini_get видит итог текущего запроса, get_cfg_var — значение из конфигурационного файла, ini_get_all показывает global/local/access. Значения возвращаются строками; "0" не равно false, а "128M" не равно числу байтов до разбора.
| Директива | Default / уровень / версия | Смысл и граница |
|---|---|---|
| assert.active | 1 · INI_ALL · deprecated 8.3 | Исторически разрешает оценку assert; для присутствия проверок используйте системную zend.assertions. |
| assert.bail | 0 · INI_ALL · deprecated 8.3 | Исторически завершает выполнение после провала. |
| assert.warning | 1 · INI_ALL · deprecated 8.3 | Историческое предупреждение на провал. |
| assert.callback | NULL · INI_ALL · deprecated 8.3 | Исторический callback провала. |
| assert.quiet_eval | 0 · удалена 8.0 | Старое подавление error_reporting во время строкового assert; не существует сейчас. |
| assert.exception | 1 · INI_ALL · deprecated 8.3 | AssertionError при провале; до 8.0 default был 0. |
| enable_dl | 1 · INI_SYSTEM · deprecated | Разрешает dl; динамическая загрузка способна обходить open_basedir и не является нормой deploy. |
| max_execution_time | 30 · INI_ALL; CLI default 0 | Внутренний лимит выполнения; не отменяет внешние timeout. Механизм учёта платформенный. |
| max_input_time | -1 · INI_PERDIR | Время приёма и разбора входа: отсчёт начинается, когда сервер вызывает PHP, и заканчивается перед началом выполнения скрипта. -1 использует max_execution_time, 0 снимает предел. |
| max_input_nesting_level | 64 · INI_PERDIR | Максимальная вложенность входных переменных. |
| max_input_vars | 1000 · INI_PERDIR | Отдельный предел для GET, POST и COOKIE; он смягчает DoS через hash collisions. Лишние переменные отбрасываются с E_WARNING. |
| zend.enable_gc | 1 · INI_ALL | Автоматический сбор циклических ссылок. |
| zend.max_allowed_stack_size | 0 · INI_SYSTEM · PHP 8.3+ | Предел native stack: 0 автоопределение, -1 отключает проверку, положительное число задаёт байты. Обычная рекурсия пользовательского PHP-кода native stack не расходует, но внутренние функции и magic methods расходуют. Для выполняющегося Fiber вместо этого предела применяется fiber.stack_size. Это диагностический барьер перед hard crash, а не защита от stack buffer overflow. |
| zend.reserved_stack_size | 0 · INI_SYSTEM · PHP 8.3+ | Буфер native stack, вычитаемый из максимально разрешённого при проверке: 0 автоопределение, положительное число задаёт байты. |
| fiber.stack_size | 1/2 MiB · INI_ALL · PHP 8.1+ | Native stack, выделяемый каждому Fiber: default 1 MiB при pointer size меньше 8 байт и 2 MiB в остальных системах; во время Fiber именно он задаёт проверяемый предел. |
<?php
declare(strict_types=1);
$old = ini_set('precision', '7');
echo ini_get('precision'), "\n";
echo is_string($old) ? "прежнее значение сохранено\n" : "изменение запрещено\n";
if ($old !== false) {
ini_set('precision', $old);
}
Ожидаемый результат
7
прежнее значение сохранено
ini_set возвращает прежнюю строку, а не true. Изменение действует в текущем запросе и только для директивы, допускающей runtime-уровень.
<?php
declare(strict_types=1);
$all = ini_get_all(null, true);
$memory = $all['memory_limit'];
echo isset($memory['global_value'], $memory['local_value'], $memory['access']) ? "три поля есть\n" : "неполная запись\n";
echo is_int($memory['access']) ? "access — маска\n" : "неожиданный тип\n";
Ожидаемый результат
три поля есть
access — маска
global_value — исходное для области, local_value — эффективное здесь, access — комбинация INI_* флагов. Публично весь массив не выводят.
INI_USER можно менять из скрипта; INI_PERDIR — до выполнения для каталога/сервера; INI_SYSTEM — в системной конфигурации. INI_ALL — комбинация разрешённых уровней, а access в ini_get_all проверяют побитовым &. Runtime-изменение не редактирует файл и не меняет соседний FPM-pool.
Все предопределённые константы этой книги
Константа — готовое именованное значение без знака $. Флаги объединяют |, проверяют &. Цвет или число само по себе смысла не несёт: значение правильно только для ожидающей его функции. Windows-константы существуют лишь на Windows; перед чтением переносимый код использует defined.
| CREDITS_* | Что выбирает |
|---|---|
| CREDITS_GROUP | Разработчики ядра |
| CREDITS_GENERAL | Дизайн языка, авторы PHP и SAPI |
| CREDITS_SAPI | SAPI и авторы |
| CREDITS_MODULES | Модули и авторы |
| CREDITS_DOCS | Команда документации |
| CREDITS_QA | Команда QA |
| CREDITS_FULLPAGE | Полная самостоятельная HTML-страница |
| CREDITS_ALL | DOCS | GENERAL | GROUP | MODULES | QA | FULLPAGE (официальная комбинация; SAPI не входит отдельным битом) |
| INFO_* | Что включает phpinfo |
|---|---|
| INFO_GENERAL | Версия, система, build, расположение ini, web-server |
| INFO_CREDITS | Credits |
| INFO_CONFIGURATION | Local/Master значения директив |
| INFO_MODULES | Модули и их настройки |
| INFO_ENVIRONMENT | Переменные окружения |
| INFO_VARIABLES | EGPCS и server variables |
| INFO_LICENSE | Лицензия PHP |
| INFO_ALL | Все разделы |
| INI_* | Где настройка может быть задана |
|---|---|
| INI_USER | Допустимо из пользовательского скрипта/registry/.user.ini |
| INI_PERDIR | php.ini, .htaccess, httpd.conf или .user.ini |
| INI_SYSTEM | php.ini или httpd.conf |
| INI_ALL | Можно задать на любом уровне |
| ASSERT_* | Исторический смысл |
|---|---|
| ASSERT_ACTIVE | Исторически включает assert; deprecated 8.3 |
| ASSERT_CALLBACK | Исторический callback; deprecated 8.3 |
| ASSERT_BAIL | Историческое завершение; deprecated 8.3 |
| ASSERT_EXCEPTION | Исторический режим AssertionError; deprecated 8.3 |
| ASSERT_WARNING | Историческое предупреждение; deprecated 8.3 |
| ASSERT_QUIET_EVAL | Удалена 8.0 вместе со старой строковой моделью |
| Windows-константы | Смысл |
|---|---|
| PHP_WINDOWS_VERSION_MAJOR | Основная версия: 4 для NT4/Me/98/95; 5 для XP/2003 R2/2003/2000; 6 для Vista/2008/7/8/8.1. Таблица историческая и не заменяет feature detection. |
| PHP_WINDOWS_VERSION_MINOR | Дополнительная версия: 0 для Vista/2008/2000/NT4/95; 1 для XP; 2 для 2003 R2/2003/XP x64; 10 для 98; 90 для ME. |
| PHP_WINDOWS_VERSION_BUILD | Номер сборки Windows; пример официального справочника: Vista SP1 — build 6001. |
| PHP_WINDOWS_VERSION_PLATFORM | 2 для семейства Vista/XP/2000/NT4 и Server 2008/2003; 1 для ME/98/95. |
| PHP_WINDOWS_VERSION_SP_MAJOR | Основная версия service pack; 0 означает отсутствие. Например, XP SP3 даёт 3. |
| PHP_WINDOWS_VERSION_SP_MINOR | Дополнительная версия service pack; 0 означает отсутствие. |
| PHP_WINDOWS_VERSION_SUITEMASK | Битовая маска установленных edition/features; отдельные биты перечислены ниже и проверяются оператором &. |
| PHP_WINDOWS_VERSION_PRODUCTTYPE | Одно из значений PHP_WINDOWS_NT_* ниже, описывающее тип платформы. |
| PHP_WINDOWS_NT_DOMAIN_CONTROLLER | Система является контроллером домена. |
| PHP_WINDOWS_NT_SERVER | Серверная система (например Server 2008/2003/2000); контроллер домена сообщает отдельное значение DOMAIN_CONTROLLER. |
| PHP_WINDOWS_NT_WORKSTATION | Рабочая станция (например Vista/XP/2000/NT4). |
| Бит SUITEMASK | Исторический feature/edition |
|---|---|
| 0x00000004 | Установлены компоненты Microsoft BackOffice. |
| 0x00000400 | Установлен Windows Server 2003 Web Edition. |
| 0x00004000 | Установлен Windows Server 2003 Compute Cluster Edition. |
| 0x00000080 | Установлен Server 2008 Datacenter, Server 2003 Datacenter или Windows 2000 Datacenter Server. |
| 0x00000002 | Установлен Server 2008 Enterprise, Server 2003 Enterprise, Windows 2000 Advanced Server либо NT Server 4.0 Enterprise. |
| 0x00000040 | Установлен Windows XP Embedded. |
| 0x00000200 | Установлен Vista Home Premium/Home Basic либо XP Home Edition. |
| 0x00000100 | Remote Desktop поддерживает один интерактивный сеанс; бит не ставится в application server mode. |
| 0x00000001 | Small Business Server когда-то был установлен, даже если систему затем обновили до другой Windows. |
| 0x00000020 | Small Business Server установлен с действующей ограничительной клиентской лицензией. |
| 0x00002000 | Установлен Windows Storage Server 2003 R2 или 2003. |
| 0x00000010 | Установлены Terminal Services; бит всегда установлен, а без 0x00000100 означает application server mode. |
| 0x00008000 | Windows Home Server |
<?php
declare(strict_types=1);
$flags = INFO_GENERAL | INFO_CONFIGURATION;
echo ($flags & INFO_GENERAL) !== 0 ? "общие сведения выбраны\n" : "нет\n";
echo ($flags & INFO_MODULES) === 0 ? "модули не выбраны\n" : "есть\n";
Ожидаемый результат
общие сведения выбраны
модули не выбраны
| собирает маску, & проверяет отдельный бит. Это не сложение произвольных чисел и не фильтрация секретов внутри выбранного раздела.
<?php
declare(strict_types=1);
$windowsConstant = defined('PHP_WINDOWS_VERSION_BUILD');
$consistent = PHP_OS_FAMILY === 'Windows' ? $windowsConstant : !$windowsConstant;
echo $consistent ? "платформенная граница соблюдена\n" : "неожиданная сборка\n";
Ожидаемый результат
платформенная граница соблюдена
Windows-константы нельзя читать без defined на Unix. Номер версии не заменяет проверку нужной возможности.
Окружение процесса и граница FastCGI
Переменная окружения похожа на подписанную записку, переданную процессу при запуске: имя PHP_MANUAL_REGION, значение eu-test. Модель помогает понять чтение по имени. Ограничение: это общая изменяемая среда процесса, она может быть видна библиотекам и детям, а FastCGI способен добавить свой источник. Это не сейф и не пользовательская сессия.
- Оркестратор/ОС задаёт NAME=value
- PHP getenv читает строку или false
- Приложение валидирует значение и превращает в свой тип
- Зависимость получает явный параметр
- Лог фиксирует только имя/статус, не секрет
<?php
declare(strict_types=1);
putenv('PHP_MANUAL_MISSING');
$value = getenv('PHP_MANUAL_MISSING', true);
var_dump($value);
putenv('PHP_MANUAL_EMPTY=');
var_dump(getenv('PHP_MANUAL_EMPTY', true));
putenv('PHP_MANUAL_EMPTY');
Ожидаемый результат
bool(false)
string(0) ""
Строгое сравнение с false сохраняет пустую, но существующую строку. Это важно для флагов, где пустое значение может иметь отдельный смысл.
<?php
declare(strict_types=1);
putenv('PHP_MANUAL_QUEUE=imports');
putenv('PHP_MANUAL_RETRY=3');
$environment = getenv();
echo isset($environment['PHP_MANUAL_QUEUE'], $environment['PHP_MANUAL_RETRY']) ? "два ключа есть\n" : "неполное окружение\n";
putenv('PHP_MANUAL_QUEUE');
putenv('PHP_MANUAL_RETRY');
Ожидаемый результат
два ключа есть
Полный массив может содержать токены и пароли, поэтому пример не выводит его. Параметр local_only влияет только на чтение одного имени; при name=null PHP возвращает общую карту окружения.
Память: живой владелец, цикл, текущий уровень и пик
Представьте коробки с карточками-ссылками. Пока из работающего кода есть путь к коробке, она достижима. Пара коробок может указывать друг на друга даже после потери внешнего пути — это цикл для GC. Аналогия заканчивается там, где движок резервирует блоки, внешняя библиотека держит собственную память, а ОС считает RSS иначе.
- Переменная left указывает на объект A, right — на B
- A.peer → B и B.peer → A
- unset убирает две внешние переменные
- Внутренние ссылки остаются, но граф недостижим
- Циклический GC находит граф; gc_collect_cycles возвращает число собранных значений
<?php
declare(strict_types=1);
gc_collect_cycles();
$left = new stdClass();
$right = new stdClass();
$left->peer = $right;
$right->peer = $left;
unset($left, $right);
$collected = gc_collect_cycles();
echo $collected > 0 ? "цикл собран\n" : "цикл не найден\n";
Ожидаемый результат
цикл собран
Обычный счётчик ссылок не освобождает пару, которая ссылается сама на себя после потери внешних имён. Явный запуск делает учебное наблюдение воспроизводимым; вызывать сборщик после каждого объекта не нужно.
<?php
declare(strict_types=1);
$chunk = str_repeat('catalog;', 20000);
$current = memory_get_usage();
$peak = memory_get_peak_usage();
echo $peak >= $current ? "пик не ниже текущего\n" : "неожиданный счётчик\n";
unset($chunk);
Ожидаемый результат
пик не ниже текущего
Пик сохраняет максимум с начала запроса, даже если временный буфер позже освобождён. Сравнивайте одинаковый режим real_usage.
Почему публичный phpinfo — плохой health-check
Диагностика отвечает тому, кто поддерживает сервис, а health-check — автоматике, можно ли принять трафик. phpinfo показывает гораздо больше: пути, версии, модули, environment и request variables. Выберите несколько фактов, нормализуйте ответ, защитите endpoint и не включайте секреты.
| Вопрос | Безопасный узкий ответ |
|---|---|
| Запущен нужный SAPI? | php_sapi_name и ожидаемое имя без полного дампа. |
| Есть зависимость? | extension_loaded для конкретного модуля. |
| Совместима версия? | phpversion + version_compare. |
| Какой ini читает CLI? | php_ini_loaded_file в закрытом отчёте/команда php --ini. |
| Сколько памяти у этапа? | Снимки memory_get_usage, пик и имя операции. |
<?php
declare(strict_types=1);
ob_start();
$result = phpinfo(INFO_GENERAL);
$text = ob_get_clean();
echo $result === true && str_contains((string) $text, PHP_VERSION) ? "локальные сведения сформированы\n" : "ошибка\n";
Ожидаемый результат
локальные сведения сформированы
Даже INFO_GENERAL раскрывает среду. Мы только проверяем локальный буфер и не отдаём его по HTTP. Для постоянного health-check возвращайте белый список: версия приложения и состояние зависимостей.
Практикум: три безопасных отчёта вместо свалки диагностики
Ниже три небольшие задачи, которые соединяют функции книги в полезный результат. Сначала сформулируйте белый список вопросов и ожидаемые фразы, затем сравните со способом решения. Числа памяти, пути и состав модулей зависят от процесса, поэтому наружу выходит только нормализованный вывод — без токенов, hostname и полного окружения.
| Задача | Что должен доказать результат | Опорные карточки |
|---|---|---|
| Проверка зависимостей перед импортом | Нужные модули загружены именно в текущем CLI; при отсутствии запуск прекращается до бизнес-кода. | extension_loaded · get_loaded_extensions · phpversion |
| Сравнение CLI и сайта | Названы SAPI, главный и дополнительные ini и реально подключённый bootstrap; абсолютные пути остаются в закрытом отчёте. | php_sapi_name · php_ini_loaded_file · php_ini_scanned_files · get_included_files |
| Checkpoint долгоживущего worker | Измерены текущая память и пик, прочитано состояние GC, временное изменение режима возвращено. | memory_get_usage · memory_get_peak_usage · gc_status · gc_collect_cycles |
Решение 1. Начните с короткого списка обязательных расширений. Не выводите полный inventory и не пытайтесь установить модуль из приложения.
<?php
declare(strict_types=1);
$loaded = array_map('strtolower', get_loaded_extensions());
foreach (['core', 'json', 'reflection'] as $required) {
echo $required, ': ', in_array($required, $loaded, true) ? 'есть' : 'нет', "\n";
}
Ожидаемый результат
core: есть
json: есть
reflection: есть
Вместо публичного phpinfo отчёт ограничен тремя именами. Список относится к текущему процессу: CLI и сайт могут загрузить разные ini и расширения.
Решение 2. Закрытый deploy-check показывает источники конфигурации и один доказанный require; он не превращается в постоянную публичную страницу.
<?php
declare(strict_types=1);
$before = get_required_files();
require __DIR__ . '/audit-bootstrap.php';
$after = get_required_files();
$fixture = realpath(__DIR__ . '/audit-bootstrap.php');
$path = get_include_path();
$mainIni = php_ini_loaded_file();
$scanIni = php_ini_scanned_files();
$sapi = php_sapi_name();
$fileOk = is_string($fixture) && in_array($fixture, $after, true)
&& count($after) === count($before) + 1;
$environmentOk = (is_string($path) || $path === false)
&& (is_string($mainIni) || $mainIni === false)
&& (is_string($scanIni) || $scanIni === false)
&& (is_string($sapi) || $sapi === false);
echo $fileOk ? "подключённый файл найден\n" : "файл не найден\n";
echo $environmentOk ? "среда выполнения описана\n" : "ошибка среды\n";
Ожидаемый результат
подключённый файл найден
среда выполнения описана
Такой отчёт помогает сравнить CLI и FPM: он подтверждает конкретный require, читает текущий include_path, основной и scan ini и SAPI, но не печатает абсолютные пути посетителю.
Решение 3. В worker снимок имеет именованную границу. Положительный collected не доказывает утечку, а положительный cacheBytes не обещает равное уменьшение RSS.
<?php
declare(strict_types=1);
$wasEnabled = gc_enabled();
$before = gc_status();
gc_disable();
$disabled = !gc_enabled();
gc_enable();
$enabled = gc_enabled();
$cycle = new stdClass();
$cycle->self = $cycle;
unset($cycle);
$collected = gc_collect_cycles();
$cacheBytes = gc_mem_caches();
memory_reset_peak_usage();
$current = memory_get_usage();
$peak = memory_get_peak_usage();
$usage = getrusage();
if (!$wasEnabled) {
gc_disable();
}
$gcOk = is_array($before) && $disabled && $enabled
&& is_int($collected) && is_int($cacheBytes);
$metricsOk = $peak >= $current && is_array($usage);
echo $gcOk ? "GC checkpoint выполнен\n" : "ошибка GC checkpoint\n";
echo $metricsOk ? "память и CPU прочитаны\n" : "ошибка метрик\n";
Ожидаемый результат
GC checkpoint выполнен
память и CPU прочитаны
В реальном worker это одна диагностическая точка: режим GC временно переключается и возвращается, недостижимый цикл собирается, внутренние кеши запрашиваются к освобождению, а память/CPU читаются без публикации чисел среды.
Полное дерево всех 55 функций PHP Options/Info
Это справочная структура по официальной категории. Каждое имя ведёт к карточке с точной сигнатурой, параметрами, результатом, версиями, платформенной границей и двумя разными примерами. Там, где задачу проще или безопаснее решить иначе, карточка отдельно показывает альтернативу. Карта выше остаётся отдельным входом от задачи.
Исторические узлы не спрятаны: на них явно указано удаление и современный путь миграции. Условный zend_thread_id тоже присутствует, но не выдаётся за функцию NTS-сборки.
Функции и методы этой темы
Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.
assertЗафиксировать внутреннее предположение разработчика и рано увидеть нарушение.
PHP 4–8. Строковый eval deprecated с 7.2 и удалён с 8.0; объявление своей assert в namespace deprecated с 7.3 и запрещено с 8.0; все assert.* INI deprecated с 8.3. · standard
assert(mixed $assertion, Throwable|string|null $description = null): boolЗафиксировать внутреннее предположение разработчика и рано увидеть нарушение.
assertion — выражение, которое в исправной программе должно быть истинным. PHP может не генерировать или не исполнять такие проверки в production, поэтому вход формы, права пользователя, платёж и другой внешний договор проверяют обычным if и исключением. В PHP 8 строка больше не исполняется как код; передают bool-выражение. При включённых assertions ложь обычно приводит к AssertionError.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
$items = [['price' => 120], ['price' => 80]];
assert(count($items) === 2, 'В учебной партии две позиции');
echo "К обработке готовы 2 позиции\n";
Ожидаемый результат
К обработке готовы 2 позиции
assert описывает условие, которое программист считает истинным внутри уже проверенного кода. При zend.assertions=-1 движок может вообще не сгенерировать проверку, поэтому это не валидация формы или API-запроса.
php -d zend.assertions=1 -d assert.exception=1 -r 'try { assert(2 + 2 === 5, "Нарушен внутренний инвариант"); } catch (AssertionError $e) { echo $e->getMessage(), PHP_EOL; }'
Ожидаемый результат
Нарушен внутренний инвариант
Параметр -d действует только в новом учебном процессе. zend.assertions имеет системный режим: включать скомпилированные без проверок assertions поздним ini_set нельзя.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| assertion | Любое значение; практически передают bool-выражение без побочных действий. При zend.assertions=-1 оно может не исполняться вообще. |
| description | null, строка сообщения либо Throwable. Если аргумент пропущен, PHP на этапе компиляции создаёт описание из исходного вызова. Throwable при провале выбрасывается независимо от assert.exception, до старого callback; assert.bail на него не действует. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | assert(mixed $assertion, Throwable|string|null $description = null): bool |
| Результат | bool: true, если выражение истинно либо проверка выключена; false возможен при ложном выражении, если конфигурация не выбросила исключение и не завершила скрипт. |
| Ошибки и особые значения | При ложном условии поведение зависит от zend.assertions и deprecated-настроек assert.*: возможны AssertionError/переданный Throwable, warning, callback, завершение или false. При zend.assertions=0/-1 либо assert.active=0 функция безусловно возвращает true. |
| Версии | PHP 4–8. Строковый eval deprecated с 7.2 и удалён с 8.0; объявление своей assert в namespace deprecated с 7.3 и запрещено с 8.0; все assert.* INI deprecated с 8.3. Официальный диапазон узла: (PHP 4, PHP 5, PHP 7, PHP 8). |
| Среда | Все SAPI, если ниже не указано иное. |
Более простой или безопасный выбор. Для данных от пользователя и интеграций применяйте явную проверку с понятной ошибкой, как в примере explicit guard.
Рядом: assert_options, ini_get.
Вернуться к карте задач или полному дереву функций.
assert_optionsПрочитать или изменить старые runtime-настройки assertions в унаследованном коде.
Есть, но deprecated с PHP 8.3.0. С PHP 8.0 неверная option вызывает ValueError вместо прежнего false; ASSERT_QUIET_EVAL удалена. · standard
assert_options(int $option, mixed $value = ?): mixedПрочитать или изменить старые runtime-настройки assertions в унаследованном коде.
Функция принимала константу ASSERT_ACTIVE, ASSERT_WARNING, ASSERT_BAIL, ASSERT_CALLBACK или ASSERT_EXCEPTION и необязательное новое значение. Весь механизм deprecated с PHP 8.3. Он не управляет системной zend.assertions, которая решает, присутствует ли проверка в коде. Карточка сохранена, чтобы миграция старого проекта была понятной, а не для нового использования.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
$reflection = new ReflectionFunction('assert_options');
echo $reflection->isDeprecated() ? "assert_options устарела\n" : "проверьте версию\n";
Ожидаемый результат
assert_options устарела
Reflection читает метаданные PHP 8.5.11, но не вызывает deprecated-функцию и не меняет глобальные режимы. Современный выбор делается через zend.assertions при запуске процесса и явные исключения в коде.
<?php
declare(strict_types=1);
$quantity = 0;
try {
if ($quantity < 1) {
throw new InvalidArgumentException('Количество должно быть положительным');
}
} catch (InvalidArgumentException $error) {
echo $error->getMessage(), "\n";
}
Ожидаемый результат
Количество должно быть положительным
Для формы, JSON и другой внешней границы явная проверка работает независимо от zend.assertions и остаётся частью production-логики.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| option | Одна историческая ASSERT_ACTIVE/EXCEPTION/WARNING/BAIL/CALLBACK; ASSERT_QUIET_EVAL удалена с PHP 8.0. |
| value | Если передан — новое значение выбранной опции; если пропущен — только чтение. Для ASSERT_CALLBACK задавался callable; пустая строка сбрасывала callback. Его историческая сигнатура: (string $file, int $line, ?string $assertion, string $description = ?): void. file и line указывают место вызова assert; assertion до PHP 8 содержал строковое выражение (для bool был пустой строкой), а с PHP 8 всегда null; необязательный description — переданное assert описание. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | assert_options(int $option, mixed $value = ?): mixed |
| Результат | Возвращает прежнее значение опции; неизвестная опция вызывает ValueError в современных версиях. |
| Ошибки и особые значения | С PHP 8.3 вызов deprecated. Callback/bail/warning создают глобальное, трудно локализуемое поведение; при zend.assertions=-1 опции не возвращают вырезанную проверку. |
| Версии | Есть, но deprecated с PHP 8.3.0. С PHP 8.0 неверная option вызывает ValueError вместо прежнего false; ASSERT_QUIET_EVAL удалена. Официальный диапазон узла: (PHP 4, PHP 5, PHP 7, PHP 8). |
| Среда | Все SAPI, если ниже не указано иное. |
Более простой или безопасный выбор. Настройте zend.assertions для окружения при запуске, а ожидаемые ошибки приложения выразите обычными исключениями.
Вернуться к карте задач или полному дереву функций.
gc_collect_cyclesПринудительно найти недостижимые циклы ссылок и получить число собранных элементов.
PHP 5.3–8. С PHP 8.5 счётчик не включает строки/ресурсы, освобождённые косвенно через циклы. · Core
gc_collect_cycles(): intПринудительно найти недостижимые циклы ссылок и получить число собранных элементов.
PHP быстро освобождает обычное значение, когда ссылок на него не осталось. Цикл «A хранит B, B хранит A» сохраняет внутренние ссылки даже после потери внешних переменных. Циклический сборщик периодически ищет такие недостижимые графы; эта функция запускает проход сейчас. С PHP 8.5 возвращаемый счётчик больше не включает строки и ресурсы, освобождённые лишь косвенно через собранные циклы. Практический смысл — контролируемая точка в долгоживущем worker или воспроизводимый тест, а не ритуальный вызов после каждого объекта.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
gc_collect_cycles();
$left = new stdClass();
$right = new stdClass();
$left->peer = $right;
$right->peer = $left;
unset($left, $right);
$collected = gc_collect_cycles();
echo $collected > 0 ? "цикл собран\n" : "цикл не найден\n";
Ожидаемый результат
цикл собран
Обычный счётчик ссылок не освобождает пару, которая ссылается сама на себя после потери внешних имён. Явный запуск делает учебное наблюдение воспроизводимым; вызывать сборщик после каждого объекта не нужно.
<?php
declare(strict_types=1);
$wasEnabled = gc_enabled();
$before = gc_status();
gc_disable();
$disabled = !gc_enabled();
gc_enable();
$enabled = gc_enabled();
$cycle = new stdClass();
$cycle->self = $cycle;
unset($cycle);
$collected = gc_collect_cycles();
$cacheBytes = gc_mem_caches();
memory_reset_peak_usage();
$current = memory_get_usage();
$peak = memory_get_peak_usage();
$usage = getrusage();
if (!$wasEnabled) {
gc_disable();
}
$gcOk = is_array($before) && $disabled && $enabled
&& is_int($collected) && is_int($cacheBytes);
$metricsOk = $peak >= $current && is_array($usage);
echo $gcOk ? "GC checkpoint выполнен\n" : "ошибка GC checkpoint\n";
echo $metricsOk ? "память и CPU прочитаны\n" : "ошибка метрик\n";
Ожидаемый результат
GC checkpoint выполнен
память и CPU прочитаны
В реальном worker это одна диагностическая точка: режим GC временно переключается и возвращается, недостижимый цикл собирается, внутренние кеши запрашиваются к освобождению, а память/CPU читаются без публикации чисел среды.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| Параметров нет | Функция вызывается без аргументов; чтение или действие и его результат описаны в договоре ниже. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | gc_collect_cycles(): int |
| Результат | int: число собранных циклических значений; 0 — нормальный результат, если собирать нечего. |
| Ошибки и особые значения | Не освобождает достижимые объекты и открытые ресурсы, на которые всё ещё есть владелец. Может добавить паузу на обход; эффект измеряют на своём графе. |
| Версии | PHP 5.3–8. С PHP 8.5 счётчик не включает строки/ресурсы, освобождённые косвенно через циклы. Официальный диапазон узла: (PHP 5 >= 5.3.0, PHP 7, PHP 8). |
| Среда | Все SAPI, если ниже не указано иное. |
Более простой или безопасный выбор. Сначала разорвите ненужные сильные ссылки и закройте ресурсы; автоматический сборщик обычно достаточен.
Рядом: gc_enabled, gc_status, gc_mem_caches.
Вернуться к карте задач или полному дереву функций.
gc_disableОстановить автоматический сбор циклических ссылок для строго измеренного участка.
Есть в проверенном PHP 8.5.11 · Core
gc_disable(): voidОстановить автоматический сбор циклических ссылок для строго измеренного участка.
Вызов меняет флаг текущего процесса. Обычный reference counting продолжает работать: значение с нулём ссылок освобождается. Накапливающиеся циклы останутся до gc_enable и последующего прохода либо до завершения процесса. Это редко оправданная оптимизация, которую проверяют профилировщиком на отдельном worker.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
$wasEnabled = gc_enabled();
gc_disable();
echo gc_enabled() ? "on\n" : "off\n";
gc_enable();
echo gc_enabled() ? "on\n" : "off\n";
if (!$wasEnabled) {
gc_disable();
}
Ожидаемый результат
off
on
gc_disable не отключает обычное освобождение значений с нулевым счётчиком ссылок. В реальном worker изменение подтверждают измерением, а исходный режим восстанавливают.
<?php
declare(strict_types=1);
$wasEnabled = gc_enabled();
$before = gc_status();
gc_disable();
$disabled = !gc_enabled();
gc_enable();
$enabled = gc_enabled();
$cycle = new stdClass();
$cycle->self = $cycle;
unset($cycle);
$collected = gc_collect_cycles();
$cacheBytes = gc_mem_caches();
memory_reset_peak_usage();
$current = memory_get_usage();
$peak = memory_get_peak_usage();
$usage = getrusage();
if (!$wasEnabled) {
gc_disable();
}
$gcOk = is_array($before) && $disabled && $enabled
&& is_int($collected) && is_int($cacheBytes);
$metricsOk = $peak >= $current && is_array($usage);
echo $gcOk ? "GC checkpoint выполнен\n" : "ошибка GC checkpoint\n";
echo $metricsOk ? "память и CPU прочитаны\n" : "ошибка метрик\n";
Ожидаемый результат
GC checkpoint выполнен
память и CPU прочитаны
В реальном worker это одна диагностическая точка: режим GC временно переключается и возвращается, недостижимый цикл собирается, внутренние кеши запрашиваются к освобождению, а память/CPU читаются без публикации чисел среды.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| Параметров нет | Функция вызывается без аргументов; чтение или действие и его результат описаны в договоре ниже. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | gc_disable(): void |
| Результат | void: полезного возвращаемого значения нет. |
| Ошибки и особые значения | Не сообщает, был ли сборщик уже выключен. Длительное отключение повышает память; исключение между disable и enable может оставить неожиданный режим. |
| Версии | Есть в проверенном PHP 8.5.11 Официальный диапазон узла: (PHP 5 >= 5.3.0, PHP 7, PHP 8). |
| Среда | Все SAPI, если ниже не указано иное. |
Более простой или безопасный выбор. Оставьте zend.enable_gc включённым, пока измерение не докажет конкретную проблему.
Рядом: gc_enable, gc_enabled, gc_collect_cycles.
Вернуться к карте задач или полному дереву функций.
gc_enableВернуть автоматический поиск недостижимых циклов в текущем процессе.
Есть в проверенном PHP 8.5.11 · Core
gc_enable(): voidВернуть автоматический поиск недостижимых циклов в текущем процессе.
Функция включает механизм, но сама по себе не обещает немедленно пройти накопившиеся корни. Для контролируемой точки после долгого отключения отдельно вызывают gc_collect_cycles и учитывают его цену. В коротком HTTP-запросе ручное переключение обычно только усложняет поведение.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
$wasEnabled = gc_enabled();
gc_disable();
echo gc_enabled() ? "on\n" : "off\n";
gc_enable();
echo gc_enabled() ? "on\n" : "off\n";
if (!$wasEnabled) {
gc_disable();
}
Ожидаемый результат
off
on
gc_disable не отключает обычное освобождение значений с нулевым счётчиком ссылок. В реальном worker изменение подтверждают измерением, а исходный режим восстанавливают.
<?php
declare(strict_types=1);
$wasEnabled = gc_enabled();
$before = gc_status();
gc_disable();
$disabled = !gc_enabled();
gc_enable();
$enabled = gc_enabled();
$cycle = new stdClass();
$cycle->self = $cycle;
unset($cycle);
$collected = gc_collect_cycles();
$cacheBytes = gc_mem_caches();
memory_reset_peak_usage();
$current = memory_get_usage();
$peak = memory_get_peak_usage();
$usage = getrusage();
if (!$wasEnabled) {
gc_disable();
}
$gcOk = is_array($before) && $disabled && $enabled
&& is_int($collected) && is_int($cacheBytes);
$metricsOk = $peak >= $current && is_array($usage);
echo $gcOk ? "GC checkpoint выполнен\n" : "ошибка GC checkpoint\n";
echo $metricsOk ? "память и CPU прочитаны\n" : "ошибка метрик\n";
Ожидаемый результат
GC checkpoint выполнен
память и CPU прочитаны
В реальном worker это одна диагностическая точка: режим GC временно переключается и возвращается, недостижимый цикл собирается, внутренние кеши запрашиваются к освобождению, а память/CPU читаются без публикации чисел среды.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| Параметров нет | Функция вызывается без аргументов; чтение или действие и его результат описаны в договоре ниже. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | gc_enable(): void |
| Результат | void. |
| Ошибки и особые значения | Повторное включение допустимо и не сообщает прежний режим. Не отменяет утечку, если объекты всё ещё достижимы. |
| Версии | Есть в проверенном PHP 8.5.11 Официальный диапазон узла: (PHP 5 >= 5.3.0, PHP 7, PHP 8). |
| Среда | Все SAPI, если ниже не указано иное. |
Более простой или безопасный выбор. Не менять флаг без профиля; для локального восстановления обрамлять изменение try/finally.
Рядом: gc_disable, gc_enabled, gc_collect_cycles.
Вернуться к карте задач или полному дереву функций.
gc_enabledУзнать, активен ли циклический сборщик прямо сейчас.
Есть в проверенном PHP 8.5.11 · Core
gc_enabled(): boolУзнать, активен ли циклический сборщик прямо сейчас.
Ответ относится к текущему PHP-процессу и текущему моменту. true не означает, что каждый недостижимый цикл уже собран; false не означает, что никакая память не освобождается. Функция удобна в диагностике worker и для корректного возврата режима после временного изменения.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
$wasEnabled = gc_enabled();
gc_disable();
echo gc_enabled() ? "on\n" : "off\n";
gc_enable();
echo gc_enabled() ? "on\n" : "off\n";
if (!$wasEnabled) {
gc_disable();
}
Ожидаемый результат
off
on
gc_disable не отключает обычное освобождение значений с нулевым счётчиком ссылок. В реальном worker изменение подтверждают измерением, а исходный режим восстанавливают.
<?php
declare(strict_types=1);
$status = gc_status();
$required = ['runs', 'collected', 'threshold', 'roots'];
echo array_diff($required, array_keys($status)) === [] ? "основные поля есть\n" : "неожиданная версия\n";
echo is_bool(gc_enabled()) ? "режим прочитан\n" : "ошибка\n";
Ожидаемый результат
основные поля есть
режим прочитан
Числа зависят от уже выполненной программы, поэтому пример проверяет схему, а не выдумывает одинаковое количество циклов для всех запусков.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| Параметров нет | Функция вызывается без аргументов; чтение или действие и его результат описаны в договоре ниже. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | gc_enabled(): bool |
| Результат | bool: true — циклический сборщик включён, false — выключен. |
| Ошибки и особые значения | Отдельного значения ошибки нет. Состояние может быть изменено другой частью того же долгоживущего процесса. |
| Версии | Есть в проверенном PHP 8.5.11 Официальный диапазон узла: (PHP 5 >= 5.3.0, PHP 7, PHP 8). |
| Среда | Все SAPI, если ниже не указано иное. |
Рядом: gc_enable, gc_disable, gc_status.
Вернуться к карте задач или полному дереву функций.
gc_mem_cachesПопросить Zend Memory Manager освободить неиспользуемые внутренние кеши.
Есть в проверенном PHP 8.5.11 · Core
gc_mem_caches(): intПопросить Zend Memory Manager освободить неиспользуемые внутренние кеши.
Движок оставляет часть выделенных блоков для будущих операций. Функция возвращает такие блоки менеджеру памяти. Это другой механизм, чем поиск циклов объектов. Даже положительное число не гарантирует такое же уменьшение RSS: системный аллокатор может оставить страницы процессу.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
$freed = gc_mem_caches();
echo is_int($freed) && $freed >= 0 ? "получено число освобождённых байтов\n" : "неожиданный ответ\n";
Ожидаемый результат
получено число освобождённых байтов
Ноль — нормальный результат: подходящих внутренних кешей могло не быть. Это не замена сборке циклов и не обещание, что RSS процесса уменьшится на то же число.
<?php
declare(strict_types=1);
$wasEnabled = gc_enabled();
$before = gc_status();
gc_disable();
$disabled = !gc_enabled();
gc_enable();
$enabled = gc_enabled();
$cycle = new stdClass();
$cycle->self = $cycle;
unset($cycle);
$collected = gc_collect_cycles();
$cacheBytes = gc_mem_caches();
memory_reset_peak_usage();
$current = memory_get_usage();
$peak = memory_get_peak_usage();
$usage = getrusage();
if (!$wasEnabled) {
gc_disable();
}
$gcOk = is_array($before) && $disabled && $enabled
&& is_int($collected) && is_int($cacheBytes);
$metricsOk = $peak >= $current && is_array($usage);
echo $gcOk ? "GC checkpoint выполнен\n" : "ошибка GC checkpoint\n";
echo $metricsOk ? "память и CPU прочитаны\n" : "ошибка метрик\n";
Ожидаемый результат
GC checkpoint выполнен
память и CPU прочитаны
В реальном worker это одна диагностическая точка: режим GC временно переключается и возвращается, недостижимый цикл собирается, внутренние кеши запрашиваются к освобождению, а память/CPU читаются без публикации чисел среды.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| Параметров нет | Функция вызывается без аргументов; чтение или действие и его результат описаны в договоре ниже. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | gc_mem_caches(): int |
| Результат | int: количество байтов, освобождённых внутренними кешами; может быть 0. |
| Ошибки и особые значения | Не закрывает файлы/сокеты, не удаляет достижимые объекты и не лечит неограниченный пользовательский кеш. |
| Версии | Есть в проверенном PHP 8.5.11 Официальный диапазон узла: (PHP 7, PHP 8). |
| Среда | Все SAPI, если ниже не указано иное. |
Более простой или безопасный выбор. Найдите владельца растущих данных; используйте эту функцию только как измеренный инструмент долгоживущего процесса.
Рядом: gc_collect_cycles, memory_get_usage, memory_get_peak_usage.
Вернуться к карте задач или полному дереву функций.
gc_statusПолучить текущие счётчики и состояние циклического сборщика.
PHP 7.3–8. С PHP 8.3 результат расширен с 4 до 12 полей состояния и времени. · Core
gc_status(): arrayПолучить текущие счётчики и состояние циклического сборщика.
Массив всегда содержит runs, collected, threshold и roots. С PHP 8.3 официальный договор добавляет running, protected, full, buffer_size, application_time, collector_time, destructor_time и free_time. Эти числа помогают сравнить два участка одного процесса. Они не являются универсальным признаком «утечки»: рост roots может быть временным, а достижимая коллекция в GC не попадёт.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
$status = gc_status();
$required = ['runs', 'collected', 'threshold', 'roots'];
echo array_diff($required, array_keys($status)) === [] ? "основные поля есть\n" : "неожиданная версия\n";
echo is_bool(gc_enabled()) ? "режим прочитан\n" : "ошибка\n";
Ожидаемый результат
основные поля есть
режим прочитан
Числа зависят от уже выполненной программы, поэтому пример проверяет схему, а не выдумывает одинаковое количество циклов для всех запусков.
<?php
declare(strict_types=1);
$wasEnabled = gc_enabled();
$before = gc_status();
gc_disable();
$disabled = !gc_enabled();
gc_enable();
$enabled = gc_enabled();
$cycle = new stdClass();
$cycle->self = $cycle;
unset($cycle);
$collected = gc_collect_cycles();
$cacheBytes = gc_mem_caches();
memory_reset_peak_usage();
$current = memory_get_usage();
$peak = memory_get_peak_usage();
$usage = getrusage();
if (!$wasEnabled) {
gc_disable();
}
$gcOk = is_array($before) && $disabled && $enabled
&& is_int($collected) && is_int($cacheBytes);
$metricsOk = $peak >= $current && is_array($usage);
echo $gcOk ? "GC checkpoint выполнен\n" : "ошибка GC checkpoint\n";
echo $metricsOk ? "память и CPU прочитаны\n" : "ошибка метрик\n";
Ожидаемый результат
GC checkpoint выполнен
память и CPU прочитаны
В реальном worker это одна диагностическая точка: режим GC временно переключается и возвращается, недостижимый цикл собирается, внутренние кеши запрашиваются к освобождению, а память/CPU читаются без публикации чисел среды.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| Параметров нет | Функция вызывается без аргументов; чтение или действие и его результат описаны в договоре ниже. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | gc_status(): array |
| Результат | array со счётчиками сборщика; точный набор полей зависит от версии PHP. |
| Ошибки и особые значения | Функция не возвращает false, но интерпретация без границ измерения ошибочна. Не фиксируйте весь массив как вечную схему внешнего API. |
| Версии | PHP 7.3–8. С PHP 8.3 результат расширен с 4 до 12 полей состояния и времени. Официальный диапазон узла: (PHP 7 >= 7.3.0, PHP 8). |
| Среда | Все SAPI, если ниже не указано иное. |
Рядом: gc_collect_cycles, gc_enabled, memory_get_usage.
Вернуться к карте задач или полному дереву функций.
memory_get_usageУвидеть текущий объём памяти, который учитывает PHP для процесса.
Есть в проверенном PHP 8.5.11 · standard
memory_get_usage(bool $real_usage = false): intУвидеть текущий объём памяти, который учитывает PHP для процесса.
Без аргумента функция сообщает память, занятую пользовательскими данными и внутренними структурами через Zend Memory Manager. Число округлено вверх до гранулярности allocator и потому больше точной суммы запрошенных байтов. real_usage=true показывает общий объём страниц, зарезервированных memory manager у системы, включая пока неиспользуемые страницы; именно к этой метрике применяется memory_limit. Это всё равно не полный RSS PHP-процесса. Разница до/после полезнее одиночного числа, если границы операции одинаковы.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
$before = memory_get_usage();
$buffer = str_repeat('x', 1024 * 1024);
$after = memory_get_usage();
echo $after > $before ? "использование выросло\n" : "рост не виден\n";
unset($buffer);
Ожидаемый результат
использование выросло
Разность описывает наблюдение этого процесса и аллокатора, а не точный «вес строки». real_usage=true измеряет выделенные движку блоки другим масштабом.
<?php
declare(strict_types=1);
$wasEnabled = gc_enabled();
$before = gc_status();
gc_disable();
$disabled = !gc_enabled();
gc_enable();
$enabled = gc_enabled();
$cycle = new stdClass();
$cycle->self = $cycle;
unset($cycle);
$collected = gc_collect_cycles();
$cacheBytes = gc_mem_caches();
memory_reset_peak_usage();
$current = memory_get_usage();
$peak = memory_get_peak_usage();
$usage = getrusage();
if (!$wasEnabled) {
gc_disable();
}
$gcOk = is_array($before) && $disabled && $enabled
&& is_int($collected) && is_int($cacheBytes);
$metricsOk = $peak >= $current && is_array($usage);
echo $gcOk ? "GC checkpoint выполнен\n" : "ошибка GC checkpoint\n";
echo $metricsOk ? "память и CPU прочитаны\n" : "ошибка метрик\n";
Ожидаемый результат
GC checkpoint выполнен
память и CPU прочитаны
В реальном worker это одна диагностическая точка: режим GC временно переключается и возвращается, недостижимый цикл собирается, внутренние кеши запрашиваются к освобождению, а память/CPU читаются без публикации чисел среды.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| real_usage | false — память, сейчас выделенная PHP-скрипту через emalloc и связанные функции; true — весь зарезервированный memory manager системный объём. Сравнивайте только одинаковый режим. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | memory_get_usage(bool $real_usage = false): int |
| Результат | int байтов на момент вызова, округлённый по гранулярности allocator. |
| Ошибки и особые значения | Постоянные allocation и память, которую расширение получило напрямую через malloc, не учитываются даже при real_usage=true. Поэтому метрика не равна RSS всего процесса; создание самой метрики тоже происходит внутри процесса. |
| Версии | Есть в проверенном PHP 8.5.11 Официальный диапазон узла: (PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8). |
| Среда | Все SAPI, если ниже не указано иное. |
Более простой или безопасный выбор. Для общей памяти процесса используйте метрики ОС/контейнера; для участка — снимки одного режима и профилировщик.
Рядом: memory_get_peak_usage, memory_reset_peak_usage, gc_mem_caches.
Вернуться к карте задач или полному дереву функций.
memory_reset_peak_usageСбросить базу пикового счётчика перед новым этапом работы.
PHP 8.2.0+ · standard
memory_reset_peak_usage(): voidСбросить базу пикового счётчика перед новым этапом работы.
После вызова новый пик начинается от текущего уровня памяти. Это позволяет отдельно измерить чтение файла и последующее преобразование, не наследуя максимум ранней загрузки приложения. Функция не освобождает ни одного байта и не меняет memory_limit.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
$temporary = str_repeat('a', 200000);
unset($temporary);
memory_reset_peak_usage();
$current = memory_get_usage();
$peak = memory_get_peak_usage();
echo $peak >= $current ? "новый пик отсчитывается\n" : "ошибка\n";
Ожидаемый результат
новый пик отсчитывается
Сброс меняет только счётчик пика; уже выделенная память не освобождается. Для очистки сначала убирают владельцев данных и закрывают ресурсы.
<?php
declare(strict_types=1);
$wasEnabled = gc_enabled();
$before = gc_status();
gc_disable();
$disabled = !gc_enabled();
gc_enable();
$enabled = gc_enabled();
$cycle = new stdClass();
$cycle->self = $cycle;
unset($cycle);
$collected = gc_collect_cycles();
$cacheBytes = gc_mem_caches();
memory_reset_peak_usage();
$current = memory_get_usage();
$peak = memory_get_peak_usage();
$usage = getrusage();
if (!$wasEnabled) {
gc_disable();
}
$gcOk = is_array($before) && $disabled && $enabled
&& is_int($collected) && is_int($cacheBytes);
$metricsOk = $peak >= $current && is_array($usage);
echo $gcOk ? "GC checkpoint выполнен\n" : "ошибка GC checkpoint\n";
echo $metricsOk ? "память и CPU прочитаны\n" : "ошибка метрик\n";
Ожидаемый результат
GC checkpoint выполнен
память и CPU прочитаны
В реальном worker это одна диагностическая точка: режим GC временно переключается и возвращается, недостижимый цикл собирается, внутренние кеши запрашиваются к освобождению, а память/CPU читаются без публикации чисел среды.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| Параметров нет | Функция вызывается без аргументов; чтение или действие и его результат описаны в договоре ниже. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | memory_reset_peak_usage(): void |
| Результат | void. |
| Ошибки и особые значения | Текущая память становится нижней исходной точкой: пик не обязан стать нулём. Параллельные действия того же процесса также попадут в счётчик. |
| Версии | PHP 8.2.0+ Официальный диапазон узла: (PHP 8 >= 8.2.0). |
| Среда | Все SAPI, если ниже не указано иное. |
Более простой или безопасный выбор. Снимайте также начало/конец и описывайте границы этапа; одного пика недостаточно для поиска владельца.
Рядом: memory_get_peak_usage, memory_get_usage, gc_collect_cycles.
Вернуться к карте задач или полному дереву функций.
getrusageПолучить системные счётчики ресурсов текущего процесса или завершённых детей.
Есть в проверенном PHP 8.5.11 · standard
getrusage(int $mode = 0): array|falseПолучить системные счётчики ресурсов текущего процесса или завершённых детей.
Функция возвращает структуру getrusage. Официальный полный набор полей включает block I/O ru_oublock/ru_inblock; IPC ru_msgsnd/ru_msgrcv; память ru_maxrss/ru_ixrss/ru_idrss; soft/hard page faults ru_minflt/ru_majflt; signals ru_nsignals; voluntary/involuntary context switches ru_nvcsw/ru_nivcsw; swaps ru_nswap; пользовательское время ru_utime.tv_sec/usec и системное ru_stime.tv_sec/usec. Фактический набор определяет ОС. mode=0 относится к текущему процессу, mode=1 — к завершённым дочерним процессам там, где ОС это поддерживает. Это не секундомер запроса: ожидание сети и сна может почти не увеличить CPU-время.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
$before = getrusage();
array_sum(range(1, 100));
$after = getrusage();
$keys = ['ru_utime.tv_sec', 'ru_utime.tv_usec'];
echo is_array($before) && is_array($after) && array_diff($keys, array_keys($after)) === []
? "CPU-счётчики получены\n"
: "среда не поддержала счётчики\n";
Ожидаемый результат
CPU-счётчики получены
Это usage текущего процесса, не wall-clock длительность HTTP-запроса. Для времени ожидания берут монотонный таймер; набор полей зависит от платформы.
<?php
declare(strict_types=1);
$wasEnabled = gc_enabled();
$before = gc_status();
gc_disable();
$disabled = !gc_enabled();
gc_enable();
$enabled = gc_enabled();
$cycle = new stdClass();
$cycle->self = $cycle;
unset($cycle);
$collected = gc_collect_cycles();
$cacheBytes = gc_mem_caches();
memory_reset_peak_usage();
$current = memory_get_usage();
$peak = memory_get_peak_usage();
$usage = getrusage();
if (!$wasEnabled) {
gc_disable();
}
$gcOk = is_array($before) && $disabled && $enabled
&& is_int($collected) && is_int($cacheBytes);
$metricsOk = $peak >= $current && is_array($usage);
echo $gcOk ? "GC checkpoint выполнен\n" : "ошибка GC checkpoint\n";
echo $metricsOk ? "память и CPU прочитаны\n" : "ошибка метрик\n";
Ожидаемый результат
GC checkpoint выполнен
память и CPU прочитаны
В реальном worker это одна диагностическая точка: режим GC временно переключается и возвращается, недостижимый цикл собирается, внутренние кеши запрашиваются к освобождению, а память/CPU читаются без публикации чисел среды.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| mode | 1 выбирает RUSAGE_CHILDREN — завершённые дочерние процессы. Default 0 выбирает текущий процесс; текущая реализация трактует любой int кроме 1 как RUSAGE_SELF, но переносимый код передаёт только 0 или 1. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | getrusage(int $mode = 0): array|false |
| Результат | array системных полей либо false при системном отказе; набор ключей платформенный. На Windows всегда доступны ru_stime.tv_sec/usec и ru_utime.tv_sec/usec; ru_majflt и ru_maxrss добавляются только для mode=0/RUSAGE_SELF. Историческая BeOS 2000 возвращает только четыре поля времени ru_stime/ru_utime sec/usec. |
| Ошибки и особые значения | На Unix и других ОС набор шире и зависит от системного getrusage(2); ключ нельзя считать обязательным без проверки. tv_usec — микросекундная часть пары с tv_sec, а не самостоятельная полная длительность. |
| Версии | Есть в проверенном PHP 8.5.11 Официальный диапазон узла: (PHP 4, PHP 5, PHP 7, PHP 8). |
| Среда | Поля и поддержка зависят от ОС; mode=1 имеет смысл после собственных дочерних процессов. |
Более простой или безопасный выбор. Для elapsed time используйте hrtime; для лимитов контейнера и RSS — метрики ОС.
Рядом: getmypid, memory_get_usage.
Вернуться к карте задач или полному дереву функций.
set_time_limitПерезапустить внутренний счётчик допустимого времени выполнения скрипта.
Есть в проверенном PHP 8.5.11 · standard
set_time_limit(int $seconds): boolПерезапустить внутренний счётчик допустимого времени выполнения скрипта.
Каждый вызов задаёт seconds и начинает отсчёт заново. Ноль снимает внутренний предел, но не таймауты веб-сервера, FPM, reverse proxy, клиента, очереди и внешней библиотеки. На традиционном Unix без elapsed timers часть ожидания системных вызовов может не считаться; Windows считает реальное время, а современные ZTS-сборки могут использовать POSIX per-thread elapsed timers.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
$ok = set_time_limit(2);
echo $ok ? "лимит принят процессом\n" : "лимит не изменён\n";
Ожидаемый результат
лимит принят процессом
Вызов сбрасывает отсчёт max_execution_time с этого места. Он не обещает, что web-server, proxy, supervisor или клиент будут ждать две секунды.
set_time_limit(20);
$deadline = hrtime(true) + 15_000_000_000;
foreach ($jobs as $job) {
if (hrtime(true) >= $deadline) {
break;
}
$httpClient->send($job, timeout: 3.0);
}
echo "worker завершил управляемый участок\n";
Ожидаемый результат
worker завершил управляемый участок
Контекстный фрагмент: отдельный worker, массив jobs и HTTP-клиент уже созданы. При штатном выходе он печатает указанную строку; break способен оставить часть jobs для следующего запуска. На Unix учёт ожидания зависит от механизма сборки/ZTS; на Windows обычно считается реальное время. Таймаут каждой зависимости обязателен отдельно.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| seconds | Целое число секунд; 0 — без внутреннего лимита, положительное значение задаёт новый бюджет от момента вызова. Отрицательные значения не описаны как переносимый режим и не должны использоваться. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | set_time_limit(int $seconds): bool |
| Результат | bool: true при принятом изменении, false при отказе. |
| Ошибки и особые значения | Официальный договор не обещает warning при false: результат нужно проверять явно. Если функция внесена в disabled_functions, в современных конфигурациях она может вообще не быть объявлена, поэтому capability-check делается отдельно. Внешний timeout способен завершить работу раньше. |
| Версии | Есть в проверенном PHP 8.5.11 Официальный диапазон узла: (PHP 4, PHP 5, PHP 7, PHP 8). |
| Среда | CLI/FPM/Apache; способ учёта ожидания зависит от Windows, ZTS и сборочных таймеров. |
Более простой или безопасный выбор. Долгую задачу перенесите в worker, разбивайте на порции и задавайте таймаут каждой внешней операции.
Рядом: ini_get, ini_set, getrusage.
Вернуться к карте задач или полному дереву функций.
dlИсторически загрузить бинарное расширение во время выполнения одного процесса.
Есть в PHP 8.5.11, но enable_dl deprecated и API ограничен SAPI/сборкой. · standard
dl(string $extension_filename): boolИсторически загрузить бинарное расширение во время выполнения одного процесса.
dl просит движок подгрузить DLL/so с ABI текущего PHP. Она доступна только в CLI и embed, а в CGI — лишь при запуске из командной строки. Официальный платформенный пример: sockets.so на Unix и php_sockets.dll в Windows; суффикс доступен через PHP_SHLIB_SUFFIX. Исторический Windows default extension_dir при отсутствии настройки — C:\php5\. На Unix default строится как
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
$callable = function_exists('dl');
$allowed = ini_get('enable_dl');
echo $callable ? "dl объявлена\n" : "dl отсутствует\n";
echo $allowed === '1' ? "динамическая загрузка разрешена конфигурацией\n" : "динамическая загрузка запрещена конфигурацией\n";
Ожидаемый результат
dl объявлена
динамическая загрузка разрешена конфигурацией
Это наблюдение текущего CLI PHP 8.5.11. Функция не вызывается: имя DLL/so, ABI, SAPI и политика сервера могут сделать реальную загрузку невозможной или опасной.
php --ini
php -m
php --ri intl
Ожидаемый результат
php --ini: пути конфигурации именно выбранного CLI
php -m: список загруженных модулей
php --ri intl: сведения intl либо сообщение, что расширение отсутствует
Команды показывают ini выбранного CLI, модули и сведения одного расширения; конкретные пути и версии зависят от установки. Для FPM/Apache проверяют именно тот SAPI и перезапускают обслуживающий процесс по процедуре развёртывания; dl для этого не нужен.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| extension_filename | Только имя файла расширения для текущей платформы, например sockets.so или php_sockets.dll; поиск идёт в extension_dir. Произвольный пользовательский путь недопустим. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | dl(string $extension_filename): bool |
| Результат | bool: true при успешной загрузке, false при отказе. |
| Ошибки и особые значения | Выдаёт E_WARNING при запрете, несовместимом бинарнике, неверном имени или невозможной загрузке; на Unix имя регистрозависимо. В web-FPM/Apache функции нет как разрешённого пути загрузки. |
| Версии | Есть в PHP 8.5.11, но enable_dl deprecated и API ограничен SAPI/сборкой. Официальный диапазон узла: (PHP 4, PHP 5, PHP 7, PHP 8). |
| Среда | Только CLI и embed; CGI — только при запуске из командной строки. Не предназначена для FPM/Apache web-запроса. |
Более простой или безопасный выбор. Добавьте extension/zend_extension в конфигурацию конкретного SAPI, перезапустите процесс и проверьте --ri.
Рядом: extension_loaded, get_loaded_extensions, php_sapi_name.
Вернуться к карте задач или полному дереву функций.
get_cfg_varПрочитать значение, пришедшее из конфигурационного файла, отдельно от runtime-изменений.
Есть в проверенном PHP 8.5.11 · standard
get_cfg_var(string $option): array|string|falseПрочитать значение, пришедшее из конфигурационного файла, отдельно от runtime-изменений.
Функция полезна, когда нужно сравнить значение из конфигурационного файла с эффективным ini_get после ini_set или настройки на уровне запроса. Специальный запрос get_cfg_var("cfg_file_path") позволяет проверить, используется ли configuration file: доступное значение означает, что файл конфигурации применяется. Функция не возвращает параметры, зашитые при компиляции PHP, и значения из конфигурации Apache. Это не универсальный parser php.ini. Значения остаются строками либо массивами — сокращения вроде 128M отдельно переводят ini_parse_quantity.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
$value = get_cfg_var('php_manual.option_that_does_not_exist');
var_dump($value);
Ожидаемый результат
bool(false)
false означает, что такой записи нет в конфигурационном источнике. Строки "0" и "" были бы существующими значениями и требуют строгого сравнения.
<?php
declare(strict_types=1);
$fromConfig = get_cfg_var('precision');
$before = ini_get('precision');
$temporary = (string) ((int) $before + 1);
if ($temporary === $fromConfig) {
$temporary = (string) ((int) $temporary + 1);
}
$old = ini_set('precision', $temporary);
$runtimeChanged = $old !== false && ini_get('precision') === $temporary;
$configStayed = get_cfg_var('precision') === $fromConfig;
echo $runtimeChanged ? "runtime-значение изменилось\n" : "изменение отклонено\n";
echo $configStayed ? "значение из файла не изменилось\n" : "источник неожиданно изменился\n";
if ($old !== false) {
ini_set('precision', $old);
}
Ожидаемый результат
runtime-значение изменилось
значение из файла не изменилось
Пример не зависит от конкретного precision на компьютере читателя: временное число выбирается отличным и от текущего runtime-значения, и от значения конфигурационного файла. get_cfg_var остаётся снимком конфигурационного источника, ini_get видит временное изменение, а прежняя строка возвращается перед завершением.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| option | Точное имя конфигурационной директивы. Регистр и допустимость определяет PHP. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | get_cfg_var(string $option): array|string|false |
| Результат | string|array|false: исходное значение, массив для некоторых директив или false, если записи нет. |
| Ошибки и особые значения | false нужно отличать от строк "0" и "". Полученное стартовое значение может не совпадать с действующим local_value. |
| Версии | Есть в проверенном PHP 8.5.11 Официальный диапазон узла: (PHP 4, PHP 5, PHP 7, PHP 8). |
| Среда | Все SAPI, если ниже не указано иное. |
Более простой или безопасный выбор. Для поведения текущего кода обычно нужен ini_get; для полного профиля уровней — ini_get_all.
Рядом: ini_get, ini_get_all, ini_parse_quantity.
Вернуться к карте задач или полному дереву функций.
get_include_pathУзнать текущую строку каталогов, где include ищет относительный файл.
Есть в проверенном PHP 8.5.11 · standard
get_include_path(): string|falseУзнать текущую строку каталогов, где include ищет относительный файл.
Путь состоит из нескольких записей, разделённых PATH_SEPARATOR. Он может включать точку текущей директории и глобальные библиотеки, поэтому одинаковое имя способно разрешиться не туда, куда ожидалось. Абсолютные пути __DIR__ и Composer autoload уменьшают скрытую зависимость от среды.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
$old = get_include_path();
$new = __DIR__ . '/vendor' . PATH_SEPARATOR . __DIR__ . '/shared';
$previous = set_include_path($new);
$parts = explode(PATH_SEPARATOR, (string) get_include_path());
echo basename($parts[0]), '|', basename($parts[1]), "\n";
if ($previous !== false) {
set_include_path($previous);
}
Ожидаемый результат
vendor|shared
PATH_SEPARATOR выбирает ; на Windows и : на Unix. Явные пути проекта и Composer autoload обычно яснее глобального поиска по include_path.
<?php
declare(strict_types=1);
$before = get_required_files();
require __DIR__ . '/audit-bootstrap.php';
$after = get_required_files();
$fixture = realpath(__DIR__ . '/audit-bootstrap.php');
$path = get_include_path();
$mainIni = php_ini_loaded_file();
$scanIni = php_ini_scanned_files();
$sapi = php_sapi_name();
$fileOk = is_string($fixture) && in_array($fixture, $after, true)
&& count($after) === count($before) + 1;
$environmentOk = (is_string($path) || $path === false)
&& (is_string($mainIni) || $mainIni === false)
&& (is_string($scanIni) || $scanIni === false)
&& (is_string($sapi) || $sapi === false);
echo $fileOk ? "подключённый файл найден\n" : "файл не найден\n";
echo $environmentOk ? "среда выполнения описана\n" : "ошибка среды\n";
Ожидаемый результат
подключённый файл найден
среда выполнения описана
Такой отчёт помогает сравнить CLI и FPM: он подтверждает конкретный require, читает текущий include_path, основной и scan ini и SAPI, но не печатает абсолютные пути посетителю.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| Параметров нет | Функция вызывается без аргументов; чтение или действие и его результат описаны в договоре ниже. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | get_include_path(): string|false |
| Результат | string с include_path либо false при невозможности получить значение. |
| Ошибки и особые значения | Строка не доказывает, что каталоги существуют или читаются. Текущая рабочая директория и порядок элементов влияют на разрешение. |
| Версии | Есть в проверенном PHP 8.5.11 Официальный диапазон узла: (PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8). |
| Среда | Все SAPI, если ниже не указано иное. |
Более простой или безопасный выбор. Для файлов своего проекта используйте require __DIR__ . "/file.php" или Composer autoload.
Рядом: set_include_path, get_included_files, restore_include_path.
Вернуться к карте задач или полному дереву функций.
get_included_filesПолучить список PHP-файлов, уже подключённых текущим запросом.
Есть в проверенном PHP 8.5.11 · Core
get_included_files(): arrayПолучить список PHP-файлов, уже подключённых текущим запросом.
Массив содержит главный файл и успешные include/include_once/require/require_once. Пути нормализуются PHP; повторный *_once не создаёт новую запись. Список удобен для локальной диагностики автозагрузки и конфликтов, но печатать абсолютные серверные пути посетителю не следует.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$names = array_map('basename', get_included_files());
sort($names);
echo implode(',', $names), "\n";
Ожидаемый результат
bootstrap.php,example.php
Список содержит главный файл и подключённый bootstrap. Он отражает уже выполненные include/require, а не все файлы в каталоге.
<?php
declare(strict_types=1);
require __DIR__ . '/settings.php';
echo get_required_files() === get_included_files() ? "списки совпадают\n" : "разные списки\n";
Ожидаемый результат
списки совпадают
get_required_files — псевдоним get_included_files. В обоих списках присутствуют и include, и require; название не разделяет их.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| Параметров нет | Функция вызывается без аргументов; чтение или действие и его результат описаны в договоре ниже. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | get_included_files(): array |
| Результат | array строк путей в порядке первого подключения. |
| Ошибки и особые значения | Не перечисляет файлы, которые только существуют или были найдены Composer без выполнения. Путь может раскрывать структуру сервера. |
| Версии | Есть в проверенном PHP 8.5.11 Официальный диапазон узла: (PHP 4, PHP 5, PHP 7, PHP 8). |
| Среда | Все SAPI, если ниже не указано иное. |
Более простой или безопасный выбор. Для зависимостей класса спрашивайте Composer/Reflection; этот список показывает факт выполнения файлов.
Рядом: get_required_files, get_include_path.
Вернуться к карте задач или полному дереву функций.
get_required_filesИсторическое имя того же списка, который возвращает get_included_files.
Есть в проверенном PHP 8.5.11 · Core
get_required_files(): arrayИсторическое имя того же списка, который возвращает get_included_files.
Несмотря на слово required, функция включает файлы, подключённые и require, и include. Это alias, поэтому отдельной категории «обязательных файлов» не создаёт. Карточка сохранена для полного официального дерева и чтения унаследованного кода.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
require __DIR__ . '/settings.php';
echo get_required_files() === get_included_files() ? "списки совпадают\n" : "разные списки\n";
Ожидаемый результат
списки совпадают
get_required_files — псевдоним get_included_files. В обоих списках присутствуют и include, и require; название не разделяет их.
<?php
declare(strict_types=1);
$before = get_required_files();
require __DIR__ . '/audit-bootstrap.php';
$after = get_required_files();
$fixture = realpath(__DIR__ . '/audit-bootstrap.php');
$path = get_include_path();
$mainIni = php_ini_loaded_file();
$scanIni = php_ini_scanned_files();
$sapi = php_sapi_name();
$fileOk = is_string($fixture) && in_array($fixture, $after, true)
&& count($after) === count($before) + 1;
$environmentOk = (is_string($path) || $path === false)
&& (is_string($mainIni) || $mainIni === false)
&& (is_string($scanIni) || $scanIni === false)
&& (is_string($sapi) || $sapi === false);
echo $fileOk ? "подключённый файл найден\n" : "файл не найден\n";
echo $environmentOk ? "среда выполнения описана\n" : "ошибка среды\n";
Ожидаемый результат
подключённый файл найден
среда выполнения описана
Такой отчёт помогает сравнить CLI и FPM: он подтверждает конкретный require, читает текущий include_path, основной и scan ini и SAPI, но не печатает абсолютные пути посетителю.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| Параметров нет | Функция вызывается без аргументов; чтение или действие и его результат описаны в договоре ниже. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | get_required_files(): array |
| Результат | array путей; тот же результат, что get_included_files. |
| Ошибки и особые значения | Те же ограничения и риск раскрытия абсолютных путей. Имя может ввести читателя в заблуждение. |
| Версии | Есть в проверенном PHP 8.5.11 Официальный диапазон узла: (PHP 4, PHP 5, PHP 7, PHP 8). |
| Среда | Все SAPI, если ниже не указано иное. |
Более простой или безопасный выбор. В новом коде имя get_included_files точнее описывает результат.
Рядом: get_included_files, get_include_path.
Вернуться к карте задач или полному дереву функций.
putenvУстановить или удалить переменную окружения текущего PHP-процесса.
Есть в проверенном PHP 8.5.11 · standard
putenv(string $assignment): boolУстановить или удалить переменную окружения текущего PHP-процесса.
Строка NAME=value задаёт значение, строка NAME удаляет. Изменение видно getenv и запускаемым после этого дочерним процессам в течение текущего запроса; при завершении запроса PHP восстанавливает исходное окружение. Пока запрос выполняется, окружение остаётся общим состоянием процесса, поэтому не используйте putenv как пользовательское хранилище и убирайте временное значение сразу после зависимого вызова.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
putenv('PHP_MANUAL_REGION=eu-test');
echo getenv('PHP_MANUAL_REGION', true), "\n";
putenv('PHP_MANUAL_REGION');
var_dump(getenv('PHP_MANUAL_REGION', true));
Ожидаемый результат
eu-test
bool(false)
Строка NAME=value меняет окружение процесса, NAME без = удаляет переменную. Значение не записывается в php.ini и не является безопасным хранилищем секрета.
<?php
declare(strict_types=1);
putenv('PHP_MANUAL_QUEUE=imports');
putenv('PHP_MANUAL_RETRY=3');
$environment = getenv();
echo isset($environment['PHP_MANUAL_QUEUE'], $environment['PHP_MANUAL_RETRY']) ? "два ключа есть\n" : "неполное окружение\n";
putenv('PHP_MANUAL_QUEUE');
putenv('PHP_MANUAL_RETRY');
Ожидаемый результат
два ключа есть
Полный массив может содержать токены и пароли, поэтому пример не выводит его. Параметр local_only влияет только на чтение одного имени; при name=null PHP возвращает общую карту окружения.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| assignment | NAME=value для установки либо NAME без знака = для удаления. Имя/значение формирует доверенный код, не shell-команда. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | putenv(string $assignment): bool |
| Результат | bool успешности. |
| Ошибки и особые значения | Может вернуть false при системном отказе. Библиотеки и запущенные в этот момент дочерние процессы видят изменённую среду; FastCGI добавляет отдельный источник значений. В конце запроса PHP возвращает исходное окружение. |
| Версии | Есть в проверенном PHP 8.5.11 Официальный диапазон узла: (PHP 4, PHP 5, PHP 7, PHP 8). |
| Среда | Все SAPI, если ниже не указано иное. |
Более простой или безопасный выбор. Передавайте настройку аргументом объекту/функции; для дочернего процесса задавайте явную env-карту его API запуска.
Вернуться к карте задач или полному дереву функций.
ini_alterПсевдоним ini_set для runtime-изменения разрешённой директивы.
Есть в проверенном PHP 8.5.11 · standard
ini_alter(string $option, string|int|float|bool|null $value): string|falseПсевдоним ini_set для runtime-изменения разрешённой директивы.
Отдельной семантики alter нет: параметры, результат, уровни INI_* и время жизни совпадают с ini_set. Полный справочник сохраняет функцию, потому что она встречается в старом коде. Новому читателю проще искать одно каноническое имя ini_set.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
$old = ini_alter('precision', 8);
echo ini_get('precision'), "\n";
echo $old !== false ? "alias вернул прежнюю строку\n" : "отказ\n";
if ($old !== false) {
ini_set('precision', $old);
}
Ожидаемый результат
8
alias вернул прежнюю строку
Отдельного механизма alter нет: это alias. В новом коде имя ini_set яснее и лучше совпадает с документацией соседних операций.
<?php
declare(strict_types=1);
$old = ini_alter('precision', 9);
$changed = ini_get('precision');
$bytes = ini_parse_quantity('1M');
ini_restore('precision');
$restored = ini_get('precision');
$cycleOk = is_string($old) && $changed === '9' && $restored === $old;
echo $cycleOk ? "ini-цикл завершён\n" : "ini-цикл нарушен\n";
echo $bytes === 1_048_576 ? "1M = 1048576 байт\n" : "ошибка размера\n";
Ожидаемый результат
ini-цикл завершён
1M = 1048576 байт
Первый результат ini_alter сохраняется до изменения, ini_parse_quantity переводит именно ini-сокращение, а ini_restore возвращает значение начала запроса. Это иной сценарий, чем точечное чтение одной директивы.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| option | Имя директивы. |
| value | Новое scalar/null значение, которое PHP приводит к строковому формату ini. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | ini_alter(string $option, string|int|float|bool|null $value): string|false |
| Результат | string прежнего значения либо false. |
| Ошибки и особые значения | false означает неизвестную/недоступную для runtime директиву; значение "" или "0" является успешной прежней строкой. |
| Версии | Есть в проверенном PHP 8.5.11 Официальный диапазон узла: (PHP 4, PHP 5, PHP 7, PHP 8). |
| Среда | Все SAPI, если ниже не указано иное. |
Более простой или безопасный выбор. Используйте ini_set: то же действие, более узнаваемое имя.
Рядом: ini_set, ini_get, ini_restore.
Вернуться к карте задач или полному дереву функций.
ini_getПрочитать эффективное значение одной директивы в текущем запросе.
Есть в проверенном PHP 8.5.11 · standard
ini_get(string $option): string|falseПрочитать эффективное значение одной директивы в текущем запросе.
PHP возвращает строку даже для логического или числового параметра. Булевое off приходит как пустая строка либо "0", on — как "1"; функция также может вернуть буквальную строку, записанную в ini. Поэтому "0", "", "128M" и false имеют разный смысл, а конкретную строку нормализуют по контракту директивы. Значение учитывает основной ini, scan-файлы, SAPI/per-directory и выполненный ini_set.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
$old = ini_set('precision', '7');
echo ini_get('precision'), "\n";
echo is_string($old) ? "прежнее значение сохранено\n" : "изменение запрещено\n";
if ($old !== false) {
ini_set('precision', $old);
}
Ожидаемый результат
7
прежнее значение сохранено
ini_set возвращает прежнюю строку, а не true. Изменение действует в текущем запросе и только для директивы, допускающей runtime-уровень.
<?php
declare(strict_types=1);
var_dump(ini_get('php_manual.unknown_directive'));
var_dump(ini_set('php_manual.unknown_directive', '1'));
Ожидаемый результат
bool(false)
bool(false)
Неизвестное имя даёт false и при чтении, и при попытке изменения. Для известной, но системной директивы ini_set тоже может вернуть false.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| option | Точное имя директивы, например memory_limit. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | ini_get(string $option): string|false |
| Результат | string эффективного значения; null-значение возвращается как пустая строка. false означает неизвестную директиву либо array-valued опцию вроде pdo.dsn.*, которую ini_get прочитать не может. |
| Ошибки и особые значения | Нельзя проверять if (!$value): строки "0" и "" тоже ложноподобны. Сокращённый объём сначала разбирают ini_parse_quantity, а массивные ini-опции читают через подходящий конфигурационный источник. |
| Версии | Есть в проверенном PHP 8.5.11 Официальный диапазон узла: (PHP 4, PHP 5, PHP 7, PHP 8). |
| Среда | Все SAPI, если ниже не указано иное. |
Рядом: ini_set, ini_get_all, get_cfg_var, ini_parse_quantity.
Вернуться к карте задач или полному дереву функций.
ini_get_allПолучить значения, уровни и разрешения всех или одного расширения.
PHP 4.2–8. В PHP 8.5 detail содержит global/local/access; с PHP 8.6 добавлен builtin_default_value. · standard
ini_get_all(?string $extension = null, bool $details = true): array|falseПолучить значения, уровни и разрешения всех или одного расширения.
В PHP 8.5 details=true создаёт для каждой директивы global_value, local_value и access. С PHP 8.6 добавлено builtin_default_value — встроенное значение до файлов/CLI/runtime. access — битовая маска INI_USER/PERDIR/SYSTEM, а не уровень текущего файла. details=false оставляет только эффективные строки. Полный массив удобен в закрытой диагностике и слишком подробен для публичного endpoint.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
$all = ini_get_all(null, true);
$memory = $all['memory_limit'];
echo isset($memory['global_value'], $memory['local_value'], $memory['access']) ? "три поля есть\n" : "неполная запись\n";
echo is_int($memory['access']) ? "access — маска\n" : "неожиданный тип\n";
Ожидаемый результат
три поля есть
access — маска
global_value — исходное для области, local_value — эффективное здесь, access — комбинация INI_* флагов. Публично весь массив не выводят.
<?php
declare(strict_types=1);
$values = ini_get_all(null, false);
echo is_string($values['memory_limit']) ? "memory_limit — строка\n" : "неожиданный тип\n";
echo array_key_exists('max_execution_time', $values) ? "таймаут найден\n" : "нет таймаута\n";
Ожидаемый результат
memory_limit — строка
таймаут найден
details=false меняет форму каждого элемента на строку значения. Единицы вроде 128M ещё нужно разобрать, прежде чем сравнивать как байты.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| extension | null для всех директив, "core" для Core либо имя расширения. Неизвестное расширение даёт E_WARNING и false. |
| details | true — детальная запись (три поля в PHP 8.5, четыре с 8.6); false — только текущее значение. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | ini_get_all(?string $extension = null, bool $details = true): array|false |
| Результат | array или false. |
| Ошибки и особые значения | Пустой/false не следует смешивать. Маска может содержать несколько битов; проверяйте &, а не точное равенство одному флагу. Опции-массивы вроде pdo.dsn.* функция игнорирует. |
| Версии | PHP 4.2–8. В PHP 8.5 detail содержит global/local/access; с PHP 8.6 добавлен builtin_default_value. Официальный диапазон узла: (PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8). |
| Среда | Все SAPI, если ниже не указано иное. |
Рядом: ini_get, ini_set, get_cfg_var.
Вернуться к карте задач или полному дереву функций.
ini_parse_quantityПеревести строку размера из ini-синтаксиса в целое число.
PHP 8.2.0+ · standard
ini_parse_quantity(string $shorthand): intПеревести строку размера из ini-синтаксиса в целое число.
Директивы используют K, M, G и степени 1024, а не десятичные мегабайты. Число может быть десятичным, hex с 0x, octal с 0o либо начальным 0 и binary с 0b; суффикс k/m/g регистронезависим. Полученный int всё ещё требует семантики конкретной настройки: -1 часто означает отсутствие лимита.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
foreach (['128M', '2K', '-1'] as $value) {
echo $value, ' => ', ini_parse_quantity($value), "\n";
}
Ожидаемый результат
128M => 134217728
2K => 2048
-1 => -1
M и K используют степени 1024. -1 часто является специальным «без лимита», а не отрицательным объёмом; смысл задаёт конкретная директива.
<?php
declare(strict_types=1);
$old = ini_alter('precision', 9);
$changed = ini_get('precision');
$bytes = ini_parse_quantity('1M');
ini_restore('precision');
$restored = ini_get('precision');
$cycleOk = is_string($old) && $changed === '9' && $restored === $old;
echo $cycleOk ? "ini-цикл завершён\n" : "ini-цикл нарушен\n";
echo $bytes === 1_048_576 ? "1M = 1048576 байт\n" : "ошибка размера\n";
Ожидаемый результат
ini-цикл завершён
1M = 1048576 байт
Первый результат ini_alter сохраняется до изменения, ini_parse_quantity переводит именно ini-сокращение, а ini_restore возвращает значение начала запроса. Это иной сценарий, чем точечное чтение одной директивы.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| shorthand | Строка вроде 128M, 2K или -1. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | ini_parse_quantity(string $shorthand): int |
| Результат | int после разбора. |
| Ошибки и особые значения | Некорректное значение выдаёт предупреждение и возвращает результат разбора, который нельзя принимать как валидный ввод. Очень большие значения ограничены размером int. |
| Версии | PHP 8.2.0+ Официальный диапазон узла: (PHP 8 >= 8.2.0). |
| Среда | Все SAPI, если ниже не указано иное. |
Более простой или безопасный выбор. Для пользовательских размеров задайте собственный строгий формат; ini_parse_quantity предназначена для синтаксиса ini.
Рядом: ini_get, ini_get_all.
Вернуться к карте задач или полному дереву функций.
ini_restoreОтменить runtime-изменение и вернуть исходное значение директивы.
Есть в проверенном PHP 8.5.11 · standard
ini_restore(string $option): voidОтменить runtime-изменение и вернуть исходное значение директивы.
Функция возвращает настройку к значению, действовавшему в начале запроса с учётом уровня SAPI/per-directory. Она не редактирует php.ini и не отменяет системный конфиг. В библиотеке надёжнее сохранить прежнее значение ini_set и вернуть его в finally, особенно если несколько компонентов меняют одну директиву.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
$configured = ini_get('precision');
ini_set('precision', '7');
ini_restore('precision');
echo ini_get('precision') === $configured ? "исходное значение восстановлено\n" : "проверьте уровни конфигурации\n";
Ожидаемый результат
исходное значение восстановлено
ini_restore ничего полезного не возвращает. Он возвращает директиву к значению, действовавшему до runtime-изменения в этом запросе.
<?php
declare(strict_types=1);
$old = ini_alter('precision', 9);
$changed = ini_get('precision');
$bytes = ini_parse_quantity('1M');
ini_restore('precision');
$restored = ini_get('precision');
$cycleOk = is_string($old) && $changed === '9' && $restored === $old;
echo $cycleOk ? "ini-цикл завершён\n" : "ini-цикл нарушен\n";
echo $bytes === 1_048_576 ? "1M = 1048576 байт\n" : "ошибка размера\n";
Ожидаемый результат
ini-цикл завершён
1M = 1048576 байт
Первый результат ini_alter сохраняется до изменения, ini_parse_quantity переводит именно ini-сокращение, а ini_restore возвращает значение начала запроса. Это иной сценарий, чем точечное чтение одной директивы.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| option | Имя директивы. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | ini_restore(string $option): void |
| Результат | void. |
| Ошибки и особые значения | Ничего не возвращает и не сообщает, существовала ли директива или было ли что восстанавливать; поэтому состояние при необходимости читают отдельно. |
| Версии | Есть в проверенном PHP 8.5.11 Официальный диапазон узла: (PHP 4, PHP 5, PHP 7, PHP 8). |
| Среда | Все SAPI, если ниже не указано иное. |
Рядом: ini_set, ini_get, get_cfg_var.
Вернуться к карте задач или полному дереву функций.
ini_setВременно изменить директиву, которую разрешено менять из пользовательского кода.
PHP 4–8. С PHP 8.1 value принимает любой scalar и null; раньше только string. · standard
ini_set(string $option, string|int|float|bool|null $value): string|falseВременно изменить директиву, которую разрешено менять из пользовательского кода.
Изменение действует в текущем запросе/процессе и не записывает файл. Уровень INI_USER допускает runtime; INI_PERDIR/SYSTEM обычно требуют конфигурации до запуска. Возвращённая прежняя строка позволяет аккуратно восстановить состояние. Значение null и scalar преобразуются по договору директивы.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
$old = ini_set('precision', '7');
echo ini_get('precision'), "\n";
echo is_string($old) ? "прежнее значение сохранено\n" : "изменение запрещено\n";
if ($old !== false) {
ini_set('precision', $old);
}
Ожидаемый результат
7
прежнее значение сохранено
ini_set возвращает прежнюю строку, а не true. Изменение действует в текущем запросе и только для директивы, допускающей runtime-уровень.
<?php
declare(strict_types=1);
var_dump(ini_get('php_manual.unknown_directive'));
var_dump(ini_set('php_manual.unknown_directive', '1'));
Ожидаемый результат
bool(false)
bool(false)
Неизвестное имя даёт false и при чтении, и при попытке изменения. Для известной, но системной директивы ini_set тоже может вернуть false.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| option | Имя директивы. |
| value | Новое string|int|float|bool|null значение; фактическая форма хранится как ini-строка. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | ini_set(string $option, string|int|float|bool|null $value): string|false |
| Результат | string прежнего значения либо false. |
| Ошибки и особые значения | false при неизвестной или недоступной директиве. Предупреждение/эффект зависит от конкретной настройки; изменение одного SAPI не меняет другие. |
| Версии | PHP 4–8. С PHP 8.1 value принимает любой scalar и null; раньше только string. Официальный диапазон узла: (PHP 4, PHP 5, PHP 7, PHP 8). |
| Среда | Все SAPI, если ниже не указано иное. |
Рядом: ini_get, ini_restore, ini_get_all, ini_alter.
Вернуться к карте задач или полному дереву функций.
php_ini_loaded_fileУзнать путь основного php.ini выбранного процесса.
Есть в проверенном PHP 8.5.11 · standard
php_ini_loaded_file(): string|falseУзнать путь основного php.ini выбранного процесса.
Функция помогает объяснить, почему терминал и сайт ведут себя по-разному: каждый бинарник/SAPI может загрузить свой основной файл. false допустим, если PHP запущен без конфигурации. Кроме главного файла существуют scan-директории и настройки сервера, поэтому одного пути недостаточно для полного снимка.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
$main = php_ini_loaded_file();
$scanned = php_ini_scanned_files();
echo is_string($main) || $main === false ? "главный ini: допустимый результат\n" : "ошибка\n";
echo is_string($scanned) || $scanned === false ? "scan ini: допустимый результат\n" : "ошибка\n";
Ожидаемый результат
главный ini: допустимый результат
scan ini: допустимый результат
Для php_ini_loaded_file false означает, что основной ini не загружен. Для php_ini_scanned_files false означает, что каталог дополнительного сканирования не настроен; пустая строка означает настроенный каталог без распознанных дополнительных ini, а непустая строка перечисляет найденные файлы. Пути раскрывают устройство сервера, поэтому полный вывод держат в закрытой диагностике.
<?php
declare(strict_types=1);
$before = get_required_files();
require __DIR__ . '/audit-bootstrap.php';
$after = get_required_files();
$fixture = realpath(__DIR__ . '/audit-bootstrap.php');
$path = get_include_path();
$mainIni = php_ini_loaded_file();
$scanIni = php_ini_scanned_files();
$sapi = php_sapi_name();
$fileOk = is_string($fixture) && in_array($fixture, $after, true)
&& count($after) === count($before) + 1;
$environmentOk = (is_string($path) || $path === false)
&& (is_string($mainIni) || $mainIni === false)
&& (is_string($scanIni) || $scanIni === false)
&& (is_string($sapi) || $sapi === false);
echo $fileOk ? "подключённый файл найден\n" : "файл не найден\n";
echo $environmentOk ? "среда выполнения описана\n" : "ошибка среды\n";
Ожидаемый результат
подключённый файл найден
среда выполнения описана
Такой отчёт помогает сравнить CLI и FPM: он подтверждает конкретный require, читает текущий include_path, основной и scan ini и SAPI, но не печатает абсолютные пути посетителю.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| Параметров нет | Функция вызывается без аргументов; чтение или действие и его результат описаны в договоре ниже. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | php_ini_loaded_file(): string|false |
| Результат | string абсолютного пути либо false. |
| Ошибки и особые значения | Путь раскрывает устройство сервера и не доказывает, что это единственный источник настройки. |
| Версии | Есть в проверенном PHP 8.5.11 Официальный диапазон узла: (PHP 5 >= 5.2.4, PHP 7, PHP 8). |
| Среда | Все SAPI, если ниже не указано иное. |
Более простой или безопасный выбор. Для CLI также используйте php --ini; веб-SAPI проверяйте закрытым диагностическим endpoint и удаляйте его.
Рядом: php_ini_scanned_files, php_sapi_name, ini_get_all.
Вернуться к карте задач или полному дереву функций.
php_ini_scanned_filesПолучить список дополнительных ini-файлов, разобранных после основного.
Есть в проверенном PHP 8.5.11 · standard
php_ini_scanned_files(): string|falseПолучить список дополнительных ini-файлов, разобранных после основного.
Дистрибутивы часто хранят модули и настройки в conf.d. Функция возвращает comma+newline-separated строку полных путей, а не массив. false означает, что scan-dir не задан ни сборочным --with-config-file-scan-dir, ни PHP_INI_SCAN_DIR; настроенный, но пустой каталог даёт пустую строку. Порядок важен: поздний файл способен переопределить раннее значение.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
$main = php_ini_loaded_file();
$scanned = php_ini_scanned_files();
echo is_string($main) || $main === false ? "главный ini: допустимый результат\n" : "ошибка\n";
echo is_string($scanned) || $scanned === false ? "scan ini: допустимый результат\n" : "ошибка\n";
Ожидаемый результат
главный ini: допустимый результат
scan ini: допустимый результат
Для php_ini_loaded_file false означает, что основной ini не загружен. Для php_ini_scanned_files false означает, что каталог дополнительного сканирования не настроен; пустая строка означает настроенный каталог без распознанных дополнительных ini, а непустая строка перечисляет найденные файлы. Пути раскрывают устройство сервера, поэтому полный вывод держат в закрытой диагностике.
<?php
declare(strict_types=1);
$before = get_required_files();
require __DIR__ . '/audit-bootstrap.php';
$after = get_required_files();
$fixture = realpath(__DIR__ . '/audit-bootstrap.php');
$path = get_include_path();
$mainIni = php_ini_loaded_file();
$scanIni = php_ini_scanned_files();
$sapi = php_sapi_name();
$fileOk = is_string($fixture) && in_array($fixture, $after, true)
&& count($after) === count($before) + 1;
$environmentOk = (is_string($path) || $path === false)
&& (is_string($mainIni) || $mainIni === false)
&& (is_string($scanIni) || $scanIni === false)
&& (is_string($sapi) || $sapi === false);
echo $fileOk ? "подключённый файл найден\n" : "файл не найден\n";
echo $environmentOk ? "среда выполнения описана\n" : "ошибка среды\n";
Ожидаемый результат
подключённый файл найден
среда выполнения описана
Такой отчёт помогает сравнить CLI и FPM: он подтверждает конкретный require, читает текущий include_path, основной и scan ini и SAPI, но не печатает абсолютные пути посетителю.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| Параметров нет | Функция вызывается без аргументов; чтение или действие и его результат описаны в договоре ниже. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | php_ini_scanned_files(): string|false |
| Результат | string со списком полных путей; пустая string для настроенного пустого каталога; false, если scan-dir вообще не настроен. |
| Ошибки и особые значения | Нераспознанный файл всё равно попадёт в строку и вызовет PHP error. Не разбирайте значение как обычный CSV без учёта comma+newline и trim; не публикуйте абсолютные пути. |
| Версии | Есть в проверенном PHP 8.5.11 Официальный диапазон узла: (PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8). |
| Среда | Все SAPI, если ниже не указано иное. |
Рядом: php_ini_loaded_file, get_loaded_extensions, ini_get_all.
Вернуться к карте задач или полному дереву функций.
restore_include_pathИсторически вернуть include_path к исходному значению; удалена из PHP 8.
Deprecated с PHP 7.4.0; удалена с PHP 8.0.0 · standard
restore_include_path(): voidИсторически вернуть include_path к исходному значению; удалена из PHP 8.
Официальный узел остаётся в полном дереве для миграции. Функция deprecated с PHP 7.4 и удалена с 8.0; до удаления она возвращала include_path к исходному master-значению php.ini. Прямой официальный replacement — ini_restore("include_path"). Если библиотека должна вернуть не master, а значение предыдущего компонента, она сохраняет get_include_path и возвращает строку в finally.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
echo function_exists('restore_include_path') ? "историческая функция есть\n" : "в PHP 8 функция удалена\n";
Ожидаемый результат
в PHP 8 функция удалена
Не создавайте polyfill, который молча угадывает старое значение. Сохраняйте результат get_include_path до изменения.
<?php
declare(strict_types=1);
$master = get_include_path();
set_include_path(__DIR__ . '/temporary-master');
echo basename((string) get_include_path()), "\n";
ini_restore('include_path');
echo get_include_path() === $master ? "master возвращён\n" : "master отличается\n";
$previous = get_include_path();
try {
set_include_path(__DIR__ . '/temporary-nested');
echo basename((string) get_include_path()), "\n";
} finally {
if ($previous !== false) {
set_include_path($previous);
}
}
echo get_include_path() === $previous ? "предыдущее значение возвращено\n" : "не удалось вернуть\n";
Ожидаемый результат
temporary-master
master возвращён
temporary-nested
предыдущее значение возвращено
ini_restore("include_path") — прямой replacement restore_include_path для master-значения. Сохранённая строка и finally возвращают значение предыдущего компонента при вложенном временном изменении.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| Параметров нет | Функция вызывается без аргументов; чтение или действие и его результат описаны в договоре ниже. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | restore_include_path(): void |
| Результат | Исторически void. |
| Ошибки и особые значения | Функции нет в PHP 8.0+. Нельзя вызывать условно без function_exists в совместимом legacy-коде. |
| Версии | Deprecated с PHP 7.4.0; удалена с PHP 8.0.0 Официальный диапазон узла: (PHP 4 >= 4.3.0, PHP 5, PHP 7). |
| Среда | Все SAPI, если ниже не указано иное. |
Более простой или безопасный выбор. Для master-значения вызовите ini_restore("include_path"); для вложенного временного изменения сохраните старую строку и верните её set_include_path в finally.
Рядом: get_include_path, set_include_path.
Вернуться к карте задач или полному дереву функций.
set_include_pathЗаменить строку каталогов поиска include для текущего выполнения.
Есть в проверенном PHP 8.5.11 · standard
set_include_path(string $include_path): string|falseЗаменить строку каталогов поиска include для текущего выполнения.
Функция не добавляет один каталог сама: ей передают целую новую строку. Если нужно дополнить, соединяют новый путь, PATH_SEPARATOR и старый. Изменение действует до конца текущего скрипта/запроса, поэтому библиотека должна вернуть прежнее значение, если остальной код ещё будет выполняться. Оно не является постоянной перенастройкой будущих запросов persistent FPM-worker. Composer обычно решает загрузку классов яснее.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
$old = get_include_path();
$new = __DIR__ . '/vendor' . PATH_SEPARATOR . __DIR__ . '/shared';
$previous = set_include_path($new);
$parts = explode(PATH_SEPARATOR, (string) get_include_path());
echo basename($parts[0]), '|', basename($parts[1]), "\n";
if ($previous !== false) {
set_include_path($previous);
}
Ожидаемый результат
vendor|shared
PATH_SEPARATOR выбирает ; на Windows и : на Unix. Явные пути проекта и Composer autoload обычно яснее глобального поиска по include_path.
<?php
declare(strict_types=1);
$master = get_include_path();
set_include_path(__DIR__ . '/temporary-master');
echo basename((string) get_include_path()), "\n";
ini_restore('include_path');
echo get_include_path() === $master ? "master возвращён\n" : "master отличается\n";
$previous = get_include_path();
try {
set_include_path(__DIR__ . '/temporary-nested');
echo basename((string) get_include_path()), "\n";
} finally {
if ($previous !== false) {
set_include_path($previous);
}
}
echo get_include_path() === $previous ? "предыдущее значение возвращено\n" : "не удалось вернуть\n";
Ожидаемый результат
temporary-master
master возвращён
temporary-nested
предыдущее значение возвращено
ini_restore("include_path") — прямой replacement restore_include_path для master-значения. Сохранённая строка и finally возвращают значение предыдущего компонента при вложенном временном изменении.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| include_path | Полная новая строка путей, разделённых PATH_SEPARATOR. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | set_include_path(string $include_path): string|false |
| Результат | string прежнего пути либо false. |
| Ошибки и особые значения | false при невозможности изменения. Неверный/нечитаемый каталог обнаружится позже на include; порядок способен подменить одноимённый файл. |
| Версии | Есть в проверенном PHP 8.5.11 Официальный диапазон узла: (PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8). |
| Среда | Все SAPI, если ниже не указано иное. |
Рядом: get_include_path, restore_include_path, get_included_files.
Вернуться к карте задач или полному дереву функций.
sys_get_temp_dirПолучить временный каталог, назначенный текущему процессу системой.
Есть в проверенном PHP 8.5.11 · standard
sys_get_temp_dir(): stringПолучить временный каталог, назначенный текущему процессу системой.
Путь зависит от TMPDIR/TEMP, ОС и конфигурации. Функция не создаёт отдельную приватную папку и не резервирует имя. Для файла используйте tempnam/tmpfile, проверяйте ошибки, минимальные права и уборку. В контейнере каталог локален экземпляру и может иметь ограниченный объём.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
$directory = sys_get_temp_dir();
echo is_string($directory) && $directory !== '' ? "каталог получен от среды\n" : "каталог неизвестен\n";
Ожидаемый результат
каталог получен от среды
Путь зависит от ОС и конфигурации процесса. Его существование не даёт права хранить там секрет бессрочно и не означает, что два сервера видят один каталог.
<?php
declare(strict_types=1);
$directory = sys_get_temp_dir();
$path = tempnam($directory, 'phpmanual-');
if ($path === false) {
throw new RuntimeException('Не удалось создать временный файл');
}
file_put_contents($path, 'draft');
echo is_file($path) ? "временный файл создан\n" : "нет файла\n";
unlink($path);
Ожидаемый результат
временный файл создан
Функция возвращает каталог, но не резервирует имя. tempnam атомарно создаёт файл; приложение всё равно задаёт права, лимит размера и гарантированную уборку.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| Параметров нет | Функция вызывается без аргументов; чтение или действие и его результат описаны в договоре ниже. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | sys_get_temp_dir(): string |
| Результат | string пути. |
| Ошибки и особые значения | Путь может быть недоступен для записи, общим для разных пользователей или недостаточным по месту. Не конкатенируйте предсказуемое имя для конкурентной записи. |
| Версии | Есть в проверенном PHP 8.5.11 Официальный диапазон узла: (PHP 5 >= 5.2.1, PHP 7, PHP 8). |
| Среда | Все SAPI, если ниже не указано иное. |
Более простой или безопасный выбор. tmpfile создаёт автоматически удаляемый поток; tempnam атомарно создаёт именованный файл.
Вернуться к карте задач или полному дереву функций.
cli_get_process_titleПрочитать видимое ОС название текущего CLI-процесса.
Есть в проверенном PHP 8.5.11 · standard
cli_get_process_title(): ?stringПрочитать видимое ОС название текущего CLI-процесса.
Заголовок помогает оператору различать несколько долгоживущих worker: import, mail, reports. Это изменяемая подпись, а не имя PHP-файла и не надёжный уникальный идентификатор. Поддержка зависит от ОС; функция предназначена для CLI.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
if (PHP_SAPI !== 'cli') {
echo "нужен CLI\n";
return;
}
$changed = cli_set_process_title('php-manual-worker');
$title = cli_get_process_title();
echo $changed && $title === 'php-manual-worker' ? "имя worker установлено\n" : "платформа не поддерживает имя\n";
Ожидаемый результат
имя worker установлено
Опыт выполняется в отдельном CLI-процессе, который сразу завершается. Заголовок помогает оператору отличать worker в диспетчере процессов, но не является уникальным ID или механизмом блокировки.
<?php
declare(strict_types=1);
cli_set_process_title('shop:catalog-import');
$title = cli_get_process_title();
$pid = getmypid();
echo str_starts_with((string) $title, 'shop:') && is_int($pid) && $pid > 0
? "роль и PID известны\n"
: "среда не поддержана\n";
Ожидаемый результат
роль и PID известны
Название отвечает на вопрос «что делает процесс», PID — «какой именно запуск». PID может быть переиспользован ОС; постоянный ID задания храните отдельно.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| Параметров нет | Функция вызывается без аргументов; чтение или действие и его результат описаны в договоре ниже. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | cli_get_process_title(): ?string |
| Результат | ?string: текущий заголовок или null, если получить его нельзя. |
| Ошибки и особые значения | В CLI на неподдерживаемой ОС выдаёт E_WARNING и возвращает null. Вне CLI сама функция недоступна, поэтому прямой вызов приводит к Error. Отображение в ps/top может отличаться от возвращённой строки. |
| Версии | Есть в проверенном PHP 8.5.11 Официальный диапазон узла: (PHP 5 >= 5.5.0, PHP 7, PHP 8). |
| Среда | CLI; возможность и длина заголовка зависят от ОС. |
Более простой или безопасный выбор. Для журналов добавляйте отдельный стабильный job/request ID; title оставляйте операторской подсказкой.
Рядом: cli_set_process_title, getmypid, php_sapi_name.
Вернуться к карте задач или полному дереву функций.
cli_set_process_titleЗадать CLI-worker понятную роль в списке процессов.
PHP 5.5–8. С PHP 8.5 слишком длинный title даёт E_WARNING; раньше он мог обрезаться. · standard
cli_set_process_title(string $title): boolЗадать CLI-worker понятную роль в списке процессов.
В начале долгоживущей команды можно назвать процесс shop:catalog-import. Это облегчает ps/Task Manager и диагностику зависшего worker. Заголовок общепроцессный, поэтому не меняйте его данными одного клиента и не используйте как lock. Короткая одноразовая команда обычно не требует настройки.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
if (PHP_SAPI !== 'cli') {
echo "нужен CLI\n";
return;
}
$changed = cli_set_process_title('php-manual-worker');
$title = cli_get_process_title();
echo $changed && $title === 'php-manual-worker' ? "имя worker установлено\n" : "платформа не поддерживает имя\n";
Ожидаемый результат
имя worker установлено
Опыт выполняется в отдельном CLI-процессе, который сразу завершается. Заголовок помогает оператору отличать worker в диспетчере процессов, но не является уникальным ID или механизмом блокировки.
<?php
declare(strict_types=1);
cli_set_process_title('shop:catalog-import');
$title = cli_get_process_title();
$pid = getmypid();
echo str_starts_with((string) $title, 'shop:') && is_int($pid) && $pid > 0
? "роль и PID известны\n"
: "среда не поддержана\n";
Ожидаемый результат
роль и PID известны
Название отвечает на вопрос «что делает процесс», PID — «какой именно запуск». PID может быть переиспользован ОС; постоянный ID задания храните отдельно.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| title | Новая доверенная строка заголовка. Не помещайте секреты или непроверенный пользовательский текст. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | cli_set_process_title(string $title): bool |
| Результат | bool успешности. |
| Ошибки и особые значения | В CLI на неподдерживаемой ОС выдаёт E_WARNING и возвращает false. Вне CLI сама функция недоступна, поэтому прямой вызов приводит к Error. С PHP 8.5 слишком длинный title выдаёт E_WARNING; раньше он мог молча обрезаться. ОС ограничивает длину и отображение. |
| Версии | PHP 5.5–8. С PHP 8.5 слишком длинный title даёт E_WARNING; раньше он мог обрезаться. Официальный диапазон узла: (PHP 5 >= 5.5.0, PHP 7, PHP 8). |
| Среда | CLI; платформенные ограничения. |
Рядом: cli_get_process_title, getmypid, getopt.
Вернуться к карте задач или полному дереву функций.
get_current_userПолучить имя владельца главного PHP-файла с отдельной семантикой Windows.
Есть в проверенном PHP 8.5.11 · standard
get_current_user(): stringПолучить имя владельца главного PHP-файла с отдельной семантикой Windows.
Несмотря на название, это не текущий пользователь сайта. На Unix PHP берёт UID главного исполняемого файла и преобразует его в имя владельца. В Windows реализация возвращает имя учётной записи текущего процесса. Если у запуска вообще нет исходного файла, например у части вызовов php -r, результатом может быть пустая строка. Поэтому функция годится для закрытой диагностики среды, но не для авторизации посетителя и не как переносимая проверка прав файла.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
$identity = get_current_user();
echo is_string($identity) ? "строка системной идентичности получена\n" : "неожиданный тип\n";
echo getmypid() !== false ? "процесс определён отдельно\n" : "PID недоступен\n";
Ожидаемый результат
строка системной идентичности получена
процесс определён отдельно
На Unix get_current_user относится к владельцу главного файла, а в Windows — к учётной записи процесса; source-less запуск способен вернуть пустую строку. Ни один вариант не обозначает вошедшего покупателя. Для авторизации нужен пользователь приложения.
<?php
declare(strict_types=1);
$owner = get_current_user();
$uid = getmyuid();
$gid = getmygid();
$inode = getmyinode();
$modified = getlastmod();
$identityOk = is_string($owner)
&& (is_int($uid) || $uid === false)
&& (is_int($gid) || $gid === false);
$fileOk = (is_int($inode) || $inode === false)
&& (is_int($modified) || $modified === false);
echo $identityOk ? "идентичность entrypoint прочитана\n" : "нет метаданных владельца\n";
echo $fileOk ? "метаданные entrypoint прочитаны\n" : "нет метаданных файла\n";
Ожидаемый результат
идентичность entrypoint прочитана
метаданные entrypoint прочитаны
Один закрытый deploy-check читает все пять API, но намеренно не выводит имя, UID/GID, inode или timestamp. На Windows и source-less CLI часть значений относится к процессу либо может быть false/пустой строкой.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| Параметров нет | Функция вызывается без аргументов; чтение или действие и его результат описаны в договоре ниже. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | get_current_user(): string |
| Результат | string: имя владельца главного файла на Unix, имя учётной записи процесса в Windows либо пустая строка, если исходный файл/имя определить нельзя. |
| Ошибки и особые значения | Семантика различается по платформам; результат не является пользователем веб-приложения и может не соответствовать effective UID процесса. Не подходит для решения о доступе. |
| Версии | Есть в проверенном PHP 8.5.11 Официальный диапазон узла: (PHP 4, PHP 5, PHP 7, PHP 8). |
| Среда | Все SAPI, если ниже не указано иное. |
Более простой или безопасный выбор. Пользователя приложения берите из проверенной аутентификации; системную идентичность Unix — из POSIX API.
Рядом: getmyuid, getmygid, getmypid.
Вернуться к карте задач или полному дереву функций.
getlastmodПолучить время последнего изменения главного скрипта.
Есть в проверенном PHP 8.5.11 · standard
getlastmod(): int|falseПолучить время последнего изменения главного скрипта.
Функция относится к первичному запрошенному/исполняемому файлу, а не к самому новому include. Unix timestamp можно использовать для локального диагностического заголовка или простого cache validator, если модель развёртывания действительно меняет mtime. У запуска без исходного файла метки нет. Современная сборка из нескольких файлов обычно использует явный release hash.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
$modifiedAt = getlastmod();
echo is_int($modifiedAt) && $modifiedAt > 0
? "Unix timestamp главного файла получен\n"
: "время изменения недоступно\n";
Ожидаемый результат
Unix timestamp главного файла получен
Первый пример показывает один вызов без массива и callback. Возвращённое число — Unix timestamp entrypoint, а не дата последнего include и не версия всего релиза.
<?php
declare(strict_types=1);
$owner = get_current_user();
$uid = getmyuid();
$gid = getmygid();
$inode = getmyinode();
$modified = getlastmod();
$identityOk = is_string($owner)
&& (is_int($uid) || $uid === false)
&& (is_int($gid) || $gid === false);
$fileOk = (is_int($inode) || $inode === false)
&& (is_int($modified) || $modified === false);
echo $identityOk ? "идентичность entrypoint прочитана\n" : "нет метаданных владельца\n";
echo $fileOk ? "метаданные entrypoint прочитаны\n" : "нет метаданных файла\n";
Ожидаемый результат
идентичность entrypoint прочитана
метаданные entrypoint прочитаны
Один закрытый deploy-check читает все пять API, но намеренно не выводит имя, UID/GID, inode или timestamp. На Windows и source-less CLI часть значений относится к процессу либо может быть false/пустой строкой.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| Параметров нет | Функция вызывается без аргументов; чтение или действие и его результат описаны в договоре ниже. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | getlastmod(): int|false |
| Результат | int Unix timestamp либо false. |
| Ошибки и особые значения | false при невозможности stat и при запуске без исходного файла. Время файла может сохраняться при deploy, иметь грубое разрешение и не отражать изменения зависимостей. |
| Версии | Есть в проверенном PHP 8.5.11 Официальный диапазон узла: (PHP 4, PHP 5, PHP 7, PHP 8). |
| Среда | Все SAPI, если ниже не указано иное. |
Более простой или безопасный выбор. Для версии приложения храните build/release ID, охватывающий все файлы и assets.
Рядом: getmyinode, get_included_files.
Вернуться к карте задач или полному дереву функций.
getmygidПрочитать числовой group ID владельца главного файла.
Есть в проверенном PHP 8.5.11 · standard
getmygid(): int|falseПрочитать числовой group ID владельца главного файла.
При обычном файловом запуске это GID владельца главного файла, а не effective GID процесса и не группа пользователя сайта. Если исходного файла нет, реализация PHP подставляет real GID процесса. На Windows системные совместимые макросы могут дать условное значение, поэтому число нельзя трактовать как Unix ownership. Права всё равно проверяются конкретной файловой операцией и ACL.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
$gid = getmygid();
echo is_int($gid) ? "GID владельца entrypoint получен\n" : "GID недоступен\n";
Ожидаемый результат
GID владельца entrypoint получен
Это отдельный минимальный вызов. На Unix число описывает группу владельца entrypoint; на Windows и необычных файловых системах его смысл ограничен.
<?php
declare(strict_types=1);
$owner = get_current_user();
$uid = getmyuid();
$gid = getmygid();
$inode = getmyinode();
$modified = getlastmod();
$identityOk = is_string($owner)
&& (is_int($uid) || $uid === false)
&& (is_int($gid) || $gid === false);
$fileOk = (is_int($inode) || $inode === false)
&& (is_int($modified) || $modified === false);
echo $identityOk ? "идентичность entrypoint прочитана\n" : "нет метаданных владельца\n";
echo $fileOk ? "метаданные entrypoint прочитаны\n" : "нет метаданных файла\n";
Ожидаемый результат
идентичность entrypoint прочитана
метаданные entrypoint прочитаны
Один закрытый deploy-check читает все пять API, но намеренно не выводит имя, UID/GID, inode или timestamp. На Windows и source-less CLI часть значений относится к процессу либо может быть false/пустой строкой.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| Параметров нет | Функция вызывается без аргументов; чтение или действие и его результат описаны в договоре ниже. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | getmygid(): int|false |
| Результат | int: GID главного файла; при source-less запуске — real GID процесса; либо false, если получить число нельзя. |
| Ошибки и особые значения | Платформенный результат; в Windows значение условно, а число без связи с конкретным режимом запуска и политикой ничего не доказывает. |
| Версии | Есть в проверенном PHP 8.5.11 Официальный диапазон узла: (PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8). |
| Среда | Владение файлом особенно осмысленно на Unix; Windows ограниченно. |
Более простой или безопасный выбор. Для process GID на Unix используйте posix_getegid; для доступа обработайте fopen/rename и его ошибку.
Рядом: getmyuid, get_current_user, getmypid.
Вернуться к карте задач или полному дереву функций.
getmyinodeПолучить inode главного скрипта там, где файловая система его предоставляет.
Есть в проверенном PHP 8.5.11 · standard
getmyinode(): int|falseПолучить inode главного скрипта там, где файловая система его предоставляет.
Inode идентифицирует объект внутри конкретной файловой системы, но может измениться при атомарной замене и быть переиспользован. Он не глобален между серверами и не является версией файла. Практическая роль узкая: закрытая диагностика факта замены текущего entrypoint.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
$inode = getmyinode();
echo is_int($inode) ? "inode главного файла получен\n" : "inode недоступен\n";
Ожидаемый результат
inode главного файла получен
Inode полезен только внутри конкретной файловой системы и может измениться после замены файла. Это не глобальный ID релиза и не хеш содержимого.
<?php
declare(strict_types=1);
$owner = get_current_user();
$uid = getmyuid();
$gid = getmygid();
$inode = getmyinode();
$modified = getlastmod();
$identityOk = is_string($owner)
&& (is_int($uid) || $uid === false)
&& (is_int($gid) || $gid === false);
$fileOk = (is_int($inode) || $inode === false)
&& (is_int($modified) || $modified === false);
echo $identityOk ? "идентичность entrypoint прочитана\n" : "нет метаданных владельца\n";
echo $fileOk ? "метаданные entrypoint прочитаны\n" : "нет метаданных файла\n";
Ожидаемый результат
идентичность entrypoint прочитана
метаданные entrypoint прочитаны
Один закрытый deploy-check читает все пять API, но намеренно не выводит имя, UID/GID, inode или timestamp. На Windows и source-less CLI часть значений относится к процессу либо может быть false/пустой строкой.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| Параметров нет | Функция вызывается без аргументов; чтение или действие и его результат описаны в договоре ниже. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | getmyinode(): int|false |
| Результат | int inode либо false. |
| Ошибки и особые значения | При запуске без исходного файла возвращается false. На Windows/некоторых файловых системах нет переносимой семантики. Один inode без device ID не образует глобальную пару. |
| Версии | Есть в проверенном PHP 8.5.11 Официальный диапазон узла: (PHP 4, PHP 5, PHP 7, PHP 8). |
| Среда | Файлово-системная и ОС-зависимая семантика. |
Более простой или безопасный выбор. Для выпуска используйте release hash; для отдельного файла — content hash при реальной необходимости.
Рядом: getlastmod, get_included_files.
Вернуться к карте задач или полному дереву функций.
getmypidПолучить ID текущего процесса для локальной диагностики и координации.
Есть в проверенном PHP 8.5.11 · standard
getmypid(): int|falseПолучить ID текущего процесса для локальной диагностики и координации.
PID помогает увидеть, обслужили ли две записи одним worker и какой процесс держит локальный ресурс. После завершения ОС способна выдать тот же номер другому процессу, поэтому PID не хранится как вечная личность job. PID не уникален во времени и даёт слабую энтропию: его нельзя использовать как токен, пароль, nonce или иной секрет. В FPM разные запросы могут попасть в разные workers.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
$pid = getmypid();
echo is_int($pid) && $pid > 0 ? "PID процесса получен\n" : "PID недоступен\n";
Ожидаемый результат
PID процесса получен
PID различает одновременно работающие процессы на одной ОС в текущий момент. Он не является вечным идентификатором заказа: после завершения номер может быть переиспользован.
<?php
declare(strict_types=1);
cli_set_process_title('shop:catalog-import');
$title = cli_get_process_title();
$pid = getmypid();
echo str_starts_with((string) $title, 'shop:') && is_int($pid) && $pid > 0
? "роль и PID известны\n"
: "среда не поддержана\n";
Ожидаемый результат
роль и PID известны
Название отвечает на вопрос «что делает процесс», PID — «какой именно запуск». PID может быть переиспользован ОС; постоянный ID задания храните отдельно.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| Параметров нет | Функция вызывается без аргументов; чтение или действие и его результат описаны в договоре ниже. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | getmypid(): int|false |
| Результат | int PID либо false. |
| Ошибки и особые значения | false при невозможности получить ID. Наличие PID не доказывает, что старый процесс ещё жив или принадлежит вашему приложению; в security-зависимом контексте на PID не полагаются. |
| Версии | Есть в проверенном PHP 8.5.11 Официальный диапазон узла: (PHP 4, PHP 5, PHP 7, PHP 8). |
| Среда | Все SAPI, если ниже не указано иное. |
Более простой или безопасный выбор. Для бизнес-задачи генерируйте отдельный job/request ID; PID добавляйте как локальный диагностический атрибут.
Рядом: cli_get_process_title, zend_thread_id, getrusage.
Вернуться к карте задач или полному дереву функций.
getmyuidПрочитать числовой user ID владельца главного скрипта.
Есть в проверенном PHP 8.5.11 · standard
getmyuid(): int|falseПрочитать числовой user ID владельца главного скрипта.
При обычном файловом запуске UID относится к entrypoint и никак не описывает вошедшего покупателя. Если исходного файла нет, реализация PHP подставляет real UID процесса. В Windows совместимый системный макрос может вернуть условное число, а не Unix-владельца. В Unix-диагностике ownership можно сравнить с ожидаемым, но решение о доступе принимает фактическая операция ОС.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
$uid = getmyuid();
echo is_int($uid) ? "UID владельца entrypoint получен\n" : "UID недоступен\n";
Ожидаемый результат
UID владельца entrypoint получен
Число относится к владельцу главного файла в текущей среде. Оно не обозначает вошедшего пользователя сайта и само по себе не доказывает право на конкретную операцию.
<?php
declare(strict_types=1);
$owner = get_current_user();
$uid = getmyuid();
$gid = getmygid();
$inode = getmyinode();
$modified = getlastmod();
$identityOk = is_string($owner)
&& (is_int($uid) || $uid === false)
&& (is_int($gid) || $gid === false);
$fileOk = (is_int($inode) || $inode === false)
&& (is_int($modified) || $modified === false);
echo $identityOk ? "идентичность entrypoint прочитана\n" : "нет метаданных владельца\n";
echo $fileOk ? "метаданные entrypoint прочитаны\n" : "нет метаданных файла\n";
Ожидаемый результат
идентичность entrypoint прочитана
метаданные entrypoint прочитаны
Один закрытый deploy-check читает все пять API, но намеренно не выводит имя, UID/GID, inode или timestamp. На Windows и source-less CLI часть значений относится к процессу либо может быть false/пустой строкой.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| Параметров нет | Функция вызывается без аргументов; чтение или действие и его результат описаны в договоре ниже. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | getmyuid(): int|false |
| Результат | int: UID главного файла; при source-less запуске — real UID процесса; либо false, если получить число нельзя. |
| Ошибки и особые значения | Ограниченная переносимость и ложные выводы при Windows, контейнерах, ACL и сетевых файловых системах. |
| Версии | Есть в проверенном PHP 8.5.11 Официальный диапазон узла: (PHP 4, PHP 5, PHP 7, PHP 8). |
| Среда | Полезнее на Unix; на Windows возможна ограниченная информация. |
Более простой или безопасный выбор. Process identity на Unix смотрите POSIX-функциями, пользователя сайта — через слой авторизации.
Рядом: get_current_user, getmygid, getmypid.
Вернуться к карте задач или полному дереву функций.
getoptРазобрать опции аргументов командного запуска без ручного перебора argv.
PHP 4.3–8. Параметр rest_index добавлен в PHP 7.1. · standard
getopt(string $short_options, array $long_options = [], int &$rest_index = null): array|falseРазобрать опции аргументов командного запуска без ручного перебора argv.
short_options описывает однобуквенные ключи: без двоеточия флаг, с : обязательное значение, с :: необязательное. long_options — массив строк по тем же правилам. Необязательное значение нельзя отделить пробелом. Разбор останавливается на первом не-option; третий параметр получает индекс, с которого можно взять остаток argv. Повторённый ключ превращается в массив значений. Парсер не валидирует бизнес-типы: строку количества ещё нужно строго превратить в число и проверить диапазон.
Первый запуск и развитие задачи
<?php
$options = getopt('n:', ['format:']);
echo $options['n'], '|', $options['format'], "\n";
Ожидаемый результат
5|json
Сохраните как import.php и запустите: php import.php -n 5 --format=json. Двоеточие после имени означает обязательное значение; getopt читает аргументы процесса, а не $_GET.
<?php
$rest = null;
$options = getopt('', ['dry-run'], $rest);
$path = $argv[$rest] ?? null;
echo isset($options['dry-run']) ? "без записи\n" : "с записью\n";
echo $path ?? "путь не передан", "\n";
Ожидаемый результат
без записи
catalog.csv
Команда: php import.php --dry-run catalog.csv. Третий параметр получает индекс первого необработанного аргумента и передаётся по ссылке.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| short_options | Строка спецификации коротких ключей, например n:. Имена коротких ключей допускают только a-z, A-Z и 0-9; : означает обязательное значение, :: — необязательное. |
| long_options | Массив спецификаций, например ["format:", "dry-run"]. |
| rest_index | Необязательная int-переменная по ссылке; PHP записывает индекс первого непроанализированного элемента argv. Runtime Reflection 8.5.11 не показывает int в arginfo, но официальный договор и tagged stub показывают. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | getopt(string $short_options, array $long_options = [], int &$rest_index = null): array|false |
| Reflection PHP 8.5.11 | getopt(string $short_options, array $long_options = [], &$rest_index = null): array|false. Runtime arginfo не показывает тип int у выходного параметра, но официальный договор и tagged stub описывают int &$rest_index. |
| Результат | array распознанных опций либо false. |
| Ошибки и особые значения | Повторные опции/необязательные значения имеют особую форму; неизвестные опции и позиционные аргументы требуют явной политики. Работает с argv процесса, не с веб-запросом. |
| Версии | PHP 4.3–8. Параметр rest_index добавлен в PHP 7.1. Официальный диапазон узла: (PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8). |
| Среда | Предназначена для аргументов командного запуска из argv; HTTP query/form data не разбирает. Официальный узел не объявляет функцию CLI-only. |
Более простой или безопасный выбор. Для большой CLI-команды используйте компонент console с типами, help и подкомандами; getopt остаётся базовым механизмом.
Рядом: php_sapi_name, getenv.
Вернуться к карте задач или полному дереву функций.
php_sapi_nameУзнать интерфейс, через который PHP выполняет текущий код.
Есть в проверенном PHP 8.5.11 · standard
php_sapi_name(): string|falseУзнать интерфейс, через который PHP выполняет текущий код.
CLI, FPM-FCGI, Apache module и встроенный cli-server имеют разные конфигурации и жизненный цикл. Официальные примеры возможных строк: apache, apache2handler, исторический cgi (до PHP 5.3), cgi-fcgi, cli, cli-server, embed, fpm-fcgi, litespeed и phpdbg; список не обещан исчерпывающим. Название не всегда очевидно: Apache 2 handler сообщает apache2handler. Имя SAPI полезно для диагностики и для запрета команды в web-контексте. Константа PHP_SAPI содержит то же значение без вызова функции. Имя не должно заменять проверку конкретной возможности: два FPM-pool могут иметь разные ini/права.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
$name = php_sapi_name();
echo $name === PHP_SAPI ? "имя SAPI согласовано\n" : "неожиданное различие\n";
echo $name === 'cli' ? "запуск из терминала\n" : "другой интерфейс\n";
Ожидаемый результат
имя SAPI согласовано
запуск из терминала
Проверенный пример запущен CLI. У сайта возможны fpm-fcgi, apache2handler или cli-server; это влияет на окружение и жизненный цикл.
<?php
declare(strict_types=1);
$before = get_required_files();
require __DIR__ . '/audit-bootstrap.php';
$after = get_required_files();
$fixture = realpath(__DIR__ . '/audit-bootstrap.php');
$path = get_include_path();
$mainIni = php_ini_loaded_file();
$scanIni = php_ini_scanned_files();
$sapi = php_sapi_name();
$fileOk = is_string($fixture) && in_array($fixture, $after, true)
&& count($after) === count($before) + 1;
$environmentOk = (is_string($path) || $path === false)
&& (is_string($mainIni) || $mainIni === false)
&& (is_string($scanIni) || $scanIni === false)
&& (is_string($sapi) || $sapi === false);
echo $fileOk ? "подключённый файл найден\n" : "файл не найден\n";
echo $environmentOk ? "среда выполнения описана\n" : "ошибка среды\n";
Ожидаемый результат
подключённый файл найден
среда выполнения описана
Такой отчёт помогает сравнить CLI и FPM: он подтверждает конкретный require, читает текущий include_path, основной и scan ini и SAPI, но не печатает абсолютные пути посетителю.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| Параметров нет | Функция вызывается без аргументов; чтение или действие и его результат описаны в договоре ниже. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | php_sapi_name(): string|false |
| Результат | string имени SAPI либо false (исторический договор; в обычной текущей сборке строка). |
| Ошибки и особые значения | Жёсткий список быстро стареет; неизвестное имя обрабатывайте как отдельную среду, а не автоматически безопасную. |
| Версии | Есть в проверенном PHP 8.5.11 Официальный диапазон узла: (PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8). |
| Среда | Все SAPI, если ниже не указано иное. |
Более простой или безопасный выбор. Для нужного API дополнительно проверяйте extension_loaded/function_exists и реальные права.
Рядом: php_ini_loaded_file, getenv, cli_get_process_title.
Вернуться к карте задач или полному дереву функций.
php_unameПолучить выбранную часть описания операционной системы.
PHP 4.0.2–8. С PHP 8.4 неверный mode вызывает ValueError. · standard
php_uname(string $mode = 'a'): stringПолучить выбранную часть описания операционной системы.
mode s даёт имя системы, n — hostname, r — release, v — version, m — machine, a — всё вместе. На старых Unix при неработающем системном uname PHP может вернуть сведения ОС, для которой он был собран; PHP_OS также описывает build OS. Для выбора пути/команды лучше проверять PHP_OS_FAMILY и наличие конкретного API. Полный uname раскрывает hostname и детали сборки, поэтому его не выводят посетителю.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
$system = php_uname('s');
$machine = php_uname('m');
echo $system !== '' ? "семейство ОС получено\n" : "нет ОС\n";
echo $machine !== '' ? "архитектура получена\n" : "нет архитектуры\n";
Ожидаемый результат
семейство ОС получено
архитектура получена
Режим a включает hostname и детали сборки; публичному посетителю они обычно не нужны. Для ветвления часто достаточно PHP_OS_FAMILY и проверки конкретной функции.
<?php
declare(strict_types=1);
$system = php_uname('s');
$release = php_uname('r');
$knownFamily = in_array(PHP_OS_FAMILY, ['Windows', 'BSD', 'Darwin', 'Solaris', 'Linux', 'Unknown'], true);
echo $system !== '' && $release !== '' ? "строки платформы прочитаны\n" : "платформа неизвестна\n";
echo $knownFamily ? "ветка выбрана без публикации hostname\n" : "неизвестное семейство\n";
Ожидаемый результат
строки платформы прочитаны
ветка выбрана без публикации hostname
php_uname используется для локального решения и не выводится целиком. Для структуры путей всё равно предпочтительнее PHP_OS_FAMILY, DIRECTORY_SEPARATOR и проверка нужной возможности.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| mode | Один символ a, s, n, r, v или m; default a. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | php_uname(string $mode = 'a'): string |
| Результат | string выбранной информации. |
| Ошибки и особые значения | Неверный mode вызывает ValueError в современных версиях. Строка может отличаться в контейнере и не доказывает доступность функции/утилиты. |
| Версии | PHP 4.0.2–8. С PHP 8.4 неверный mode вызывает ValueError. Официальный диапазон узла: (PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8). |
| Среда | Все SAPI, если ниже не указано иное. |
Рядом: php_sapi_name, zend_version.
Вернуться к карте задач или полному дереву функций.
zend_thread_idПолучить ID текущего потока в debug-сборке с Zend Thread Safety.
Условный API: только ZTS + --enable-debug; отсутствует в проверенной NTS non-debug PHP 8.5.11. · Core
zend_thread_id(): intПолучить ID текущего потока в debug-сборке с Zend Thread Safety.
Функция существует только там, где PHP одновременно собран с ZTS и debug mode (--enable-debug). В обычной NTS non-debug PHP 8.5.11 она отсутствует, хотя официальный узел остаётся частью полного справочника. ID полезен для низкоуровневой диагностики потока внутри процесса; он не глобален и может быть переиспользован.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
$available = function_exists('zend_thread_id');
$consistent = PHP_ZTS && PHP_DEBUG ? $available : !$available;
echo $consistent ? "наличие функции совпало с режимом сборки\n" : "проверьте сборку\n";
if ($available) {
echo zend_thread_id() >= 0 ? "thread ID получен\n" : "ошибка ID\n";
}
Ожидаемый результат
наличие функции совпало с режимом сборки
Проверенная сборка NTS non-debug, поэтому второй строки нет. Функция появится только при одновременных ZTS и debug; это диагностический номер потока, не ID пользователя и не межсерверный ключ.
<?php
declare(strict_types=1);
$parts = ['pid=' . getmypid()];
if (function_exists('zend_thread_id')) {
$parts[] = 'thread=' . zend_thread_id();
}
echo str_starts_with(implode(';', $parts), 'pid=') ? "ID запуска собран\n" : "ошибка\n";
Ожидаемый результат
ID запуска собран
PID доступен шире; thread добавляется только там, где функция существует. Для распределённой трассировки нужен отдельный request/job ID.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| Параметров нет | Функция вызывается без аргументов; чтение или действие и его результат описаны в договоре ниже. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | zend_thread_id(): int |
| Результат | int thread ID только в сборке, где одновременно включены ZTS и debug. |
| Ошибки и особые значения | В NTS или release-ZTS без debug функция отсутствует, и прямой вызов завершится ошибкой неизвестной функции. Проверяйте PHP_ZTS и function_exists. |
| Версии | Условный API: только ZTS + --enable-debug; отсутствует в проверенной NTS non-debug PHP 8.5.11. Официальный диапазон узла: (PHP 5, PHP 7, PHP 8). |
| Среда | Только debug ZTS; значение локально процессу/платформе. |
Более простой или безопасный выбор. Для обычного журнала используйте request/job ID и PID; thread ID добавляйте только при конкретной диагностике debug ZTS.
Рядом: getmypid, php_sapi_name, zend_version.
Вернуться к карте задач или полному дереву функций.
extension_loadedПроверить наличие расширения до первого обращения к его API.
Есть в проверенном PHP 8.5.11 · Core
extension_loaded(string $extension): boolПроверить наличие расширения до первого обращения к его API.
Функция отвечает только о текущем процессе/SAPI. CLI и FPM могут использовать разные бинарники и ini. Загруженное расширение ещё не гарантирует конкретную платформенную функцию или внешний сервис, поэтому после общей проверки иногда нужен function_exists, список драйверов или пробное подключение.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
$available = extension_loaded('json');
var_dump($available);
Ожидаемый результат
bool(true)
extension_loaded возвращает bool. В поддерживаемой ветке PHP расширение JSON обязательно, поэтому учебный запуск предсказуемо показывает true. В реальном проекте следующий шаг — до первого использования зависимости явно обработать false понятной ошибкой или альтернативой.
<?php
declare(strict_types=1);
$coreReady = extension_loaded('Core');
$constants = get_defined_constants(false);
$ordinary = get_loaded_extensions(false);
$zend = get_loaded_extensions(true);
ob_start();
$creditsOk = phpcredits(CREDITS_QA);
ob_end_clean();
ob_start();
$infoOk = phpinfo(INFO_MODULES);
ob_end_clean();
$engine = zend_version();
$capabilitiesOk = $coreReady && isset($constants['PHP_VERSION'])
&& in_array('Core', $ordinary, true) && is_array($zend);
$reportsOk = $creditsOk === true && $infoOk === true && $engine !== '';
echo $capabilitiesOk ? "возможности подтверждены\n" : "неполная среда\n";
echo $reportsOk ? "локальные отчёты сформированы и отброшены\n" : "ошибка отчёта\n";
Ожидаемый результат
возможности подтверждены
локальные отчёты сформированы и отброшены
Пример отличается от полного inventory: код проверяет конкретные факты, phpcredits/phpinfo удерживает в локальном буфере и удаляет, а наружу отдаёт только две безопасные фразы.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| extension | Имя расширения, например json, intl или pdo. Сопоставление регистронезависимо, но используйте каноническое имя. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | extension_loaded(string $extension): bool |
| Результат | bool. |
| Ошибки и особые значения | Отдельной ошибки нет: false означает, что расширение не загружено под этим именем. Функция ничего не устанавливает. |
| Версии | Есть в проверенном PHP 8.5.11 Официальный диапазон узла: (PHP 4, PHP 5, PHP 7, PHP 8). |
| Среда | Все SAPI, если ниже не указано иное. |
Более простой или безопасный выбор. На старте приложения выдайте одно ясное сообщение о недостающей зависимости, вместо позднего вызова неизвестной функции.
Рядом: get_loaded_extensions, get_extension_funcs, phpversion.
Вернуться к карте задач или полному дереву функций.
get_extension_funcsПолучить имена функций, зарегистрированных конкретным расширением.
Есть в проверенном PHP 8.5.11 · Core
get_extension_funcs(string $extension): array|falseПолучить имена функций, зарегистрированных конкретным расширением.
Список помогает понять, почему extension_loaded=true, но ожидаемого имени нет, либо сравнить две сборки. Он перечисляет функции, не методы классов, константы и не внешние драйверы. Названия лучше проверять строгим in_array после успешного array-результата.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
$functions = get_extension_funcs('json');
echo is_array($functions) && in_array('json_encode', $functions, true)
? "json_encode доступна\n"
: "нет нужного API\n";
Ожидаемый результат
json_encode доступна
Список имён помогает диагностировать сборку. Он не говорит, умеет ли функция обработать конкретные данные и правильно ли настроено приложение.
<?php
declare(strict_types=1);
$functions = get_extension_funcs('lesson_extension_that_does_not_exist');
var_dump($functions);
Ожидаемый результат
bool(false)
false отличается от пустого массива. Перед вызовом API обычно понятнее проверить extension_loaded и выдать сообщение о зависимости.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| extension | Имя загруженного расширения в нижнем регистре. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | get_extension_funcs(string $extension): array|false |
| Результат | array имён функций либо false для неизвестного/незагруженного расширения. |
| Ошибки и особые значения | false отличается от пустого массива. Условный API платформы всё равно проверяют function_exists. |
| Версии | Есть в проверенном PHP 8.5.11 Официальный диапазон узла: (PHP 4, PHP 5, PHP 7, PHP 8). |
| Среда | Все SAPI, если ниже не указано иное. |
Более простой или безопасный выбор. Если нужен один вызов, function_exists точнее и дешевле полного списка.
Рядом: extension_loaded, get_loaded_extensions, phpversion.
Вернуться к карте задач или полному дереву функций.
get_loaded_extensionsПолучить имена обычных или Zend-расширений текущего процесса.
Есть в проверенном PHP 8.5.11 · Core
get_loaded_extensions(bool $zend_extensions = false): arrayПолучить имена обычных или Zend-расширений текущего процесса.
По умолчанию возвращаются обычные модули. zend_extensions=true переключает список на Zend extensions, например OPcache/Xdebug, а не добавляет их к первому. Имена полезны для локального inventory, но наличие модуля не равно готовности базы, ICU-данных или внешней библиотеки.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
$loaded = array_map('strtolower', get_loaded_extensions());
foreach (['core', 'json', 'reflection'] as $required) {
echo $required, ': ', in_array($required, $loaded, true) ? 'есть' : 'нет', "\n";
}
Ожидаемый результат
core: есть
json: есть
reflection: есть
Вместо публичного phpinfo отчёт ограничен тремя именами. Список относится к текущему процессу: CLI и сайт могут загрузить разные ini и расширения.
<?php
declare(strict_types=1);
$coreReady = extension_loaded('Core');
$constants = get_defined_constants(false);
$ordinary = get_loaded_extensions(false);
$zend = get_loaded_extensions(true);
ob_start();
$creditsOk = phpcredits(CREDITS_QA);
ob_end_clean();
ob_start();
$infoOk = phpinfo(INFO_MODULES);
ob_end_clean();
$engine = zend_version();
$capabilitiesOk = $coreReady && isset($constants['PHP_VERSION'])
&& in_array('Core', $ordinary, true) && is_array($zend);
$reportsOk = $creditsOk === true && $infoOk === true && $engine !== '';
echo $capabilitiesOk ? "возможности подтверждены\n" : "неполная среда\n";
echo $reportsOk ? "локальные отчёты сформированы и отброшены\n" : "ошибка отчёта\n";
Ожидаемый результат
возможности подтверждены
локальные отчёты сформированы и отброшены
Пример отличается от полного inventory: код проверяет конкретные факты, phpcredits/phpinfo удерживает в локальном буфере и удаляет, а наружу отдаёт только две безопасные фразы.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| zend_extensions | false — обычные расширения; true — только Zend extensions. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | get_loaded_extensions(bool $zend_extensions = false): array |
| Результат | array строк. |
| Ошибки и особые значения | Список зависит от SAPI/ini и порядка загрузки; не считается стабильным между средами. |
| Версии | Есть в проверенном PHP 8.5.11 Официальный диапазон узла: (PHP 4, PHP 5, PHP 7, PHP 8). |
| Среда | Все SAPI, если ниже не указано иное. |
Рядом: extension_loaded, get_extension_funcs, php_ini_scanned_files.
Вернуться к карте задач или полному дереву функций.
get_magic_quotes_gpcИсторический узел magic_quotes_gpc; в последней поддерживаемой ветке всегда false, в PHP 8 удалён.
Deprecated с PHP 7.4.0; удалена с PHP 8.0.0. · standard
get_magic_quotes_gpc(): falseИсторический узел magic_quotes_gpc; в последней поддерживаемой ветке всегда false, в PHP 8 удалён.
Старые magic quotes добавляли обратные слеши к GET/POST/Cookie автоматически и смешивали получение данных с экранированием. Сама возможность удалена в PHP 5.4, поэтому сохранившаяся функция в PHP 5.4–7.4 всегда возвращала false; функция deprecated с 7.4 и удалена с 8.0. Современное приложение хранит исходное значение, валидирует его и применяет контекстный механизм: параметры SQL, htmlspecialchars для HTML, json_encode для JSON.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
foreach (['get_magic_quotes_gpc', 'get_magic_quotes_runtime'] as $name) {
echo $name, ': ', function_exists($name) ? 'есть' : 'удалена', "\n";
}
Ожидаемый результат
get_magic_quotes_gpc: удалена
get_magic_quotes_runtime: удалена
В PHP 8.5.11 обе функции отсутствуют. Возвращать всегда false пользовательским polyfill бессмысленно: старое автоматическое экранирование больше не происходит.
<?php
declare(strict_types=1);
$input = ['customer' => "O'Reilly"];
echo $input['customer'], "\n";
echo htmlspecialchars($input['customer'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), "\n";
Ожидаемый результат
O'Reilly
O'Reilly
Данные хранятся как есть. Для SQL применяют параметры подготовленного запроса, для HTML — контекстное экранирование при выводе; stripslashes не является универсальной очисткой.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| Параметров нет | Функция вызывается без аргументов; чтение или действие и его результат описаны в договоре ниже. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | get_magic_quotes_gpc(): false |
| Результат | Последний официальный контракт PHP 7: literal false. |
| Ошибки и особые значения | В PHP 8 функции нет: прямой вызов завершится Error. Polyfill false может скрыть старый код, который всё ещё выполняет ошибочный stripslashes. |
| Версии | Deprecated с PHP 7.4.0; удалена с PHP 8.0.0. Официальный диапазон узла: (PHP 4, PHP 5, PHP 7). |
| Среда | Все SAPI, если ниже не указано иное. |
Более простой или безопасный выбор. Удалите ветви magic_quotes и используйте контекстное кодирование у конкретной границы.
Рядом: get_magic_quotes_runtime, phpversion.
Вернуться к карте задач или полному дереву функций.
get_magic_quotes_runtimeИсторический узел magic_quotes_runtime; в последней поддерживаемой ветке всегда false, в PHP 8 удалён.
Deprecated с PHP 7.4.0; удалена с PHP 8.0.0. · standard
get_magic_quotes_runtime(): falseИсторический узел magic_quotes_runtime; в последней поддерживаемой ветке всегда false, в PHP 8 удалён.
Настройка magic_quotes_runtime затрагивала данные из внешних источников, но механизм удалили в PHP 5.4. Поэтому функция в PHP 5.4–7.4 всегда возвращала false; она deprecated с 7.4 и удалена с 8.0. Официальная карточка нужна для понимания legacy-проверки, а не для рекомендации stripslashes. Каждая граница теперь имеет свой договор и безопасный способ кодирования.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
foreach (['get_magic_quotes_gpc', 'get_magic_quotes_runtime'] as $name) {
echo $name, ': ', function_exists($name) ? 'есть' : 'удалена', "\n";
}
Ожидаемый результат
get_magic_quotes_gpc: удалена
get_magic_quotes_runtime: удалена
В PHP 8.5.11 обе функции отсутствуют. Возвращать всегда false пользовательским polyfill бессмысленно: старое автоматическое экранирование больше не происходит.
<?php
declare(strict_types=1);
$input = ['customer' => "O'Reilly"];
echo $input['customer'], "\n";
echo htmlspecialchars($input['customer'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), "\n";
Ожидаемый результат
O'Reilly
O'Reilly
Данные хранятся как есть. Для SQL применяют параметры подготовленного запроса, для HTML — контекстное экранирование при выводе; stripslashes не является универсальной очисткой.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| Параметров нет | Функция вызывается без аргументов; чтение или действие и его результат описаны в договоре ниже. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | get_magic_quotes_runtime(): false |
| Результат | Последний официальный контракт PHP 7: literal false. |
| Ошибки и особые значения | Функции нет в PHP 8; вызов приводит к Error. Автоматической обратной совместимости не существует. |
| Версии | Deprecated с PHP 7.4.0; удалена с PHP 8.0.0. Официальный диапазон узла: (PHP 4, PHP 5, PHP 7). |
| Среда | Все SAPI, если ниже не указано иное. |
Более простой или безопасный выбор. Удалите legacy-ветку и проверьте реальные данные/контекст вывода тестами.
Рядом: get_magic_quotes_gpc, phpversion.
Вернуться к карте задач или полному дереву функций.
get_resourcesПолучить открытые ресурсы текущего запроса, при необходимости одного типа.
PHP 7–8. Параметр type nullable с PHP 8.0. · Core
get_resources(?string $type = null): arrayПолучить открытые ресурсы текущего запроса, при необходимости одного типа.
Resource — дескриптор внешнего объекта, например потока. Функция предназначена для отладки и тестов, а не production-доступа к скрытым ресурсам других объектов. Она полезна в локальной диагностике незакрытых stream после партии импорта. Массив не объясняет владельца и не заменяет finally/fclose. Современные расширения часто используют объекты вместо resource, поэтому они сюда не попадут.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
$stream = fopen('php://temp', 'w+');
$open = get_resources('stream');
echo in_array($stream, $open, true) ? "поток найден\n" : "нет\n";
fclose($stream);
echo is_resource($stream) ? "ещё открыт\n" : "поток закрыт\n";
Ожидаемый результат
поток найден
поток закрыт
Фильтр stream ограничивает диагностический список. Он не закрывает ресурсы автоматически и не показывает владельца логической операции.
<?php
declare(strict_types=1);
try {
get_resources('lesson_unknown_resource_type');
} catch (ValueError $error) {
echo "неизвестный тип отклонён\n";
}
Ожидаемый результат
неизвестный тип отклонён
С PHP 8 неизвестный type вызывает ValueError. Сначала узнают реальные типы из конкретного API; не принимают произвольное имя из запроса пользователя.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| type | null для всех ресурсов, точное существующее имя типа вроде stream либо специальная строка "Unknown" для ресурсов неизвестного типа. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | get_resources(?string $type = null): array |
| Результат | array ресурсов, индексированный их resource ID. |
| Ошибки и особые значения | Другое неизвестное имя типа вызывает ValueError в PHP 8. Закрытый resource больше не является действующим ресурсом. |
| Версии | PHP 7–8. Параметр type nullable с PHP 8.0. Официальный диапазон узла: (PHP 7, PHP 8). |
| Среда | Все SAPI, если ниже не указано иное. |
Рядом: get_loaded_extensions, memory_get_usage.
Вернуться к карте задач или полному дереву функций.
phpcreditsСформировать сведения об участниках разработки PHP по выбранным разделам.
Есть в проверенном PHP 8.5.11 · standard
phpcredits(int $flags = CREDITS_ALL): trueСформировать сведения об участниках разработки PHP по выбранным разделам.
Функция сразу выводит текст в CLI либо HTML в web и возвращает true. Flags CREDITS_* объединяются побитовым OR; CREDITS_FULLPAGE просит полную HTML-страницу. Это информационный вывод, не метрика готовности приложения. На сайте проще дать ссылку на официальный credits, чем генерировать серверный экран.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
ob_start();
$result = phpcredits(CREDITS_GENERAL);
$text = ob_get_clean();
echo $result === true && is_string($text) && $text !== '' ? "credits сформированы локально\n" : "ошибка\n";
Ожидаемый результат
credits сформированы локально
Полный текст остаётся внутри переменной и не печатается. Для пользовательского интерфейса у этой функции почти нет практической причины; ссылка на официальные credits обычно проще.
<?php
declare(strict_types=1);
$coreReady = extension_loaded('Core');
$constants = get_defined_constants(false);
$ordinary = get_loaded_extensions(false);
$zend = get_loaded_extensions(true);
ob_start();
$creditsOk = phpcredits(CREDITS_QA);
ob_end_clean();
ob_start();
$infoOk = phpinfo(INFO_MODULES);
ob_end_clean();
$engine = zend_version();
$capabilitiesOk = $coreReady && isset($constants['PHP_VERSION'])
&& in_array('Core', $ordinary, true) && is_array($zend);
$reportsOk = $creditsOk === true && $infoOk === true && $engine !== '';
echo $capabilitiesOk ? "возможности подтверждены\n" : "неполная среда\n";
echo $reportsOk ? "локальные отчёты сформированы и отброшены\n" : "ошибка отчёта\n";
Ожидаемый результат
возможности подтверждены
локальные отчёты сформированы и отброшены
Пример отличается от полного inventory: код проверяет конкретные факты, phpcredits/phpinfo удерживает в локальном буфере и удаляет, а наружу отдаёт только две безопасные фразы.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| flags | Маска CREDITS_GROUP/GENERAL/SAPI/MODULES/DOCS/QA/FULLPAGE или CREDITS_ALL. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | phpcredits(int $flags = CREDITS_ALL): true |
| Результат | Всегда true после формирования вывода. |
| Ошибки и особые значения | Вывод зависит от SAPI и версии. Он отправляется в output buffer/ответ и может нарушить JSON/headers, если вызвать в обработчике. |
| Версии | Есть в проверенном PHP 8.5.11 Официальный диапазон узла: (PHP 4, PHP 5, PHP 7, PHP 8). |
| Среда | Все SAPI, если ниже не указано иное. |
Более простой или безопасный выбор. Ссылка на официальный credits не связывает пользовательский ответ с конфигурационным выводом PHP.
Рядом: phpinfo, get_defined_constants.
Вернуться к карте задач или полному дереву функций.
phpinfoСформировать диагностический отчёт о PHP, конфигурации, модулях и окружении.
PHP 4–8. До PHP 5.5 expose_php=off скрывал logos и credits в выводе phpinfo. · standard
phpinfo(int $flags = INFO_ALL): trueСформировать диагностический отчёт о PHP, конфигурации, модулях и окружении.
Flags INFO_* выбирают разделы, но даже узкий отчёт раскрывает версию, пути и параметры. Функция пишет напрямую в вывод: HTML в web, текст в CLI. Её используют локально или во временной строго закрытой диагностике, затем удаляют. Health endpoint должен возвращать заранее выбранные безопасные поля, а не phpinfo. Историческая оговорка: до PHP 5.5 при expose_php=off отчёт скрывал PHP/Zend logos и credits; это не современный механизм защиты страницы.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
ob_start();
$result = phpinfo(INFO_GENERAL);
$text = ob_get_clean();
echo $result === true && str_contains((string) $text, PHP_VERSION) ? "локальные сведения сформированы\n" : "ошибка\n";
Ожидаемый результат
локальные сведения сформированы
Даже INFO_GENERAL раскрывает среду. Мы только проверяем локальный буфер и не отдаём его по HTTP. Для постоянного health-check возвращайте белый список: версия приложения и состояние зависимостей.
<?php
declare(strict_types=1);
$coreReady = extension_loaded('Core');
$constants = get_defined_constants(false);
$ordinary = get_loaded_extensions(false);
$zend = get_loaded_extensions(true);
ob_start();
$creditsOk = phpcredits(CREDITS_QA);
ob_end_clean();
ob_start();
$infoOk = phpinfo(INFO_MODULES);
ob_end_clean();
$engine = zend_version();
$capabilitiesOk = $coreReady && isset($constants['PHP_VERSION'])
&& in_array('Core', $ordinary, true) && is_array($zend);
$reportsOk = $creditsOk === true && $infoOk === true && $engine !== '';
echo $capabilitiesOk ? "возможности подтверждены\n" : "неполная среда\n";
echo $reportsOk ? "локальные отчёты сформированы и отброшены\n" : "ошибка отчёта\n";
Ожидаемый результат
возможности подтверждены
локальные отчёты сформированы и отброшены
Пример отличается от полного inventory: код проверяет конкретные факты, phpcredits/phpinfo удерживает в локальном буфере и удаляет, а наружу отдаёт только две безопасные фразы.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| flags | Побитовая маска INFO_GENERAL/CREDITS/CONFIGURATION/MODULES/ENVIRONMENT/VARIABLES/LICENSE; default INFO_ALL. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | phpinfo(int $flags = INFO_ALL): true |
| Результат | Всегда true; полезные сведения уже отправлены в output. |
| Ошибки и особые значения | INFO_VARIABLES/ENVIRONMENT могут раскрыть cookies, токены и переменные процесса. Ранний вывод мешает header/cookie/JSON. |
| Версии | PHP 4–8. До PHP 5.5 expose_php=off скрывал logos и credits в выводе phpinfo. Официальный диапазон узла: (PHP 4, PHP 5, PHP 7, PHP 8). |
| Среда | Все SAPI, если ниже не указано иное. |
Более простой или безопасный выбор. Соберите белый список: PHP_VERSION, PHP_SAPI, extension_loaded нужных модулей и состояние зависимостей без секретов.
Рядом: phpcredits, ini_get_all, get_loaded_extensions, php_sapi_name.
Вернуться к карте задач или полному дереву функций.
phpversionПолучить версию PHP либо конкретного загруженного расширения.
PHP 4–8. Параметр extension nullable с PHP 8.0. · standard
phpversion(?string $extension = null): string|falseПолучить версию PHP либо конкретного загруженного расширения.
Без аргумента результат совпадает с PHP_VERSION. Числовая PHP_VERSION_ID строится как major*10000 + minor*100 + release и удобна для повторяющейся проверки одной возможности без version_compare; составные части также доступны как PHP_MAJOR_VERSION, PHP_MINOR_VERSION и PHP_RELEASE_VERSION. С extension возвращается строка версии модуля либо false. Некоторые расширения имеют собственный номер, но многие bundled extensions сообщают версию PHP, поэтому эта строка не всегда является независимой версией библиотеки. Для произвольных version strings применяют version_compare, потому что обычные строковые операторы неправильно упорядочивают 8.10 и 8.9/RC.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
echo phpversion() === PHP_VERSION ? "версия PHP согласована\n" : "неожиданное различие\n";
$calculatedId = PHP_MAJOR_VERSION * 10000 + PHP_MINOR_VERSION * 100 + PHP_RELEASE_VERSION;
echo $calculatedId === PHP_VERSION_ID ? "числовая версия согласована\n" : "ошибка формулы\n";
var_dump(phpversion('lesson_extension_that_does_not_exist'));
Ожидаемый результат
версия PHP согласована
числовая версия согласована
bool(false)
Без аргумента функция сообщает версию PHP, с именем — версию расширения либо false. PHP_VERSION_ID выводится из трёх числовых компонентов и подходит для простого feature threshold; произвольные строки сравнивайте version_compare, а не строковыми операторами.
<?php
declare(strict_types=1);
$version = phpversion('standard');
echo is_string($version) && version_compare($version, '8.0.0', '>=') ? "standard совместимо\n" : "версия неизвестна\n";
Ожидаемый результат
standard совместимо
Имя должно соответствовать загруженному расширению. Наличие версии не доказывает наличие каждой платформенной функции; проверяйте function_exists там, где API условен.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| extension | null для PHP либо имя расширения. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | phpversion(?string $extension = null): string|false |
| Результат | string версии либо false для неизвестного/безверсийного расширения. |
| Ошибки и особые значения | false нельзя передавать version_compare как версию. Загруженная версия одного SAPI не доказывает версию сайта в другом. |
| Версии | PHP 4–8. Параметр extension nullable с PHP 8.0. Официальный диапазон узла: (PHP 4, PHP 5, PHP 7, PHP 8). |
| Среда | Все SAPI, если ниже не указано иное. |
Более простой или безопасный выбор. Для обязательной зависимости сначала extension_loaded, затем проверка версии, если расширение предоставляет её.
Рядом: version_compare, extension_loaded, zend_version.
Вернуться к карте задач или полному дереву функций.
version_compareСравнить версии по сегментам и prerelease-меткам PHP.
Есть в проверенном PHP 8.5.11 · standard
version_compare(string $version1, string $version2, ?string $operator = null): int|boolСравнить версии по сегментам и prerelease-меткам PHP.
Функция заменяет _, - и + точками, отделяет нечисловые части и сравнивает слева направо. Порядок меток: неизвестная строка < dev < alpha=a < beta=b < RC=rc < число (#) < pl=p. Метки регистрозависимы; произвольный внешний формат сначала нормализуют. Без operator возвращается -1, 0 или 1; с operator — bool. Это подходит для простого compatibility gate и сортировки. Composer использует более богатую модель ограничений.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
foreach ([['8.5.0', '8.4.9'], ['8.5.0RC1', '8.5.0']] as [$left, $right]) {
echo $left, version_compare($left, $right, '>') ? " новее\n" : " не новее\n";
}
Ожидаемый результат
8.5.0 новее
8.5.0RC1 не новее
Функция понимает сегменты и метки dev/alpha/beta/RC. Оператор передают только из документированного набора, а не напрямую из пользовательского ввода.
<?php
declare(strict_types=1);
$versions = ['8.5.0', '8.5.0RC1', '8.4.9'];
usort($versions, 'version_compare');
echo implode(' < ', $versions), "\n";
Ожидаемый результат
8.4.9 < 8.5.0RC1 < 8.5.0
Без version_compare лексикографический порядок ломается на разной длине сегментов и prerelease-метках. Для Composer-ограничений используйте его собственный resolver, а не самодельный разбор.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| version1 | Первая PHP-standardized строка версии. |
| version2 | Вторая строка. |
| operator | null для трёхстороннего int либо один из <, lt, <=, le, >, gt, >=, ge, ==, =, eq, !=, <>, ne; строковый оператор регистрозависим и пишется в нижнем регистре. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | version_compare(string $version1, string $version2, ?string $operator = null): int|bool |
| Результат | int -1/0/1 без operator; bool с operator. |
| Ошибки и особые значения | Неизвестный operator вызывает ValueError в современных версиях. Семантически нестандартные vendor-строки нужно отдельно нормализовать. |
| Версии | Есть в проверенном PHP 8.5.11 Официальный диапазон узла: (PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8). |
| Среда | Все SAPI, если ниже не указано иное. |
Более простой или безопасный выбор. Для composer.json и сложных диапазонов используйте Composer Semver/resolver.
Рядом: phpversion, zend_version.
Вернуться к карте задач или полному дереву функций.
zend_versionПолучить версию Zend Engine, исполняющего PHP-код.
Есть в проверенном PHP 8.5.11 · Core
zend_version(): stringПолучить версию Zend Engine, исполняющего PHP-код.
Движок и язык связаны, но их номера не взаимозаменяемы. Zend version полезна в низкоуровневом bug report или диагностике расширения. Требование приложения обычно формулируют через PHP_VERSION_ID и версии конкретных расширений.
Первый запуск и развитие задачи
<?php
declare(strict_types=1);
$engine = zend_version();
echo $engine !== '' ? "версия Zend Engine получена\n" : "пустая версия\n";
echo version_compare(PHP_VERSION, '8.0.0', '>=') ? "PHP 8+\n" : "старая ветка\n";
Ожидаемый результат
версия Zend Engine получена
PHP 8+
zend_version нужна для диагностики движка. Совместимость приложения обычно выражают версией PHP и расширений, а не подменяют её номером Zend Engine.
<?php
declare(strict_types=1);
$coreReady = extension_loaded('Core');
$constants = get_defined_constants(false);
$ordinary = get_loaded_extensions(false);
$zend = get_loaded_extensions(true);
ob_start();
$creditsOk = phpcredits(CREDITS_QA);
ob_end_clean();
ob_start();
$infoOk = phpinfo(INFO_MODULES);
ob_end_clean();
$engine = zend_version();
$capabilitiesOk = $coreReady && isset($constants['PHP_VERSION'])
&& in_array('Core', $ordinary, true) && is_array($zend);
$reportsOk = $creditsOk === true && $infoOk === true && $engine !== '';
echo $capabilitiesOk ? "возможности подтверждены\n" : "неполная среда\n";
echo $reportsOk ? "локальные отчёты сформированы и отброшены\n" : "ошибка отчёта\n";
Ожидаемый результат
возможности подтверждены
локальные отчёты сформированы и отброшены
Пример отличается от полного inventory: код проверяет конкретные факты, phpcredits/phpinfo удерживает в локальном буфере и удаляет, а наружу отдаёт только две безопасные фразы.
Полный договор вызова
| Параметр | Что передаём и зачем |
|---|---|
| Параметров нет | Функция вызывается без аргументов; чтение или действие и его результат описаны в договоре ниже. |
| Часть договора | Что получает программа |
|---|---|
| Сигнатура | zend_version(): string |
| Результат | string версии Zend Engine. |
| Ошибки и особые значения | Строка не подтверждает наличие модуля, SAPI или поведения конкретной функции. |
| Версии | Есть в проверенном PHP 8.5.11 Официальный диапазон узла: (PHP 4, PHP 5, PHP 7, PHP 8). |
| Среда | Все SAPI, если ниже не указано иное. |
Более простой или безопасный выбор. Проверяйте именно capability/версию, от которой зависит код; не используйте Zend version как общий feature flag.
Рядом: phpversion, version_compare, zend_thread_id.
Вернуться к карте задач или полному дереву функций.
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


