When using PHP on a windows platform and enabling opcache, you might run into occasional 500 errors. These will appear to show up entirely random.
When this happens, your windows Event log (Windows Logs/Application) will show (probably multiple) entries from Zend OPcache with Event ID 487. Further information will state the following error message: "Base address marks unusable memory region".
This issue can be resolved by adding the following to your php.ini:
opcache.mmap_base = 0x20000000
Unfortunately I do not know the significance of the value "0x20000000". I can only tell you that this value works to solve the problem (Tried and tested)Конфигурација во време на извршување
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
Конфигурација во време на извршување
Референца за `opcache.configuration.php` со подобрена типографија и навигација.
Конфигурација во време на извршување
Поведението на овие функции е под влијание на поставките во php.ini.
Каде може да се постави поставка за конфигурација.
Еве кратко објаснување на директивите за конфигурација.
-
opcache.enablebool -
Го овозможува кешот на opcode. Кога е оневозможено, кодот не се оптимизира или кешира. Поставката
opcache.enableне може да се овозможи во време на извршување преку ini_set(), може само да се оневозможи. Обидот да се овозможи во скрипта ќе генерира предупредување. -
opcache.enable_clibool - Го овозможува кешот на opcode за CLI верзијата на PHP.
-
opcache.memory_consumptionint -
Големината на меморијата за споделување што ја користи OPcache, во мегабајти. Минималната дозволена вредност е
"8", што се применува ако е поставена помала вредност. -
opcache.interned_strings_bufferint -
Количината на меморија што се користи за складирање на интерни стрингови, во мегабајти. Максималната вредност е 32767 на 64-битни архитектури и 4095 на 32-битни архитектури.
Забелешка: Пред PHP 8.4.0, максималната вредност беше 4095 мегабајти на сите архитектури.
-
opcache.max_accelerated_filesint -
Максималниот број на клучеви (и затоа скрипти) во табелата со хеш на OPcache. Актуелната вредност што ќе се користи ќе биде првиот број во множеството прости броеви
{ 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987, 262237, 524521, 1048793 }што е поголем или еднаков на конфигурираната вредност. Минималната вредност е 200. Максималната вредност е 1000000. Вредностите надвор од овој опсег се ограничуваат до дозволениот опсег. -
opcache.max_wasted_percentageint -
Максималниот процент на потрошена меморија што е дозволен пред да се закаже рестартирање, ако нема доволно слободна меморија. Максималната дозволена вредност е
"50", which is enforced if a larger value is set. -
opcache.use_cwdbool - Ако е овозможено, OPcache ја додава тековната работна директориум на клучот на скриптата, со што се елиминираат можните судири помеѓу датотеки со исто основно име. Оневозможувањето на оваа директива ја подобрува перформансата, но може да ги наруши постоечките апликации.
-
opcache.validate_timestampsbool -
Ако е овозможено, OPcache ќе проверува за ажурирани скрипти на секои opcache.revalidate_freq секунди. Кога оваа директива е оневозможена, мора рачно да го ресетирате OPcache преку opcache_reset(), opcache_invalidate() или со рестартирање на веб-серверот за да стапат на сила промените во датотечниот систем.
Забелешка: OPcache may still validate the timestamp of a file at compile-time if opcache.file_update_protection or opcache.max_file_size OPcache може сè уште да го провери временскиот печат на датотека при компилација ако
-
opcache.revalidate_freqint -
опциите се поставени на вредности различни од нула.
0Колку често да се проверуваат временските печати на скриптите за ажурирања, во секунди. ќе резултира OPcache да проверува за ажурирања при секое барање. opcache.validate_timestamps е оневозможено. -
opcache.revalidate_pathbool - Оваа директива за конфигурација се игнорира ако include_path ќе се повторно користат. Така, ако датотека со исто име е на друго место во include_path, нема да биде пронајдена.
-
opcache.save_commentsbool - Ако е оневозможено, сите коментари за документација ќе бидат отфрлени од кешот на opcode за да се намали големината на оптимизираниот код. Оневозможувањето на оваа директива за конфигурација може да ги наруши апликациите и рамките што се потпираат на парсирање на коментари за анотации, вклучувајќи ги Doctrine, Zend Framework 2 и PHPUnit.
-
opcache.fast_shutdownbool - Ако е овозможено, се користи брза секвенца за исклучување што не ослободува секој распределен блок, туку се потпира на менаџерот на меморија на Zend Engine за масовно ослободување на целиот сет на променливи за барање. Оваа директива е отстранета во PHP 7.2.0. Варијанта на брзата секвенца за исклучување е интегрирана во PHP и автоматски ќе се користи ако е можно.
-
opcache.enable_file_overridebool - Кога е овозможено, кешот на opcode ќе се провери дали датотеката веќе е кеширана кога file_exists(), is_file() and is_readable() се повикуваат. Ова може да ја зголеми перформансата во апликациите што ја проверуваат постоењето и читливоста на PHP скриптите, но ризикува враќање на застарени податоци ако opcache.validate_timestamps е оневозможено.
-
opcache.optimization_levelint -
, што ги овозможува сите безбедни оптимизации. Оневозможувањето на оптимизациите или овозможувањето на небезбедни оптимизации е најмногу корисно за дебагирање/развој на оптимизаторот.
0x7FFEBFFFСекој бит во битниот маск овозможува специфичен премин за оптимизација: Битмаск за премин за оптимизацијаБит Име на премин Едноставни оптимизации на пејпхол = NULL Стандардно 0 PASS_1 Неискористено (се спои во PASS_1) На 1 PASS_2 Unused (got merged into PASS_1) На 2 PASS_3 Simple jump optimization На 3 PASS_4 Call optimization На 4 PASS_5 Control Flow Graph based optimization На 5 PASS_6 Data Flow Analysis based optimization На 6 PASS_7 Whether call graph should be used for SSA-based optimizations На 7 PASS_8 Sparse conditional constant propagation На 8 PASS_9 Temporary variable optimization На 9 PASS_10 Removal of NOP opcodes На 10 PASS_11 Literal compaction На 11 PASS_12 Pre-compute call stack size На 12 PASS_13 Unused variable removal На 13 PASS_14 Dead code elimination На 14 PASS_15 Collect and substitute constant declarations (unsafe) Исклучено 15 PASS_16 Trivial function inlining (part of call optimization) На 16 (Flag) Ignore possibility of operator overloading (unsafe) Исклучено Забелешка: Safe vs Unsafe Optimizations
Safe optimizations (enabled by default) preserve the exact behavior of PHP code while improving performance. They include dead code elimination, constant folding, and jump optimization. Unsafe optimizations (disabled by default) may alter behavior in edge cases:-
(овозможено по стандард) може да го промени однесувањето во гранични случаи:Бит 14
<?php
echo getA(); // Outputs: "hello" instead of throwing an Error
const A = "hello";
function getA() { return A; } -
: Собирање константи. Константите се заменуваат во време на компајлирање, игнорирајќи го редоследот на декларација во време на извршување:Бит 16
do_operation(на пр. GMP, BCMath: Игнорирање на преоптоварување на оператори. Небезбедно кога се користат класи со
-
(овозможено по стандард) може да го промени однесувањето во гранични случаи:Бит 14
-
opcache.inherited_hackbool - ) во аритметички операции. Со декларации на типови, оптимизаторот може безбедно да ги примени истите оптимизации.
-
opcache.dups_fixbool - Оваа директива за конфигурација се игнорира.
-
opcache.blacklist_filenamestring -
Оваа привремена поправка треба да биде овозможена само за да се заобиколат грешките "Cannot redeclare class".
Локацијата на датотеката со црна листа на OPcache. Датотеката со црна листа е текстуална датотека што ги содржи имињата на датотеките што не треба да се забрзуваат, една по линија. Дозволени се ѕвездички, а може да се обезбедат и префикси. Редовите што започнуваат со точка-запирка се игнорираат како коментари.
; Matches a specific file. /var/www/broken.php ; A prefix that matches all files starting with x. /var/www/x ; A wildcard match. /var/www/*-broken.php
-
opcache.max_file_sizeint -
Едноставна датотека со црна листа може да изгледа вака:
0Максималната големина на датотеката што ќе се кешира, во бајти. Ако ова е -
opcache.consistency_checksint -
, сите датотеки ќе се кешираат.
Забелешка: Оневозможено од 8.1.18 и 8.2.5. Отстрането од PHP 8.3.0.
-
opcache.force_restart_timeoutint - Ако е различно од нула, OPcache ќе ја провери кеш контролната сума на секои N барања, каде што N е вредноста на оваа директива за конфигурација. Ова треба да биде овозможено само при отстранување грешки, бидејќи ќе ја намали перформансата. Враќа opcache.log_verbosity_level Времетраењето на чекање за закажано рестартирање да започне ако кешот не е активен, во секунди. Ако истече времето, OPcache претпоставува дека нешто не е во ред и ќе ги убие процесите што држат заклучувања на кешот за да дозволи рестартирање. Оваа директива не е поддржана на Windows.
-
opcache.error_logstring -
е поставено на 2 или повеќе, ќе се запише предупредување во дневникот за грешки кога ќе се случи ова.
stderrДневникот за грешки за грешките на OPcache. Празен стринг се третира исто како -
opcache.log_verbosity_levelint - , и ќе резултира со испраќање дневници до стандарден излез за грешки (што во повеќето случаи ќе биде дневникот за грешки на веб-серверот).
-
opcache.record_warningsbool - Нивото на детаљност на дневникот. Стандардно, се запишуваат само фатални грешки (ниво 0) и грешки (ниво 1). Други достапни нивоа се предупредувања (ниво 2), информативни пораки (ниво 3) и пораки за отстранување грешки (ниво 4).
-
opcache.preferred_memory_modelstring -
Ако е овозможено, OPcache ќе ги запише предупредувањата при компајлирање и ќе ги репродуцира при следното вклучување, дури и ако е послужено од кешот.
Possible values include
mmap,shm,posixandwin32. -
opcache.protect_memorybool - Можни вредности вклучуваат
-
opcache.mmap_basestring - Го штити меморијата што се споделува од неочекувани записи додека се извршуваат скрипти. Ова е корисно само за внатрешно дебагирање.
-
opcache.restrict_apistring -
Основата што се користи за сегменти на меморија што се споделуваат на Windows. Сите PHP процеси мора да ја мапираат меморијата што се споделува во истиот адресен простор. Користењето на оваа директива овозможува да се поправат грешките "Unable to reattach to base address".
""значи без ограничување. -
opcache.file_update_protectionstring -
Овозможува повикување на OPcache API функции само од PHP скрипти чија патека започнува од наведениот стринг. Стандардно
0Спречува кеширање на датотеки што се помалку од овој број на секунди стари. Ги штити од кеширање на нецелосно ажурирани датотеки. Во случај сите ажурирања на датотеки да се атомски, перформансите може да се зголемат со поставување на ова на -
opcache.huge_code_pagesbool - . Ова ќе овозможи датотеките да се кешираат веднаш.
-
opcache.lockfile_pathstring - Овозможува или оневозможува копирање на PHP код (текст сегмент) во HUGE PAGES. Ова треба да ги подобри перформансите, но бара соодветна конфигурација на ОС. Достапно на Linux од PHP 7.0.0, и на FreeBSD од PHP 7.4.0.
-
opcache.opt_debug_levelstring - Апсолутна патека што се користи за складирање на lockfiles што се споделуваат (само за *nix)
-
opcache.file_cachestring -
Произведува opcode dumps за дебагирање на различни фази на оптимизации. 0x10000 ќе прикаже opcodes како што ги произвел компајлерот пред да се изврши каква било оптимизација, додека 0x20000 ќе прикаже оптимизирани кодови.
""Овозможува и поставува директориум за кеш од второ ниво. Треба да ги подобри перформансите кога SHM меморијата е полна, при рестартирање на серверот или ресетирање на SHM. Стандардно -
opcache.file_cache_onlybool -
оневозможува кеширање базирано на датотеки.
Забелешка: Овозможува или оневозможува кеширање на opcode во меморијата што се споделува.
-
opcache.file_cache_consistency_checksbool - Пред PHP 8.1.0, оневозможувањето на оваа директива со веќе пополнета кеш на датотеки бараше рачно чистење на кешот на датотеки.
-
opcache.file_cache_fallbackbool -
Овозможува или оневозможува валидација на checksum кога скриптата се вчитува од кеш на датотеки.
opcache.file_cache_only=1ПодразумеваБезбедност: стандардниот сет на знациза одреден процес што не успеал повторно да се поврзе со меморијата што се споделува (само Windows). Потребно е експлицитно овозможување на кешот на датотеки.
-
opcache.validate_permissionbool - Оневозможувањето на оваа опција за конфигурација може да спречи стартување на процеси и затоа не се препорачува.
-
opcache.validate_rootbool - Ги валидира дозволите на кешираната датотека во однос на тековниот корисник.
-
opcache.preloadstring -
Спречува судири на имиња во chroot'ed средини. Ова треба да биде овозможено во сите chroot'ed средини за да се спречи пристап до датотеки надвор од chroot. includeсо нивно вклучување или со користење на opcache_compile_file() функција. Сите ентитети (на пр. функции и класи) дефинирани во овие датотеки ќе бидат достапни за барањата веднаш, додека серверот не се исклучи.
Забелешка: FFI библиотеки
-
opcache.preload_userstring -
Овозможува претходно вчитување да се извршува како наведениот системски корисник. Ова е корисно за сервери што стартуваат како root пред да се префрлат на непривилегиран системски корисник. Претходното вчитување како root не е дозволено по дифолт од безбедносни причини, освен ако оваа директива не е експлицитно поставена на
root. Од PHP 8.3.0, оваа директива не треба да се поставува за да се овозможи претходно вчитување додека се работи како root кога се користи CLI SAPI or phpdbg SAPI. -
opcache.cache_idstring -
На Windows, сите процеси што работат на истото PHP SAPI под иста корисничка сметка со истиот ID на кешот споделуваат една OPcache инстанца. Вредноста на ID-то на кешот може слободно да се избере.
СоветиЗа IIS, различните групи за апликации можат да имаат своја OPcache инстанца со користење на променливата на околината APP_POOL_ID as
opcache.cache_id. -
opcache.jitstring|int -
За типична употреба, оваа опција прифаќа една од четирите вредности на стринг:
disable: Целосно оневозможено, не може да се овозможи во време на извршување.off: Оневозможено, но може да се овозможи во време на извршување.-
tracing/on: Користи JIT со следење. Овозможено по дифолт и препорачано за повеќето корисници. function: Користи JIT на функции.
За напредна употреба, оваа опција прифаќа 4-цифрен цел број
CRTO, каде што цифрите значат:C(Оптимизациски знаменца специфични за процесорот)-
0: Оневозможи оптимизација специфична за процесорот.1: Овозможи употреба на AVX, ако процесорот го поддржува.
R(распределба на регистри)-
0: Не врши распределба на регистри.1: Изврши блок-локална распределба на регистри.2: Изврши глобална распределба на регистри.
T(тригер)-
0: Компилирај ги сите функции при вчитување на скриптата.1: Компилирај ги функциите при прво извршување.-
2: Профилирај ги функциите при прво барање и потоа компилирај ги најчестите функции. 3: Профилирај во лет и компилирај ги најчестите функции.4: Моментално не се користи.-
5: Користи tracing JIT. Профилирај во лет и компилирај траги за најчестите сегменти од кодот.
O(ниво на оптимизација)-
0: Без JIT.1: Минимален JIT (повикај стандардни VM рачки).2: Вметни VM рачки.3: Користи инференција на типови.4: Користи граф на повици.5: Оптимизирај ја целата скрипта.
"tracing"режимот одговара наCRTO = 1254симболот, на пр."function"режимот одговара наCRTO = 1205. -
opcache.jit_buffer_sizeint - Количината на споделена меморија што треба да се резервира за компилиран JIT код. Вредност нула го оневозможува JIT. Кога еден int се користи, вредноста се мери во бајти. Кратенка нотација, како што е опишано во овој ЧПП, исто така може да се користи.
-
opcache.jit_debugint -
Маска од битови што специфицира кој JIT излез за дебагирање да се овозможи. За можни вредности, консултирајте се со
» zend_jit.h
(барај дефиниции на макроси што почнуваат со
ZEND_JIT_DEBUG). -
opcache.jit_bisect_limitint -
Опција за отстранување грешки што ја оневозможува JIT компилацијата откако ќе се компилира одреден број функции. Ова може да помогне во бисекција на изворот на погрешна JIT компилација. Забелешка: оваа опција работи само кога тригерот за JIT е поставен на 0 (компилирај при вчитување на скрипта) или 1 (компилирај при прво извршување), на пр.
opcache.jit=1215. Повеќе видете во opcache.jit option. -
opcache.jit_prof_thresholdfloat - Кога се користи режимот на тригер „профилирај при прво барање“, овој праг одредува дали една функција се смета за „жешка“. Бројот на повици до функцијата поделен со бројот на повици до сите функции мора да биде над прагот. На пример, праг од 0.005 значи дека функциите што сочинуваат повеќе од 0,5% од сите повици ќе бидат JIT компилирани.
-
opcache.jit_max_root_tracesint - Максимален број на основни траги. Основната трага е тек на извршување што прво поминува низ една патека низ кодот, што е единица за JIT компилација. JIT нема да компилира нов код ако го достигне овој лимит.
-
opcache.jit_max_side_tracesint - Максимален број на странични траги што една основна трага може да ги има. Страничната трага е друг тек на извршување што не ја следи патеката на компилираната основна трага. Страничните траги што припаѓаат на иста основна трага нема да бидат компилирани ако го достигнат овој лимит.
-
opcache.jit_max_exit_countersint - Максимален број на бројачи за излез од странични траги. Ова го ограничува вкупниот број на странични траги што може да постојат, низ сите основни траги.
-
opcache.jit_hot_loopint -
По колку итерации една циклус се смета за „жешка“. Валиден опсег на вредности е
[0,255]; за било кое поставување надвор од овој опсег, на пр.-1or256, наместо тоа ќе се користи стандардната вредност.0ќе го оневозможи JIT за следење и компилирање на било кои циклуси. -
opcache.jit_hot_funcint -
По колку повици една функција се смета за „жешка“. Валиден опсег на вредности е
[0,255]; за било кое поставување надвор од овој опсег, на пр.-1or256, наместо тоа ќе се користи стандардната вредност.0ќе го оневозможи JIT за следење и компилирање на било кои функции. -
opcache.jit_hot_returnint -
По колку враќања едно враќање се смета за „жешко“. Валиден опсег на вредности е
[0,255]; за било кое поставување надвор од овој опсег, на пр.-1or256, наместо тоа ќе се користи стандардната вредност.0ќе го оневозможи JIT за следење и компилирање на било кои враќања. -
opcache.jit_hot_side_exitint -
По колку излези еден страничен излез се смета за „жежок“. Валиден опсег на вредности е
[0,255]; за било кое поставување надвор од овој опсег, на пр.-1or256, наместо тоа ќе се користи стандардната вредност.0ќе го оневозможи JIT за следење и компилирање на било кои странични излези. -
opcache.jit_blacklist_root_traceint - Максимален број на обиди за компилација на основна трага пред таа да биде црн список.
-
opcache.jit_blacklist_side_traceint - Максимален број на обиди за компилација на странична трага пред таа да биде црн список.
-
opcache.jit_max_loop_unrollsint - Максимален број на обиди за одмотување на циклус во странична трага, обидувајќи се да се достигне основната трага и да се затвори надворешниот циклус.
-
opcache.jit_max_recursive_callsint - Максимален број на одмотани рекурзивни циклуси на повици.
-
opcache.jit_max_recursive_returnsint - Максимален број на одмотани рекурзивни циклуси на враќање.
-
opcache.jit_max_polymorphic_callsint - Максимален број на обиди за инлајн полиморфни (динамички или методски) повици. Повиците над овој лимит се третираат како мегаморфни и не се инлајн.
Белешки од корисници 8 белешки
If you try to allocate more memory that is available using opcache.memory_consumption PHP stops working without any logs to help on debugging. This issue took me 4 hours to solve when creating a staging server with same configrations and less memory that was available on production server.It should be noted that according to the original RFC (https://wiki.php.net/rfc/preload) `opcache.preload` caches preloaded files *forever* for all instances of the underlying PHP process.
That means, that hosting multiple websites on the same server might result in some unexpected behaviour.
Concrete example:
- you have a Symfony 3.2 App (which might be an endpoint of some type) and a Symfony 3.4 App (which might be your main application)
- both apps have a main Class called App that is in the same namespace (as it is usual, since the class name is unique to each project)
- depending on which app is loaded first, one or the other will work, since `opcache.preload` has no file based distinction of what class is used where and simply provides them to the user space
This is avoidable by simply not preloading user space classes or, if you work with FPM, by defining a pool for each app.
In order to optimize memory consumption, you might also use a common FPM Pool for all Symfony 3.4 Apps and preload the entire framework in there and simply not preload user space classes (which might be cached by opcache anyway but is slower, since it will be checked if the file has changed on every request).The optimization levels as of php 7.3 are the following:
#define ZEND_OPTIMIZER_PASS_1 (1<<0) /* CSE, STRING construction */
#define ZEND_OPTIMIZER_PASS_2 (1<<1) /* Constant conversion and jumps */
#define ZEND_OPTIMIZER_PASS_3 (1<<2) /* ++, +=, series of jumps */
#define ZEND_OPTIMIZER_PASS_4 (1<<3) /* INIT_FCALL_BY_NAME -> DO_FCALL */
#define ZEND_OPTIMIZER_PASS_5 (1<<4) /* CFG based optimization */
#define ZEND_OPTIMIZER_PASS_6 (1<<5) /* DFA based optimization */
#define ZEND_OPTIMIZER_PASS_7 (1<<6) /* CALL GRAPH optimization */
#define ZEND_OPTIMIZER_PASS_8 (1<<7) /* SCCP (constant propagation) */
#define ZEND_OPTIMIZER_PASS_9 (1<<8) /* TMP VAR usage */
#define ZEND_OPTIMIZER_PASS_10 (1<<9) /* NOP removal */
#define ZEND_OPTIMIZER_PASS_11 (1<<10) /* Merge equal constants */
#define ZEND_OPTIMIZER_PASS_12 (1<<11) /* Adjust used stack */
#define ZEND_OPTIMIZER_PASS_13 (1<<12) /* Remove unused variables */
#define ZEND_OPTIMIZER_PASS_14 (1<<13) /* DCE (dead code elimination) */
#define ZEND_OPTIMIZER_PASS_15 (1<<14) /* (unsafe) Collect constants */
#define ZEND_OPTIMIZER_PASS_16 (1<<15) /* Inline functions */
Source: https://lxr.room11.org/xref/php-src%40master/ext/opcache/Optimizer/zend_optimizer.hIt would appear as though the [opcache.enable] setting is indeed NOT PHP_INI_ALL.
For changing it within user.ini yields no effect when disabled at global level. user.ini is ignored for that setting.Despite the set of values for opcache.max_accelerated_files including the value 1048793, the maximum as stated is 1000000. If you select a number above 1000000 the value is set its default which is 10000.In the OPcache, notice that the memory used for interned (deduplicated) text strings comes out of the total OPcache shared memory storage size.
So, for example, if you have these settings:
opcache.memory_consumption=128
opcache.interned_strings_buffer=32
you have only left 96MB (MiB) for OPcache's bytecode cache.When opcache.use_cwd=0 include/require of relative paths from different directories will both resolve to the same (first) file.
Example dir structure:
app1
index.php
lib.php
app2
index.php
lib.php
both index.php(s):
include "lib.php";
app1/lib.php:
echo "app1";
app2/lib.php:
echo "app2";
both will echo "app1".