Как работает PHP Opcache

PHP

Несмотря на то, что сейчас эпидемия, мы должны продолжать инвестировать в свой мозг, чтобы мы могли сделать себя более ценными в будущей карьере.

Как работает PHP

Прежде всего, давайте разберемся с принципом работы интерпретируемого языка PHP, который поможет нам понять PHP Opcache.

Для PHP мы обычно используем режим cli и режим php-fpm. Возьмем режим cli для описания запущенного процесса исполнения PHP-скрипта:

  1. php инициализирует выполнение, запускает движок zend и загружает зарегистрированные модули расширения
  2. Прочитайте файл сценария, движок Zend выполняет лексический анализ, анализ синтаксиса и создает связующее дерево синтаксиса для сценария.
  3. Zend Engine компилирует синтаксическое дерево и генерирует промежуточный код кода операции.
  4. Zend Engine выполняет код операции и возвращает результат выполнения.

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

Для режима php-fpm ссылка инициализации php (шаг 1) будет выполняться при старте php-fpm, а последующие шаги будут повторяться каждый раз при выполнении запроса (принцип работы php-fpm+nginx, Студенты, которые не знаю, можете прочитать предыдущую статьюКак nginx+php выполняет запросы).

Для проектов с высоким трафиком и параллелизмом каждый раз, когда выполняется скрипт или запрос, фиксированный файл скрипта необходимо перекомпилировать для генерации фиксированного кода операции, что действительно является пустой тратой ресурсов, поэтому появился opcache.

PHP Opcache

Проще говоря, Opcache — это компонент, разработанный php для работы с файлами сценариев, которые необходимо каждый раз перекомпилировать, что может сэкономить накладные расходы на синтаксический анализ файлов сценариев, упомянутых выше.

Что кэширует Opcache

В настоящее время содержимое, кэшируемое Opcache, включает:

  • Opcode
  • Интернированная строка (можно понимать как строку, которую не нужно освобождать в жизненном цикле запроса PHP, включая: имена переменных, имена классов, имена методов, строки, комментарии и т. д.)

Как работает Opcache

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

Поскольку Opcache не будет препятствовать чтению других процессов в процессе создания кеша, поэтому при использовании Opcache обратите внимание на два момента, иначе он будет потреблять много ресурсов:

  • Не устанавливайте срок действия для Opcache
  • Не выпускайте код в часы пик трафика

Запомнить!

Конфигурация Opcache

Сказав так много, давайте посмотрим, как настроен Opcache?

Конфигурация Opcache находится в файле php.ini (студенты, у которых не установлено расширение, могут установить расширение на свой собственный Baidu).Далее мы в основном объясним некоторые важные конфигурации для повышения общей производительности PHP.

//添加Opcache扩展
zend_extension=opcache.so
//开启Opcache
opcache.enable=1
//cli环境下启用Opcache
opcache.enable_cli=1
//浪费内存的上限,以百分比计,如果达到该上限,Opcache则会清空并重新生成缓存。默认5%
opcache.max_wasted_percentage=5
//配置共享内存存储大小,单位MB
opcache.memory_consumption=128
//用来存储临时字符串的内存大小,单位MB。这个配置就是上面说到的Opcache缓存的interned_string,它会在第一次使用到interned_string时缓存到共享内存中,供其他进程后续使用
opcache.interned_strings_buffer=8
//用于控制共享内存最多可以缓存多少个文件,该值最小范围是200,在php5.5.6版本之后,最大值是1000000
opcache.max_accelerated_files=4000
//设置缓存的过期时间,为0的话则每次都要检查
opcache.revalidate_freq=60
//如果启用,OPcache会在opcache.revalidate_freq设置的秒数去检测文件的时间戳(timestamp)检查脚本是否更新。如果这个选项被禁用(设置为0),opcache.revalidate_freq会被忽略,PHP文件永远不会被检查。这意味着如果你修改了你的代码,然后你把它更新到服务器上,再在浏览器上请求更新的代码对应的功能,你会看不到更新的效果
opcache.validate_timestamps=0 //所以像我上面说的,在大流量高并发场景下,该项不要启用,切记
//启用后,可以将依赖Zend引擎的内存管理模块一次释放全部请求变量的内存,而不是依次释放每一个已分配的内存块。
opcache.fast_shutdown=1
//启用文件缓存(设置缓存路径),这样Opcache就可以将Opcode缓存到文件中,实现跨php生命周期缓存
opcache.file_cache=/tmp

Суммировать

После 19 лет увольнений и 20 лет эпидемий мы должны понимать, что самое главное — вкладываться только в себя. Только постоянно совершенствуя себя, вы сможете позволить себе справиться с неконтролируемыми изменениями!

Наконец, я желаю вам всем удачи в новом году. Вы также можете обратить внимание на мой паблик-аккаунт WeChat и колонку:许铮的成长之路(id: xuzheng-growth), приходите и вместе изучайте технические знания. Мой рост может быть и твоим~