newsare.net
Данный пост нацелен на неопытных PHP-специалистов. От этой информации лучше программировать вы не станете. Ожидаемая польза:Мне когнитивно и мСхематично, простыми словами о внутреннем устройстве 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 — Выполнение байт-кода Читать далее Read more