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

Дерево руководства
Глава 457 · С нуля → диагностика среды
FAQ PHP: 94 официальных вопроса как диагностические маршруты
Полная официальная ветка FAQ: каждый вопрос сохранён, исторические ответы помечены, современные решения ведут к каноническим главам и проверяемым примерам.
FAQ как маршрут: сначала среда и симптом, затем решение
FAQ полезен не как случайный список, а как маршрут от симптома к проверяемому слою. Один и тот же «белый экран» может быть ошибкой приложения, настройкой display_errors, журналом FPM или ответом reverse proxy. Сначала фиксируют среду и минимальное воспроизведение, затем выбирают категорию ниже; секреты перед публикацией удаляют.
- Вход: ожидаемое действие, минимальный код, точная ошибка, PHP/SAPI/OS/ini
- Действие: другой разработчик воспроизводит тот же путь
- Результат: ответ объясняет причину, а не угадывает окружение
<?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-пароли и персональные данные не публикуют.
- Воспроизвести на минимальном входе
- Записать точное ожидаемое и фактическое
- Определить SAPI, версию, OS и загруженный ini
- Проверить журнал соответствующего процесса
- Искать по точному сообщению, затем читать canonical chapter
- Сохранить исправление тестом
Общее: что такое 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 при старте Apache | ABI/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 и PHP | Content 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 нет configure | Git checkout требует buildconf/autoconf toolchain; release tarball обычно уже содержит generated configure. Следуйте README текущей ветки. |
| configure не видит httpd.h | Header path и Apache development package должны соответствовать выбранному integration method. Современный deployment чаще собирает FPM, а не mod_php. |
| lex: command not found | Установить поддерживаемые flex/bison и остальные build dependencies; зафиксировать версии toolchain. |
| Apache relocation error ap_block_alarms | Legacy ABI mismatch PHP4/Apache. Не чинить подменой одного файла; собрать согласованный stack или мигрировать. |
| Не найдены GD/gdbm headers/libs | Нужны development packages и pkg-config paths той же architecture; проверяйте config.log, а не только последнюю строку configure. |
| yytname undeclared | Generated 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 падает в microtime | Legacy 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. |
- Чистый source tag + verified hash
- Зафиксированный compiler/SDK/dependencies
- configure options в manifest
- Build log и test suite
- Отдельный artifact repository/SBOM
- 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 и вывод может оказаться в неожиданном порядке.
<?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 sent | Cookie/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 share | App 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. Полный путь формы есть в главе форм.
<?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 CLSID | Class не зарегистрирован, 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. |
Источники и обсуждения
- PHP Manual: Frequently Asked Questions
- PHP Manual: General Information
- PHP Manual: Mailing lists
- PHP Manual: Obtaining PHP
- PHP Manual: Database issues
- PHP Manual: Installation
- PHP Manual: Build Problems
- PHP Manual: Using PHP
- PHP Manual: Hashing passwords safely and securely
- PHP Manual: PHP and HTML
- PHP Manual: PHP and COM
- PHP Manual: Miscellaneous Questions
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


