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

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

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

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

Глава 457 · С нуля → диагностика среды

FAQ PHP: 94 официальных вопроса как диагностические маршруты

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

FAQ как маршрут: сначала среда и симптом, затем решение

FAQ полезен не как случайный список, а как маршрут от симптома к проверяемому слою. Один и тот же «белый экран» может быть ошибкой приложения, настройкой display_errors, журналом FPM или ответом reverse proxy. Сначала фиксируют среду и минимальное воспроизведение, затем выбирают категорию ниже; секреты перед публикацией удаляют.

Хороший вопрос
  1. Вход: ожидаемое действие, минимальный код, точная ошибка, PHP/SAPI/OS/ini
  2. Действие: другой разработчик воспроизводит тот же путь
  3. Результат: ответ объясняет причину, а не угадывает окружение
Собрать диагностический отчёт и удалить секрет до публикацииСамостоятельный пример
<?php
declare(strict_types=1);

function supportSnapshot(array $runtime): array
{
    $allowed = ['php_version', 'sapi', 'loaded_ini', 'extension', 'error'];
    $report = array_intersect_key($runtime, array_flip($allowed));
    $report['error'] = preg_replace('~password=[^&\s]+~i', 'password=[redacted]', $report['error'] ?? '');
    return $report;
}

$report = supportSnapshot([
    'php_version' => '8.5.11',
    'sapi' => 'fpm-fcgi',
    'loaded_ini' => '/etc/php/8.5/fpm/php.ini',
    'extension' => 'pdo_mysql',
    'error' => 'SQLSTATE[HY000] dsn=mysql:host=db password=secret',
    'session_cookie' => 'do-not-publish',
]);
foreach ($report as $key => $value) { echo "$key: $value\n"; }
Ожидаемый результат
php_version: 8.5.11
sapi: fpm-fcgi
loaded_ini: /etc/php/8.5/fpm/php.ini
extension: pdo_mysql
error: SQLSTATE[HY000] dsn=mysql:host=db password=[redacted]

Пример принимает fixture, поэтому результат повторяем. На настоящем сервере значения получают из PHP_VERSION, PHP_SAPI, php_ini_loaded_file и extension_loaded, но cookie, токены, DSN-пароли и персональные данные не публикуют.

Маршрут диагностики
  1. Воспроизвести на минимальном входе
  2. Записать точное ожидаемое и фактическое
  3. Определить SAPI, версию, OS и загруженный ini
  4. Проверить журнал соответствующего процесса
  5. Искать по точному сообщению, затем читать canonical chapter
  6. Сохранить исправление тестом

Общее: что такое PHP, версии и хороший bug report

Эта категория отвечает, что именно запускается и как сопоставить совет с веткой PHP. Для нового проекта выбирают поддерживаемую ветку и проверяют migration notes; номер 8.x не означает совместимость любого расширения и framework.

Вопрос из официального FAQПрактический ответ
Что такое PHP?Язык общего назначения, особенно применяемый на сервере: SAPI запускает код, код формирует HTTP-ответ, CLI-вывод или работу worker. Начните с первого запуска.
Что означает PHP?Рекурсивное имя «PHP: Hypertext Preprocessor». Историческая расшифровка Personal Home Page больше не описывает современный язык.
Как связаны версии?Major/minor/patch читают вместе. Между minor есть новые возможности и deprecations, major может удалять устаревшее. Сверяйте supported versions, migration guide, platform requirements и lock-файл.
Можно ли запускать несколько версий одновременно?Да, отдельными CLI binaries, FPM pools/containers и sockets. Не смешивайте extensions/ini; явно фиксируйте binary, SAPI и pool в диагностике.
Куда сообщить об ошибке PHP?Сначала минимальный reproduction на поддерживаемой версии и поиск существующего issue; затем bugs.php.net/GitHub того компонента. Уязвимость отправляют по security-процессу, не публикуют как обычный bug.

Mailing lists и сообщества: выбрать правильный канал

Официальный FAQ исторически говорит о mailing lists. Сегодня вопрос может жить в списке рассылки, issue tracker, discussion, Stack Overflow или чате проекта. Выбирайте канал по его правилам: support-вопрос не превращают в bug, а security report не публикуют открыто.

