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

doran7

Новичок
Честно искал инфу, но ответа свои вопросы не нашел. Просто хочу понять отдельные моменты механизма этого кеширования. Для начала - информация, которая у меня имеется.

Обычная, без кеширования, обработка скрипта интерпретатором
http://ru.wikipedia.org/wiki/Акселератор_PHP

1. Чтение файла PHP-скрипта.
2. Генерация байткода.
3. Выполнение кода.
4. Выдача результата.

В одной серьезной, вроде как, статье (перевод с английского, автор Leendert Brouwer):
http://interway.narod.ru/context/webcoding/PHP/php46.htm

написано следующее: "Каждый раз, когда запускается PHP-скрипт, ядро Zend оптимизирует код скрипта, в результате чего генерируется машинный код, иначе называемый байт-кодом, который, в конце концов, выполняется. После этого сгенерированный для скрипта байт-код уничтожается. Возникает закономерный вопрос: можем ли мы использовать однажды сгенерированный байт-код, если скрипт с того времени не изменился?
Собственно, в этом и состоит механизм кэширования байт-кода. Когда скрипт запускается впервые, сгенерированный для него байт-код сохраняется и выполняется при последующих вызовах этого скрипта, если он не изменился с момента сохранения байт-кода. Если же это произошло, то будет сгенерирован новый байт-код, который заменит предыдущий, и так далее.
Выполнение кэшированных байт-кодов вместо самого скрипта может значительно уменьшить время его выполнения. "

Хочу понять, в каких случаях действует оговорка о возможности использовать однажды сгенерированный байт-код повторно, но если только скрипт с того времени не изменился.

Что может изменить скрипт

1. Редактирование (модификация) скрипта админом
Следующие пункты действуют, сугубое имхо (возможно неверное) только в случае неграмотной программной структуры сайта (шаблонов, скриптов и пр.) - имеется в виду изменение значений каких-гибудь переменных, плейсхолдеров и пр., т.е. какая-то зависимость кода скрипта от данных (контента) веб-страницы.
2. Запрос от неизвестного пользователя
3. Новый неизвестный запрос от известного пользователя
4. Что-то еще

Прошу корифеев помочь разобраться, в частности поделиться ссылками на толковые описания механизма кеширования байт-кода.
 

Redjik

Джедай-мастер
ты издеваешься что ли?
запятую поставил в файле со скриптом - все ты его изменил, больше никак...

ЗЫ. вместо того, чтобы тут вопросы задавать, уже давно бы установил APC да проверил все...
 
  • Like
Реакции: AmdY

doran7

Новичок
ты издеваешься что ли?
- какие издевательства, о чем ты. Скрипт динамически, что, никак не может меняться? Не может быть какой-то зависимости скрипта от контента?

запятую поставил в файле со скриптом - все ты его изменил, больше никак...
Если только так скрипты могут измениться, то почему сразу не транслировать все скрипты в байт-коды, поместить их в файлы и нормально работать с ними? Зачем хранить файлы скриптов, если можно хранить файлы байт-кодов скриптов на сервере?
 

Redjik

Джедай-мастер
какого контента блин, у тебя в пасьянсе косынка что-то меняется от контента... это то же самое что скомпилировать программу, блин это написано во всех мануалах...
php так же компилируется... но без кешера, он компилируется каждый раз... чему там меняться?
только тупорылые eval меняют код
 

doran7

Новичок
Redjik, ты так и не ответил на вопрос. Если скрипты не меняются (или меняются только когда их редактируют), то зачем нужно транслировать скрипты в байт-коды каждый раз, почему нельзя сразу все скрипты оттанслировать в байткоды и нормально работать с байткодами? Зачем нужно ждать первого запуска скрипта, почему нельзя сразу, после установки сайта на сервер, оттранслировать все скрипты в байткоды?
 

AmdY

Пью пиво
Команда форума
doran7
там проблемы в основном с разграничением прав между разными пользователями, поэтому тот же apc не используется на шаред хостингах.
 

doran7

Новичок
там проблемы в основном с разграничением прав между разными пользователями
- в смысле, для пользователей (зарегистрированных юзеров) байткоды кешируются, а для посетителей (незарегистрированных юзеров) байткоды не кешируются?
 

