Схематично, простыми словами о внутреннем устройстве PHP (Zend Engine, OPCache, JIT)
Данный пост нацелен на неопытных PHP-специалистов. От этой информации лучше программировать вы не станете. Ожидаемая польза: Мне когнитивно и морально легче, когда уменьшается «магия» с тем с чем работаешь. Может тебе тоже Возможно чуть-чуть реже статьи на хабре будут тебя отпугивать Объясню на 4 примерах — каждый лишь немного сложнее предыдущего. Пример 1: запуск программы, написанном на компилируемом языке (Go): в полной статье Пример 2: Запуск скрипта PHP без OPCache и JIT В интерпретируемых языках подразумевается, что выполнение программы будет осуществляться не сразу машинного кода. В случае PHP — запускается именно исходной код. Это означает, что каждый запуск программы система должна проанализировать исходный код и преобразовать его в понятный код для процессора (т.е. в машинный код). Вот схематично представил всю последовательность работы PHP скрипта без включенных OPCache и JIT (каждый из них по отдельности рассмотрим в следующих двух примерах).ache** и JIT (каждый из них по отдельности рассмотрим в следующих двух примерах). У нас привычный «исходный код» PHP (файл hello-world.php ): <?php echo "Hello world"; Опять идем по порядку, рассмотрим какие процессы происходят запустив команду: php hello-world.php Процесс №1 — Компиляция в байт-код Сначала исходный код обрабатывается Zend Compiler — это PHP компилятор . Первый из двух основных компонентов Zend Virtual Machine . В отличие от рассмотренного выше компилятора Go: задача PHP компилятора — преобразовать исходный код не в машинный код, а в код-посредник - байт-код ; процесс компиляции происходит при каждом запуске программы (вместо лишь единоразового - до запуска программы, как в примере с Go) В случае PHP этот байт-код назвали PHP OPCode . Байт-код — более низкоуровненный чем исходный код, содержащий набор команд для интерпретатора (об интерпретаторе в следующем пункте). Байт-код не может выполняться процессором напрямую. Чтобы посмотреть результат работы компилятора — сам байт-код — выполним команду: php -d opcache.opt_debug_level=0x20000 -d opcache.enable_cli=1 hello-world.php Получим: $_main: ; (lines=3, args=0, vars=0, tmps=1) ; (after optimizer) ; /hello-world.php:1-2 0000 EXT_STMT 0001 ECHO string("Hello World") 0002 RETURN int(1) Вначале видим $_main: — обозначает, что следующие строки относятся к функции main . Появление такой функции в байт-коде для глобальной области видимости PHP — занятная историческая особенность, дошедшая из других языков; Следующие 3 строки начинаются на ; — так обозначаются комментарии. Одна из целей — для дебаг-информации; Последние 3 строки — непосредственно код нашего приложения, который будет выполняться виртуальной машиной в следующем шаге. Процесс №2 — Выполнение байт-кода
https://habr.com/ru/articles/844768/
#PHP #zend_engine #opcache #jit #интепретатор #компилятор #байткод #машинный_код