Вопрос из официального FAQПрактический ответ
Есть ли mailing lists PHP?Да; актуальный каталог и правила подписки смотрите на php.net/mailing-lists.php. У каждой рассылки свой предмет.
Есть ли другие сообщества?Да: локальные user groups, Stack Overflow, framework communities и conference channels. Проверяйте активность и code of conduct.
Можно ли открыть свой список?Да, но не называйте его официальным без разрешения; заранее задайте тему, модерацию, архив и anti-spam.
Не получается подписаться/отписатьсяПроверьте адрес отправителя, confirmation message, spam и точную команду страницы списка; администратору сообщите адрес списка и время без пересылки токенов.
Где архив?Ссылка на архив находится рядом с конкретным списком; часть исторических архивов read-only. Не отвечайте на древний thread как на текущую проблему.
Что можно спрашивать?Вопрос по теме списка, после поиска, с минимальным примером и наблюдаемым результатом. Домашнее задание без попытки и общий hiring обычно неуместны.
Что приложить к вопросу?PHP/SAPI/OS, минимальный код, вход, expected/actual, exact error и уже проверенные шаги. Удалите credentials, cookies, персональные и коммерческие данные.

Получение PHP: официальный артефакт, ABI и TS/NTS

PHP получают из официального релиза или поддерживаемого package repository операционной системы. Источник определяет cadence, paths, patches и набор extensions. Не скачивайте случайный DLL/ZIP только потому, что имя совпало.

Вопрос из официального FAQПрактический ответ
Где получить PHP?Официальные исходники и ссылки — php.net/downloads.php; Windows builds — windows.php.net. Для сервера часто разумнее подписанный пакет поддерживаемой ОС.
Есть ли готовые binaries?Да, для Windows и в repositories дистрибутивов. Проверяйте архитектуру, compiler runtime, thread-safety и SAPI.
Где библиотеки для optional extensions?В package manager/SDK производителя; exact development headers должны соответствовать ABI/architecture. Некоторые extensions ставятся PECL/Composer, это разные механизмы.
Как подключить библиотеки?Устанавливают dev package, передают configure option или extension DLL, затем проверяют startup log и extension_loaded(). Один php -m покрывает только выбранный SAPI.
Как собрать Git source на Windows?Нужны поддерживаемые Visual Studio toolchain, SDK, build scripts/dependencies и инструкция текущей ветки. Release source build и extension build — отдельные задачи.
Где Browscap?Директива browscap указывает внешний файл; данные стареют и User-Agent ненадёжен. Для capability decisions предпочтительнее feature detection на клиенте.
Что значит Thread Safe?TS build включает поддержку многопоточного SAPI; NTS обычно выбирают для FastCGI/IIS/FPM-подобной модели. Совместимость DLL требует того же PHP API, архитектуры, compiler и TS/NTS.

Пошаговая проверка есть в установке и конфигурации. После загрузки проверяют подпись/hash из независимого официального канала, а не только имя архива.

Базы данных: driver, сервер и модель конкурентности

Слова «PHP поддерживает базу» обычно означают подходящий driver/extension и доступный сервер. Соединение, credentials, TLS, charset и права остаются отдельными условиями. Основной маршрут — PDO от соединения до выборки.

Вопрос из официального FAQПрактический ответ
Как работать с Microsoft SQL Server?Через Microsoft sqlsrv/pdo_sqlsrv либо ODBC при проверенном driver. Согласуйте version matrix, encryption, authentication и encoding; ошибки включите как exceptions.
Можно ли открыть Microsoft Access?На Windows возможен ODBC/OLE DB через установленный driver. Это file database с ограничениями concurrency и platform coupling; для web-service чаще переносят данные в серверную СУБД.

Установка: от белого экрана и 500 до ini, IIS и request methods

Официальная категория хранит много исторических Apache/CGI/FrontPage вопросов. Они сохранены как baseline, но ответы разведены на современный маршрут и legacy-контекст. Начните с канонической установки, затем проверьте web-server error log и SAPI.

