Механизм кеширования байт-кода PHP-скриптов

doran7

Новичок
Насчет того что PHP, якобы, интерпретатор. Из мануала: PHP версии 3 был «чистым» интерпретатором», а с PHP 4 сценарии стали выполняться значительно быстрее, поскольку 4-я версия PHP (и PHP5) является интерпретирующим транслятором.
 

WMix

герр M:)ller
Партнер клуба
я не спорю, конечно же не все строки такие какие я привел в примере, я просто попытался обьяснить, что оптимизация это нечто другое, что оптимизированный код состоит из блоков различной с файловой структурой которую создал программист, а точнее из кусков которые можно превратить в готовые команды и "пока еще не известно"... хотел намекнуть что в данном случае eval может быть обработан даже быстрее чем скрипт без eval..
но как я уже сказал, у меня мало знаний в этом направлении...
 

doran7

Новичок
я просто попытался обьяснить, что оптимизация это нечто другое
Давай все-таки придерживаться какой-то одной терминологии. Оптимизация - это слишком широкое понятие. Здесь речь шла о механизме кеширования байт-кодов или опткодов. Придется раскопать в деталях работу PHP как интерпретирующего транслятора.

Насчет eval - была одна из бредовых мыслей, что будет, если попытаться брать скрипт из БД и через eval или еще что как-то транслировать его сразу в байткод или вообще хранить байткоды в БД. Но это так, фантазии.
 

AmdY

Пью пиво
Команда форума

WMix

герр M:)ller
Партнер клуба
я не настаиваю,...
создание компилятора это 2 шага, лексер и парсер (примеры Lex или Flex и Yacc или Bison ), первый читает букву за буквой пытаясь понять что за инструкции написанны программистом, второй использует работу первого заменяя инструкции командами понятной для системы...
к чему я это? к тому что один из шагов можно осуществить заренее для пхпскриптов, а 2й сложновато, но тоже для некоторых инструкций возможно.
итак проанализировав код и создав опткод это нужно сохранить (кешировать) это чаще всего происходит в памяти Акселератор PHP

ЗЫ это я назвал оптимизацией кода с точки зрения интерпретора... я назвал это потому что опткодов звучит для меня как оптимизированный код. (правильное название операционный код).. не более, извините за неправильную терминологию...
 

fixxxer

К.О.
Партнер клуба
Омг.

php работает следующим образом: php-код парсится на токены, токены конвертируются в опкоды, опкоды выполняются zend vm.

опкод кэшер кэширует результат первых двух операций.

инвалидация кэша - по банальному stat() на исходный файл (на продакшене это часто отключают настройкой наподобие apc.stat=0 и сбрасывают кэш явно при деплое).
 

Ragazzo

TDD interested
grigori
ты вроде говорил свою какую-то обертку для этого писал?
 

WMix

герр M:)ller
Партнер клуба
Absinthe
хорошо, попробуй послабже погребсти....
создание компилятора это 2 шага
я сам писал и лексер и парсер, признаю это было полное компелирование... но от лексем перейти в опткод невижу другого способа кроме как перепарсить дерево...
а 2й сложновато, но тоже для некоторых инструкций возможно
я понимаю что не все возможно, потому что сами данные могут являться частью кода...
но как я уже сказал, у меня мало знаний в этом направлении...
даю слово более продвинутым парням...
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Ragazzo да, кеш в php-файле для стурктуры базы
 

fixxxer

К.О.
Партнер клуба
какой код? файлового кэша?

putToCache($name, array $data) {
file_put_contents($this->cache_dir . '/' . $name, '<?php return ' . var_export($data, true) . ';', LOCK_EX);
}
getFromCache($name) {
return include $this->cache_dir . '/' . $name;
}
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
fixxxer + обработка объектов, в т.ч. в элементах массива, в отличие от serialize() это морочно
я до сих пор не решил - запрещать ли объекты, сериализовывать ли их, или забить и описать в документации

пока сделал сериализацию, что замедляет сохранение, т.к. требует обхода массива для проверки наличия объектов;
наверное, надо сделать параметр check_objects и выставлять его, когда точно известно, что объектов в данных нет
 

doran7

Новичок
теоретически ты прав насчёт хранения опкодов вместо скриптов
Может быть. А может, не все так просто. Кроме прочего, есть и такое.

В языке PHP можно создавать конструкции, которые просто физически невозможно перевести во внутреннее представление - в байт-коды (опкоды) - во время фазы трансляции (к таковым, например, относится инструкция включения в программу кода внешнего файла, имя которого выясняется только на этапе исполнения программы - к примеру, вводится пользователем). В этом случае PHP просто пропускает их, "откладывая на потом", и транслирует, как только до них дойдет управление.

Может и это как-то влияет.
 

Redjik

Джедай-мастер
Может быть. А может, не все так просто. Кроме прочего, есть и такое.
В языке PHP можно создавать конструкции, которые просто физически невозможно перевести во внутреннее представление - в байт-коды (опкоды) - во время фазы трансляции (к таковым, например, относится инструкция включения в программу кода внешнего файла, имя которого выясняется только на этапе исполнения программы - к примеру, вводится пользователем).
http://phpfaq.ru/na_tanke
 

Ragazzo

TDD interested
fixxxer
ну я просто думал, что там как-то кешируются сами "опкоды" или какие-то хитрые результаты виртуальной машины, но потом понял что это бред :D
 
Сверху