Як користуватися PHP OPCache?


249

PHP 5.5 було випущено, і він містить новий модуль кешування коду під назвою OPCache, але, здається, не існує жодної документації на нього.

Тож де документація на нього і як я можу використовувати OPcache?




Шкода, що Документація НЕ вказує нам, як правильно скомпілювати команду opcache / відключити її, а також не обійдеш автоконфактор джерела PHP 5.6.24+, щоб PHP компілювався! :-(
Filip OvertoneSinger Rydlo

@ Fred-ii- "Існує багато налаштувань, які можуть потребувати коригування. Розуміння того, як це працює, та виявлення проблем під час фази стабілізації процесу випуску PHP 5.5 допоможе значно." ... Цей запис у блозі не дуже корисний. Це не пояснює, як зрозуміти, як це працює або як найкраще відрегулювати налаштування :(
icc97

Відповіді:


371

Установка

OpCache компілюється за замовчуванням на PHP5.5 +. Однак він відключений за замовчуванням. Для того, щоб почати використовувати OpCache в PHP5.5 +, спочатку доведеться його активувати. Для цього вам доведеться зробити наступне.

Додайте до свого рядка наступний рядок php.ini:

zend_extension=/full/path/to/opcache.so (nix)
zend_extension=C:\path\to\php_opcache.dll (win)

Зауважте, що коли шлях містить пробіли, слід загорнути його в лапки:

zend_extension="C:\Program Files\PHP5.5\ext\php_opcache.dll"

Також зауважте, що вам доведеться використовувати zend_extensionдирективу замість "звичайної" extensionдирективи, оскільки вона впливає на фактичний двигун Zend (тобто на те, що працює на PHP).

Використання

В даний час є чотири функції, якими ви можете скористатися:

opcache_get_configuration():

Повертає масив, що містить в даний час конфігурацію, яку використовує OpCache. Сюди входять усі параметри ini, а також інформація про версії та файли у чорному списку.

var_dump(opcache_get_configuration());

opcache_get_status():

Це поверне масив з інформацією про поточний стан кешу. Ця інформація включає такі речі, як: стан кешу (увімкнено, перезапуск, повний і т.д.), використання пам'яті, хіти, пропуски та деяку більш корисну інформацію. Він також буде містити кешовані сценарії.

var_dump(opcache_get_status());

opcache_reset():

Скидає весь кеш. Значить усі можливі кешовані сценарії будуть проаналізовані знову під час наступного відвідування.

opcache_reset();

opcache_invalidate():

Недійсний специфічний кешований сценарій. Значення сценарію буде проаналізовано знову під час наступного візиту.

opcache_invalidate('/path/to/script/to/invalidate.php', true);

Технічне обслуговування та звіти

Існує кілька графічних інтерфейсів, які допомагають підтримувати OpCache та генерувати корисні звіти. Ці інструменти використовують перераховані вище функції.

OpCacheGUI

Застереження Я є автором цього проекту

Особливості:

  • Статус OpCache
  • Конфігурація OpCache
  • Статистика OpCache
  • OpCache скидання
  • Огляд кешованих сценаріїв
  • Вимкнення кешованих сценаріїв
  • Багатомовний
  • Підтримка мобільних пристроїв
  • Блискучі графіки

Скріншоти:

статус

кешовані сценарії

графіки

mobilr

URL: https://github.com/PeeHaa/OpCacheGUI

opcache-статус

Особливості:

  • Статус OpCache
  • Конфігурація OpCache
  • Статистика OpCache
  • Огляд кешованих сценаріїв
  • Один файл

Знімок екрана:

статус

URL: https://github.com/rlerdorf/opcache-status

opcache-gui

Особливості:

  • Статус OpCache
  • Конфігурація OpCache
  • Статистика OpCache
  • OpCache скидання
  • Огляд кешованих сценаріїв
  • Вимкнення кешованих сценаріїв
  • Автоматичне оновлення

Знімок екрана:

opcache-gui-огляд

URL: https://github.com/amnuts/opcache-gui


6
Щось щодо PHP-CLI? Як CLI використовує його? Коли FPM перезапускається, OPCache скидається - чи це також впливає на OPCache CLI? OPCache CLI є окремим чи він поділяє той самий пул кешу з FPM? Дякую!
Шахріяр Іманов

3
OpCache увімкнено для моєї останньої установки на ubuntu 14.04, apache 2.4.7, php 5.5.9.
jstats

привіт, у вашому 3-му скріншоті cache_full неправдиво, я припускаю, що це стосується кешування на повній сторінці, чи не могли б ви сказати, як увімкнути його? (зробити це правдою)
brucekaushik

Я помиляюся, це не для кешування повної сторінки, але вона виявиться справжньою, якщо пам'ять, яку кеш використовує, буде заповнена. Спасибі все одно!
brucekaushik

zend_extension = C: \ path \ to \ php_opcache.dll (win) - Додавання цього рядка в php.ini працює чудово.
калідасан

152

OPcache замінює APC

Оскільки OPcache призначений для заміни модуля APC, запустити їх паралельно в PHP неможливо. Це добре для кешування PHP-коду, оскільки це не впливає на те, як ви пишете код.

Однак це означає, що якщо ви зараз використовуєте APC для зберігання інших даних (через apc_store()функцію), ви не зможете це зробити, якщо ви вирішите використовувати OPCache.

Вам потрібно буде використовувати іншу бібліотеку, наприклад, APCu або Yac, які обидва зберігають дані у спільній пам'яті PHP, або переключитись на використання чогось схожого на запам’ятоване, яке зберігає дані в пам'яті в окремому процесі на PHP.

Також OPcache не має еквівалента вимірювача прогресу завантаження, присутнього в APC. Натомість слід скористатися ходом завантаження сесії .

Налаштування для OPcache

Документацію для OPcache можна знайти тут із усіма переліченими тут параметрами конфігурації . Рекомендовані налаштування:

; Sets how much memory to use
opcache.memory_consumption=128

;Sets how much memory should be used by OPcache for storing internal strings 
;(e.g. classnames and the files they are contained in)
opcache.interned_strings_buffer=8

; The maximum number of files OPcache will cache
opcache.max_accelerated_files=4000

;How often (in seconds) to check file timestamps for changes to the shared
;memory storage allocation.
opcache.revalidate_freq=60

;If enabled, a fast shutdown sequence is used for the accelerated code
;The fast shutdown sequence doesn't free each allocated block, but lets
;the Zend Engine Memory Manager do the work.
opcache.fast_shutdown=1

;Enables the OPcache for the CLI version of PHP.
opcache.enable_cli=1

Якщо ви використовуєте будь-яку бібліотеку або код, який використовує анотації коду, ви повинні ввімкнути збереження коментарів:

opcache.save_comments=1

Якщо вимкнено, всі коментарі PHPDoc видаляються з коду, щоб зменшити розмір оптимізованого коду. Якщо вимкнути "Коментарі Doc", можна порушити деякі існуючі програми та рамки (наприклад, Doctrine, ZF2, PHPUnit)


4
Чи є ці рекомендовані параметри для виробничого середовища, для розробки чи обох?
marcvangend

1
Можливо, непорозуміння в моїй частині того, що саме є opcache і для чого він використовується, але я налаштував його і перевірив за допомогою сценарію стану PeeHaa нижче. Всі працюють. Але я все-таки задаю питання ОП. "Як ним користуватися?" Це не для кешування поглядів, і це так?
isimmons

3
@isimmons "OPcache покращує продуктивність PHP, зберігаючи попередньо складений байт-код скрипта у спільній пам'яті, тим самим усуваючи потребу PHP для завантаження та розбору сценаріїв для кожного запиту."
Данак

1
@marcvangend Добрий момент! Я думаю, що кешування має лише реальний сенс у виробництві, тому ці конфігурації, мабуть, є виробничими налаштуваннями.
Sliq

3
Чи може хтось пояснити, чому ефективність рекомендованих налаштувань гірша за замовчуванням або коли вони повинні почати давати ефект?
РП

19

Я збираюсь скинути свої два центи за те, що я використовую у програмі opcache.

Я створив обширну основу з великою кількістю полів та методів перевірки та перелічень, щоб мати можливість спілкуватися зі своєю базою даних.

Без оскара

Під час використання цього скрипту без запуску, і я надсилаю 9000 запитів за 2,8 секунди до сервера apache, він максимумується на 90-100% процесора протягом 70-80 секунд, поки він не наздожене всі запити.

Total time taken: 76085 milliseconds(76 seconds)

Якщо ввімкнено функцію opcache

Увімкнено функцію opcache, вона працює на 25-30% процесорного часу протягом приблизно 25 секунд і ніколи не передає 25% використання процесора.

Total time taken: 26490 milliseconds(26 seconds)

Я створив файл чорного списку opcache, щоб відключити кешування всього, крім рамки, яка є всім статичною і не потребує зміни функціональності. Я вибираю явно лише рамкові файли, щоб я міг розвиватися, не турбуючись про перезавантаження / перевірку файлів кешу. Якщо все є кешоване, економляться секунди від загальної кількості запитів25546 milliseconds

Це значно розширює обсяг даних / запитів, з якими я можу оброблятись за секунду, без того, щоб сервер навіть порушив поту.


3
zend_extension=php_opcache.dll; opcache.memory_consumption=128; opcache.interned_strings_buffer=8; opcache.max_accelerated_files=4000; opcache.revalidate_freq=60; opcache.fast_shutdown=1; opcache.enable_cli=1; opcache.blacklist_filename="C:\xampp\php\cfg\opcache.blacklist;Просто замініть; із записом у файлі ini. Але це я і використовував. в основному речі за замовчуванням
Tschallacka,

1
btw, я запускаю це з memcache, роблячи 2100 баз даних, вимагає секунди запускає сценарій, який я використовую протягом 150 мікросекунд (близько 1/6 мілісекунди)
Tschallacka,

1
Opcache кешує файли php у складеному вигляді в пам'яті. Таким чином, у вас більше немає витрат на зчитування з диска та компілювання та оптимізацію файлів за допомогою php-аналізатора. Memcache - це те, що ви можете використовувати для зберігання змінних між сеансами. Наприклад, користувач має сценарій оновлення, який запитує ті самі параметри протягом 10 секунд, а користувач дивиться на екран. Ви можете використовувати кеш mem для того, щоб скомпілювати запит один раз, а потім продовжувати вимагати складеного запиту з пам'яті.
Цалалака

2
це не так. opcache.revalidate_freq=60;визначає, як довго файл може жити в пам'яті за секунди. коли настає час, він перекомпілює файл.
Цалалака

3
Насправді, opcache.revalidate_freqконтролює частоту перевірки сценарію на наявність змін (виходячи з того, чи змінилася його часова марка). Отже, якщо часова мітка сценарію залишається такою ж, як і в останній раз, коли вона була складена, вона не буде перекомпільована. Все це припускаючи, що ви не змінили opcache.validate_timestampsналаштування, яке включено за замовчуванням.
jjlin

4

З PHP 5.6 на Amazon Linux (має бути однаково на RedHat або CentOS):

yum install php56-opcache

а потім перезапустіть apache.


2

Я зіткнувся з цим під час налаштування настрою. Наступні рядки я додав у файл php.ini.

zend_extension=C:\xampp\php\ext\php_opcache.dll

[opcache]
opcache.enable = 1
opcache.memory_consumption = 128
opcache.max_accelerated_files = 4000
opcache.revalidate_freq = 60

; Required for Moodle
opcache.use_cwd = 1
opcache.validate_timestamps = 1
opcache.save_comments = 1
opcache.enable_file_override = 0

; If something does not work in Moodle
;opcache.revalidate_path = 1 ; May fix problems with include paths
;opcache.mmap_base = 0x20000000 ; (Windows only) fix OPcache crashes with event id 487

; Experimental for Moodle 2.6 and later
;opcache.fast_shutdown = 1
;opcache.enable_cli = 1 ; Speeds up CLI cron
;opcache.load_comments = 0 ; May lower memory use, might not be compatible with add-ons and other apps

extension=C:\xampp\php\ext\php_intl.dll

[intl]
intl.default_locale = en_utf8
intl.error_level = E_WARNING

intl -> http://php.net/manual/en/book.intl.php


1
Можливо, варто зазначити, що ці параметри задокументовані тут: docs.moodle.org/30/uk/OPcache
sierrasdetandil

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.