Вопрос из официального FAQПрактический ответ
Почему не рекомендовали Apache2 threaded MPM?Исторически часть библиотек была не thread-safe. Сегодня решение зависит от сборки и modules: типовой безопасный маршрут — nginx/Apache proxy_fcgi → FPM/NTS; mod_php проверяют по актуальной platform matrix.
Где php.ini на Unix/Windows?Не угадывать: CLI — php --ini/php_ini_loaded_file(); FPM/web — защищённая диагностика/конфигурация pool. PHPRC и scan dirs могут менять поиск.
Unix: Document Contains No DataСмотрите web-server/PHP error log, crash/OOM и корректность SAPI handler. Сообщение браузера — следствие пустого/оборванного ответа, не причина.
RPM установлен, но Apache не обрабатывает PHPПакет CLI не включает автоматически FPM/handler. Проверьте активный service, proxy configuration, socket permissions и MIME/handler mapping.
FrontPage extensions сломали PHPЭто историческая несовместимость устаревшего FrontPage/Apache patch. Удалите legacy patch или изолируйте старую систему; не строите новый deployment на нём.
Белый экранПроверьте HTTP status и server/FPM logs; в development включите E_ALL/display_errors, в production — log_errors без показа деталей пользователю.
HTTP 500Начните с web-server log, затем FPM/application log; lint файла не обнаруживает missing extension, permission, timeout и startup error.
Undefined symbols при старте ApacheABI/link mismatch: пересоберите совместимые modules/libraries и не смешивайте артефакты разных PHP/Apache/compiler.
CGI не вернул полный набор headersСмотрите startup/fatal output CGI, handler mapping и executable permissions. Современный FastCGI/FPM deployment обычно проще прямого CGI.
PHP и IIS не работаютПроверьте FastCGI mapping на php-cgi.exe, NTS build, identity permissions, request limits и stdout/stderr logs IIS/FREB.
Security Alert: PHP CGI cannot be accessed directlyЭто защита cgi.force_redirect. Настройте поддерживаемый FastCGI handler; не выключайте защиту без понимания request path.
Как доказать, что php.ini прочитан?Сопоставить SAPI и вызвать php_ini_loaded_file()/php_ini_scanned_files(); затем проверить локальное/pool override и перезапуск процесса.
Как добавить PHP в PATH Windows?Добавить каталог php.exe в user/system PATH, открыть новый shell и проверить Get-Command php + php -v. PATH не настраивает IIS.
Как указать php.ini Windows?Положить в ожидаемый config path или задать PHPRC для процесса/service; подтвердить через загруженный SAPI, не только новый terminal.
Может ли IIS писать во временную папку?Проверьте sys_get_temp_dir(), upload_tmp_dir/session.save_path и ACL identity App Pool; выполните ограниченную запись/удаление test file.
Apache MultiViews и PHPContent negotiation способно выбрать неожиданный script и конфликтовать с routing. Обычно отключают MultiViews для application routes и задают явный front controller.
PHP принимает только GET/POST?Нет. Метод доступен в REQUEST_METHOD, тело — php://input; PUT/PATCH/DELETE требуют собственных parsing, authentication, CSRF/CORS и content-type rules.

Сборка из исходников: toolchain, ABI и исторические ловушки

Сборка PHP из исходников нужна для platform maintainer, необычной extension matrix или tracing build. Обычному приложению воспроизводимый подписанный пакет безопаснее. Старые вопросы ниже сохранены, но команды PHP 4/Apache 1 не переносятся на современный PHP.