Redjik

Джедай-мастер
doran7
Давай ты настроишь свой первый сервер, потом разберешься с принципами работы php, а потом заново задашь свои вопросы.

А то звучит как - я хочу понять, вот вынь да положь! а хочу понять... нука объясняйте мне =)
Вот напиши простенькую программку на делфи - нажимаешь на кнопку, а она тебе рандомное число выводит. Когда узнаешь, что такое компиляция - приходи.
 

AmdY

Пью пиво
Команда форума
doran7
нет, пользователей под которыми выполняется скрипт. на шаред хостингах зачастую это вовсе один типа www-data.

кстати, не байткод, а опкод - это команды для виртуальной машины php. http://php.net/manual/en/internals2.opcodes.list.php
 

doran7

Новичок
ЗЫ. вместо того, чтобы тут вопросы задавать, уже давно бы установил APC да проверил все...
- ты предлагаешь толкать паровоз в гору, а потом найти мануал и прочитать в нем, что паровоз без колес. Я все-таки привык начинать с описания, а не с экспериментов с переключением рубильника.
 

doran7

Новичок
Вот напиши простенькую программку на делфи - нажимаешь на кнопку, а она тебе рандомное число выводит. Когда узнаешь, что такое компиляция - приходи.
... :) Redji, тебе потрепаться охота? Я на ассемблере 100 лет назад километровые коды писал, потом на С, потом был перерыв 100 лет, сейчас PHP как хобби, а ты мне про компиляцию ... :) Лучше бы ссылочку толковую подкинул на мануал какой-нибудь.

А то звучит как - я хочу понять, вот вынь да положь! а хочу понять... нука объясняйте мне =)
- ежели тебе в напряг, я ж тебя не заставляю... скажу тебе страшную тайну - здесь нет принудиловки, не хочешь - не отвечай, квартальную премию никто не снимет за молчание. ...:)
 

Redjik

Джедай-мастер
doran7
apt-get install php-apc

вот все, что тебе необходимо, а про потрепаться... треплешься только ты, тебе сложнее эти три слова написать видимо
 

Фанат

oncle terrible
Команда форума
Прелестный топик. Просто прелестный. Беллетристика про ограбленного программиста-имеприалиста перед ним меркнет.
Если только так скрипты могут измениться, то почему сразу не транслировать все скрипты в байт-коды, поместить их в файлы и нормально работать с ними? Зачем хранить файлы скриптов, если можно хранить файлы байт-кодов скриптов на сервере?
Это другой вопрос. Ответ на него тебе всё равно не понять, но он и не важен.
Важно, что сама по себе постановка вопроса здесь правильная - ты, наконец, понял, что имеется в виду под изменением скрипта.
Корифеи помогли тебе разобраться, Вопрос исчерпан.
 

WMix

герр M:)ller
Партнер клуба
doran7
мы же понимаем разницу между компелируемым и интерпретируемым языком? что даже ява которая компелируется действительно в байт код нечто совершенно иное нежели пхп который по сути не компелируется...
интерперетация состоит из нескольких шагов, лексический анализ, построение дерева лексем итд... некоторые шаги можно сделать всего один раз и сохранить для повторного вызова.
Если скрипты не меняются (или меняются только когда их редактируют), то зачем нужно транслировать скрипты в байт-коды каждый раз
PHP:
include $paht[$_GET['action']]
перепиши в ассемблер а....
 

doran7

Новичок
нежели пхп который по сути не компелируется...
Я не говорил о компилляции PHP. Интересовал механизм трансляции PHP в эти самые опкоды и как они кешируются.

include $paht[$_GET['action']]
перепиши в ассемблер а....
Лучше покажи, какой опкод будет этому соответствовать.
 

WMix

герр M:)ller
Партнер клуба
чес слово представления не имею, предполагаю, что дерево вызовов сохранилось, но это нужно интерпретировать, а далее поняв что находится в $_GET возможно найдем еще одну часть большого пазла и возможно даже в опимированном виде... но никуда не денешься, это нужно читать лексему за лексемой потомучто далее строчка
PHP:
$obj = new ${$db_row['class']}()
если просто положить код в память это уже сократит скорость вызова... но можно сделать чуть больше чем просто положить...
 
Сверху