Процесс выполнения кода PHP7
PHP — это интерпретируемый язык, и процесс его выполнения необходимо скомпилировать в промежуточный код, а затем преобразовать в конкретные инструкции для выполнения через конкретную виртуальную машину. Процесс его выполнения следующий:
PHP 代码 => Token => 抽象语法树 => Opcodes => 执行
Содержание каждого шага следующее:
- Исходный код получает Token через лексический анализ
Токен — это значимый идентификатор, на который нарезается PHP-код. В PHP7 всего 137 токенов, которые определены в файле zend_language_parser.h.
- Преобразование токена в абстрактное синтаксическое дерево (AST) на основе синтаксического анализатора
Токены — это фрагменты слов, но отдельные фрагменты слов не могут выражать полную семантику, и их необходимо организовывать и объединять с помощью определенных правил. Следовательно, синтаксический анализатор должен сопоставить маркер в соответствии с грамматикой и объединить маркер. Продуктом после того, как анализатор объединяет токен, является абстрактное синтаксическое дерево (AST). AST — это новая функция версии PHP 7. Во время выполнения предыдущей версии PHP-кода шаг генерации AST отсутствует. Его функция в основном состоит в том, чтобы реализовать разделение компилятора PHP и интерпретатора и улучшить удобство сопровождения.
- Преобразование синтаксического дерева в код операции
Синтаксическое дерево необходимо преобразовать в код операции, прежде чем оно сможет быть непосредственно выполнено движком.
- Выполнить коды операций
Коды операций — это набор кодов операций, которые являются промежуточными кодами в процессе выполнения PHP. Существует относительно распространенный «открытый кэш операций» в мерах инженерной оптимизации PHP, который относится к технологии кэширования кодов операций. Опуская этап от исходного кода до кода операции, движок напрямую выполняет кэшированный непрозрачный код для повышения производительности.
Архитектура ядра PHP7
Индия представила мне эту картину
- зенд двигатель
Лексический/синтаксический анализ, компиляция AST и выполнение кодов операций реализованы в движке Zend. Кроме того, переменный дизайн PHP, управление памятью, управление процессами и т. д. также реализованы на уровне движка.
- PHP-слой
Механизм zend предоставляет базовые возможности для PHP, а взаимодействие извне должно обрабатываться на уровне PHP.
- SAPI
Аббревиатура для серверного API, которая включает в себя cli SAPI и fpm SAPI для сцены. Внешние модули могут взаимодействовать с PHP, если они соответствуют определенному протоколу SAPI.
- Расширенный раздел
В соответствии с основными возможностями и спецификациями интерфейса, предоставляемыми движком zend, можно выполнять разработку и расширение.
PHP 7 Структура исходного кода
Основными исходными каталогами php 7 являются: sapi, Zend, main, ext и TSRM.
- каталог сапи
Каталог sapi представляет собой абстракцию уровней ввода и вывода и является спецификацией PHP для предоставления внешних служб.
Несколько часто используемых SAPI:
1) apache2handler: расширение Apache, создает библиотеку динамической компоновки после компиляции и настраивает ее под Apache. Когда есть HTTP-запрос к Apache, эта библиотека динамической компоновки будет вызываться в соответствии с конфигурацией для выполнения кода PHP и завершения взаимодействия с PHP.
2) cgi-fcgi: после компиляции генерируется исполняемая программа, поддерживающая протокол CGI.Веб-сервер (например, NGINX) передает запрос процессу CGI по протоколу CGI, и процесс CGI выполняет соответствующий код в соответствии с request и возвращает результат выполнения на веб-сервер.
3) fpm-fcgi: fpm — менеджер процессов FastCGI. На примере сервера NGINX, когда запрос отправляется на сервер NGINX, NGINX передает запрос процессу php-fpm для обработки в соответствии с протоколом FastCGI.
4) cli: интерактивный интерфейс командной строки PHP.
- Зенд-каталог
Каталог Zend — это основной код PHP. Управление памятью в PHP, сборка мусора, управление процессами, переменные, реализация массива и т. д. — все это находится в исходном коде этого каталога.
- главный каталог
Главный каталог является связующим звеном между уровнем SAPI и уровнем Zend. Уровень Zend реализует компиляцию и выполнение PHP-скриптов, слой sapi реализует абстракцию ввода и вывода, а связующим звеном между ними служит главная директория. Продолжая вышесказанное, разберите SAPI-запрос, проанализируйте файл скрипта и параметры, которые необходимо выполнить, запустите, выполните необходимую инициализацию модуля и другую работу перед вызовом движка zend.
- добавочный каталог
ext — это каталог, связанный с расширениями PHP, и здесь определяются часто используемые функции array, str, pdo и другие.
- TSRM
TSRM (Thread Safe Resource Manager) — диспетчер потоковобезопасных ресурсов, используется для обеспечения безопасности совместного использования ресурсов.