Вопрос из официального FAQПрактический ответ
В Git source нет configureGit checkout требует buildconf/autoconf toolchain; release tarball обычно уже содержит generated configure. Следуйте README текущей ветки.
configure не видит httpd.hHeader path и Apache development package должны соответствовать выбранному integration method. Современный deployment чаще собирает FPM, а не mod_php.
lex: command not foundУстановить поддерживаемые flex/bison и остальные build dependencies; зафиксировать версии toolchain.
Apache relocation error ap_block_alarmsLegacy ABI mismatch PHP4/Apache. Не чинить подменой одного файла; собрать согласованный stack или мигрировать.
Не найдены GD/gdbm headers/libsНужны development packages и pkg-config paths той же architecture; проверяйте config.log, а не только последнюю строку configure.
yytname undeclaredGenerated parser не совпал с bison/source branch; очистите tree и используйте поддерживаемую версию toolchain.
make останавливается/непонятная ошибкаНужен первый error выше, exact command, config.log и чистая повторная сборка; последняя строка make обычно только итог.
Undefined references при linkНе хватает library, неверен порядок link, architecture/ABI или static/shared flags. Inspect linker command и symbols.
PHP source скачивается вместо выполненияWeb server отдаёт файл как static: handler/FPM proxy не настроен. Не добавляйте PHP MIME type без исполняющего handler.
--activate-module и libphp4.a/libmodphp4.aЭто устаревший Apache1/PHP4 workflow. Современная ветка использует FPM/proxy_fcgi или актуальный apxs при поддержке.
Compiler not ANSI compliantИсторический toolchain. Используйте compiler versions, заявленные текущей веткой; не ослабляйте source случайными patches.
Проблемы с --with-apxsПуть apxs должен принадлежать целевому Apache и dev package; TS/MPM/ABI должны совпасть. Рассмотрите FPM boundary.
make падает в microtimeLegacy platform/compiler issue; сначала подтвердить на поддерживаемой ветке и toolchain, затем приложить preprocessor/compiler output к bug report.
MySQL tempnam warningИсторическое предупреждение bundled client; современный mysqli/PDO driver и актуальные client libraries не лечат копированием старого source.
Как повторить старый ./configure при upgrade?Сохраните build manifest; php-config --configure-options помогает, но новые/удалённые flags проверяют по migration/install docs.
GD compile error или segfaultПроверить bundled/external GD policy, headers/runtime library ABI и минимальный image test. Mixed libraries часто дают crash.
Solaris/random build errors, нужны GNU tools?Следовать platform notes и поддерживаемым GNU/autoconf/make versions; фиксировать locale, PATH, compiler и resource limits.
Воспроизводимая сборка
  1. Чистый source tag + verified hash
  2. Зафиксированный compiler/SDK/dependencies
  3. configure options в manifest
  4. Build log и test suite
  5. Отдельный artifact repository/SBOM
  6. Smoke test каждого SAPI

Использование PHP: параметры, return, headers, newlines и ini bytes

Категория «Using PHP» соединяет синтаксис и окружение. Сначала минимальный результат, потом edge cases. Большие решения находятся в главах функций, форм, HTTP и переменных.

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

function priceWithTax(int $price, int $taxPercent): int
{
    return $price + intdiv($price * $taxPercent, 100);
}

$total = priceWithTax(1000, 20);
echo 'Итого: ', $total, "\n";
Ожидаемый результат
Итого: 1200

return передаёт 1200 вызывающему коду. Если функция сама echo-ит, выражение конкатенации получает null и вывод может оказаться в неожиданном порядке.

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

function iniBytes(string $value): int
{
    $value = trim($value);
    if (!preg_match('/^(\d+)([KMG])?$/i', $value, $match)) {
        throw new InvalidArgumentException('Ожидается число и K/M/G');
    }
    $power = match (strtoupper($match[2] ?? '')) {
        'K' => 1, 'M' => 2, 'G' => 3, default => 0,
    };
    return (int) $match[1] * (1024 ** $power);
}
foreach (['128', '2K', '3M', '1G'] as $value) {
    echo "$value = ", iniBytes($value), " bytes\n";
}
Ожидаемый результат
128 = 128 bytes
2K = 2048 bytes
3M = 3145728 bytes
1G = 1073741824 bytes

K/M/G в ini — степени 1024. Реальные директивы имеют собственные допустимые значения, scope и специальное значение -1/0; helper намеренно принимает только положительный учебный поднабор.

Вопрос из официального FAQПрактический ответ
Почему у функций разный порядок параметров?Исторически APIs пришли из разных библиотек. Проверяйте signature; named arguments делают имя частью контракта и опасны при его переименовании.
Как обработать поля любой POST-формы?Перебирать $_POST можно, но generic handler не знает schema. Whitelist полей, тип/границы и CSRF задаются конкретной формой; неизвестные поля отклоняют/игнорируют явно.
Как экранировать quotes/backslash?Не универсальным addslashes/regex. Для SQL — prepared statements, HTML — htmlspecialchars при выводе, JSON — json_encode; escaping зависит от места назначения.
Почему вывод функции внутри строки «не в том порядке»?echo внутри функции выполняется до внешней конкатенации, а функция без return возвращает null. Верните значение, как в примере выше.
Куда исчезли newlines в браузере?HTML сворачивает whitespace. Используйте структурные теги/CSS; полезен source/plain text, nl2br — только вместе с безопасным escaping.
Headers already sentCookie/session/header должны быть до первого byte body. Найдите файл/строку из warning, BOM/пробел/echo; output buffering не заменяет правильную архитектуру.
Как читать request headers?getallheaders на поддерживаемом SAPI или нормализованные $_SERVER keys; header names case-insensitive, proxy headers доверяют только от известных proxy.
IIS authentication: No Input file specifiedЭто обычно FastCGI/path mapping, не логика Basic auth. Проверить SCRIPT_FILENAME, handler mapping и rewrite; для identity — IIS/FastCGI auth docs.
IIS не читает network shareApp Pool identity должен иметь share и NTFS permissions; mapped drive интерактивного пользователя service не видит. Предпочтителен UNC и отдельная service identity.
XML declaration конфликтует с PHP short tagsВыведите declaration строкой или отключите short_open_tag; обычный <?php не конфликтует. XML encoding должен совпадать с bytes.
Где список доступных переменных?Superglobals описаны отдельно, локальные зависят от scope. Не делайте бизнес-логику из get_defined_vars(); используйте явные входы.
Как бесплатно создать PDF?Выберите maintained library (например, pure-PHP либо wrapper) по font/Unicode/layout/license. HTML→PDF engine и рисование PDF имеют разные security/resources.
Какие shorthand bytes?K/M/G означают ×1024; регистр допускается. Отдельные directives имеют special values и limits — смотрите их карточку, не один общий parser.

Пароли: медленный hash, встроенная соль и проверка

Пароль не шифруют для обратного чтения и не хешируют быстрым md5/sha1. Используют password_hash, сохраняют всю выданную строку и проверяют password_verify. Полная модель регистрации, login, rate limits и rehash находится в справочнике паролей и безопасности.

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

$hash = password_hash('correct horse battery staple', PASSWORD_BCRYPT, ['cost' => 4]);
if ($hash === false) { throw new RuntimeException('Hash не создан'); }
echo 'Алгоритм: ', password_get_info($hash)['algoName'], "\n";
echo 'Верный пароль: ', password_verify('correct horse battery staple', $hash) ? 'да' : 'нет', "\n";
echo 'Чужой пароль: ', password_verify('wrong', $hash) ? 'да' : 'нет', "\n";
Ожидаемый результат
Алгоритм: bcrypt
Верный пароль: да
Чужой пароль: нет

Сам hash каждый раз различается из-за случайной соли, поэтому пример выводит стабильные свойства. Cost 4 выбран только для быстрого учебного прогона; production-параметры измеряют на своей инфраструктуре.

Вопрос из официального FAQПрактический ответ
Зачем хешировать пользовательские пароли?Утечка базы не должна сразу раскрывать пароль. Нужен медленный password KDF, уникальная соль, access control и план reset; hash всё равно чувствителен.
Почему md5/sha1 не подходят?Они слишком быстры: GPU перебирает огромные словари. Одна соль не делает быстрый general-purpose hash медленным.
Как хешировать правильно?password_hash(PASSWORD_DEFAULT/ARGON2*) и password_verify; column оставляют достаточно длинным, параметры versioned, после login проверяют password_needs_rehash.
Что такое salt?Уникальные случайные данные, включённые в hash, чтобы одинаковые пароли не имели одинаковый результат и precomputed tables не переиспользовались.
Где хранить salts?Современный password_hash кодирует salt/algorithm/parameters в одной строке — её сохраняют целиком. Отдельный secret pepper, если используется, хранится вне БД и имеет rotation plan.

PHP и HTML: кодирование, массивы form и граница JavaScript

HTML задаёт имена controls, браузер сериализует successful controls, PHP строит $_GET/$_POST. Скобки в name создают массив: customer[phones][]. Это удобная структура, но всё пришедшее остаётся недоверенным input; количество, nesting, тип и значения проверяют по schema. Полный путь формы есть в главе форм.

Увидеть, как имена HTML-полей становятся вложенным массивомСамостоятельный пример
<?php
declare(strict_types=1);

$query = 'customer[name]=Анна&customer[phones][]=111&customer[phones][]=222&tags[]=php&tags[]=web';
parse_str($query, $input);

echo 'Имя: ', $input['customer']['name'], "\n";
foreach ($input['customer']['phones'] as $index => $phone) {
    echo 'Телефон ', $index + 1, ': ', $phone, "\n";
}
echo 'Теги: ', implode(', ', $input['tags']), "\n";
Ожидаемый результат
Имя: Анна
Телефон 1: 111
Телефон 2: 222
Теги: php, web

parse_str воспроизводит application/x-www-form-urlencoded без браузера. В настоящем POST PHP заполняет $_POST сходным образом; загруженные файлы находятся отдельно в $_FILES.

Вопрос из официального FAQПрактический ответ
Как кодировать значение для form/URL?HTML text/attribute — htmlspecialchars; query parameter — http_build_query/rawurlencode; при чтении PHP уже URL-decodes GET. Не применяйте urlencode к готовому HTML.
Где координаты input type=image?Браузер отправляет name.x/name.y, но PHP нормализует точки/пробелы в underscores: проверяйте фактические keys и не используйте координаты как security decision.
Как создать массив в form?Имена items[] и items[id]; индексы от клиента недоверенны. Пример выше показывает exact mapping.
Как получить все select multiple?Имя должно оканчиваться []; затем проверяйте is_array, max count и whitelist каждого option.
Как передать JavaScript variable в PHP?JS выполняется в браузере после server response. Для нового server call используйте form/fetch с JSON/URL encoding и CSRF/auth; для initial data безопасно json_encode в script data.

PHP и COM: Windows-only boundary, variants, events и DCOM

COM extension относится к Windows и Automation-compatible components. Для нового cross-platform сервиса HTTP/gRPC/queue обычно легче изолирует технологию. Если legacy COM обязателен, вся подробная типизация, variants, events и remote boundary разобрана в COM reference.

Вопрос из официального FAQПрактический ответ
Можно ли вызвать DLL?Только если DLL предоставляет COM Automation interface для ext/com_dotnet либо через подходящий FFI/native extension. Произвольный export не становится COM автоматически.
Unsupported variant typeКомпонент вернул VARIANT, который extension не преобразует. Inspect type library/signature и преобразуйте на стороне COM wrapper.
Можно ли управлять visual objects?Технически Automation может открыть UI, но web service работает в non-interactive session. Используйте server-safe component; Office automation на сервере ненадёжна/не поддерживается для многих сценариев.
Можно ли хранить COM object в session?Нет как переносимое session value: resource/process identity нельзя сериализовать. Храните data/id и создавайте объект на запрос.
Как ловить COM errors?Включить exceptions и ловить com_exception/Throwable; журналировать HRESULT/message без секретов, освобождать boundary явно.
Можно ли сгенерировать DLL из PHP?PHP script не компилируется автоматически в Automation DLL. Пишите native/.NET component или отдельный service с явным контрактом.
Unable to obtain IDispatch for CLSIDClass не зарегистрирован, bitness mismatch, нет прав/identity или component не предоставляет IDispatch. Проверить registry под нужной architecture.
Как запустить remote COM?DCOM требует machine/account permissions, firewall и authentication. Из-за security/operations риска предпочтителен узкий service API.
DCOM is disabledПроверить directive/Windows DCOM policy и threat model. Не включать удалённую активацию только ради обхода ошибки.
Можно ли встроить ActiveX в страницу?ActiveX исполнялся на клиенте и устарел/блокируется современными браузерами. PHP на сервере не делает его безопасным.
Как получить running instance?com_get_active_object при зарегистрированном активном объекте и той же Windows session/permissions; отсутствие экземпляра — нормальный исход.
Как принимать COM events?com_event_sink связывает sink methods; нужен message pumping и lifetime. В web request модель хрупкая, лучше долгий изолированный worker.
Компонент имеет несколько interfacesВыберите нужный interface/type library либо создайте wrapper; late binding может выбрать не тот overload.
Поддерживается ли COM+?Automation object может жить в COM+, но transactions/security/activation определяет COM+ configuration, не PHP автоматически.
Можно ли использовать MTS resource management?Исторический MTS/COM+ требует component design и transaction semantics. Не считать PHP request участником distributed transaction без явной integration architecture.

Прочее: bzip2-архив руководства на Windows

Файл руководства с расширением .bz2 — bzip2-compressed archive, а не программа. На Windows его распаковывает 7-Zip или другой поддерживающий bzip2 архиватор; после распаковки открывают HTML/index. Не переименовывайте extension и не запускайте содержимое как executable.

Вопрос из официального FAQПрактический ответ
Как открыть bz2-руководство на Windows?Скачать из доверенного источника, проверить hash, распаковать bzip2-инструментом, затем открыть полученный tar/HTML по его формату. Для программной работы PHP имеет Bzip2 reference.
Источники и обсуждения

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

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

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

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