php - Opcache 自行清除并中断代码执行
问题描述
我有一个 Magento 2 商店,但这似乎是一个 PHP 问题,启用了 opcache,有时 opcache 似乎会自行清除,我最终得到一个商店,因为某些操作无法执行。有时当我手动清除 opcache 时,我也会收到错误,并且存储虽然没有完全脱机,但某些操作无法执行,具体取决于错误。有时我无法将产品添加到购物车或下订单。错误类似于以下错误:
[2020-06-09 18:20:38] main.CRITICAL: Warning: preg_match(): Compilation failed: unmatched parentheses at offset 36 in /home/store/public_html/vendor/magento/zendframework1/library/Zend/Locale/Format.php on line 527 {"exception":"[object] (Exception(code: 0): Warning: preg_match(): Compilation failed: unmatched parentheses at offset 36 in /home/store/public_html/vendor/magento/zendframework1/library/Zend/Locale/Format.php on line 527 at /home/store/public_html/vendor/magento/framework/App/ErrorHandler.php:61)"} []
或者
"Fatal Error: 'Cannot declare class Magento\\Customer\\Api\\CustomerRepositoryInterface\\Proxy, because the name is already in use' in '\/home\/store\/public_html\/generated\/code\/Magento\/Customer\/Api\/CustomerRepositoryInterface\/Proxy.php' on line 7"
这是我的 opcache 配置:
; Enable Zend OPcache extension module
zend_extension=opcache.so
; Determines if Zend OPCache is enabled
opcache.enable=1
; Determines if Zend OPCache is enabled for the CLI version of PHP
opcache.enable_cli=1
; The OPcache shared memory storage size.
opcache.memory_consumption=2048
; The amount of memory for interned strings in Mbytes.
opcache.interned_strings_buffer=16
; The maximum number of keys (scripts) in the OPcache hash table.
; Only numbers between 200 and 100000 are allowed.
opcache.max_accelerated_files=100000
; The maximum percentage of "wasted" memory until a restart is scheduled.
;opcache.max_wasted_percentage=5
; When this directive is enabled, the OPcache appends the current working
; directory to the script key, thus eliminating possible collisions between
; files with the same name (basename). Disabling the directive improves
; performance, but may break existing applications.
;opcache.use_cwd=1
; When disabled, you must reset the OPcache manually or restart the
; webserver for changes to the filesystem to take effect.
opcache.validate_timestamps=0
; How often (in seconds) to check file timestamps for changes to the shared
; memory storage allocation. ("1" means validate once per second, but only
; once per request. "0" means always validate)
;opcache.revalidate_freq=2
; Enables or disables file search in include_path optimization
;opcache.revalidate_path=0
; If disabled, all PHPDoc comments are dropped from the code to reduce the
; size of the optimized code.
opcache.save_comments=1
; If disabled, PHPDoc comments are not loaded from SHM, so "Doc Comments"
; may be always stored (save_comments=1), but not loaded by applications
; that don't need them anyway.
;opcache.load_comments=1
; If enabled, a fast shutdown sequence is used for the accelerated code
opcache.fast_shutdown=1
; Allow file existence override (file_exists, etc.) performance feature.
;opcache.enable_file_override=0
; A bitmask, where each bit enables or disables the appropriate OPcache
; passes
;opcache.optimization_level=0xffffffff
;opcache.inherited_hack=1
;opcache.dups_fix=0
; The location of the OPcache blacklist file (wildcards allowed).
; Each OPcache blacklist file is a text file that holds the names of files
; that should not be accelerated. The file format is to add each filename
; to a new line. The filename may be a full path or just a file prefix
; (i.e., /var/www/x blacklists all the files and directories in /var/www
; that start with 'x'). Line starting with a ; are ignored (comments).
;opcache.blacklist_filename=/etc/php.d/opcache*.blacklist
opcache.blacklist_filename=/home/store/opcache.excluded.txt
; Allows exclusion of large files from being cached. By default all files
; are cached.
;opcache.max_file_size=0
; Check the cache checksum each N requests.
; The default value of "0" means that the checks are disabled.
opcache.consistency_checks=0
; How long to wait (in seconds) for a scheduled restart to begin if the cache
; is not being accessed.
;opcache.force_restart_timeout=180
; OPcache error_log file name. Empty string assumes "stderr".
;opcache.error_log=
; All OPcache errors go to the Web server log.
; By default, only fatal errors (level 0) or errors (level 1) are logged.
; You can also enable warnings (level 2), info messages (level 3) or
; debug messages (level 4).
;opcache.log_verbosity_level=1
; Preferred Shared Memory back-end. Leave empty and let the system decide.
;opcache.preferred_memory_model=
; Protect the shared memory from unexpected writing during script execution.
; Useful for internal debugging only.
;opcache.protect_memory=0
; Allows calling OPcache API functions only from PHP scripts which path is
; started from specified string. The default "" means no restriction
;opcache.restrict_api=
; Mapping base of shared memory segments (for Windows only). All the PHP
; processes have to map shared memory into the same address space. This
; directive allows to manually fix the "Unable to reattach to base address"
; errors.
;opcache.mmap_base=
这是我的opcache_get_status(false)
功能的结果:
Array
(
[opcache_enabled] => 1
[cache_full] =>
[restart_pending] =>
[restart_in_progress] =>
[memory_usage] => Array
(
[used_memory] => 152442416
[free_memory] => 1995041232
[wasted_memory] => 0
[current_wasted_percentage] => 0
)
[interned_strings_usage] => Array
(
[buffer_size] => 16777216
[used_memory] => 12353632
[free_memory] => 4423584
[number_of_strings] => 176637
)
[opcache_statistics] => Array
(
[num_cached_scripts] => 6796
[num_cached_keys] => 13127
[max_cached_keys] => 130987
[hits] => 15440094
[start_time] => 1590744538
[last_restart_time] => 1591785370
[oom_restarts] => 0
[hash_restarts] => 0
[manual_restarts] => 14
[misses] => 8549
[blacklist_misses] => 15011
[blacklist_miss_ratio] => 0.097072787583064
[opcache_hit_rate] => 99.847642736962
)
)
在我的 opcache 排除列表中是/home/store/public_html/pub/
目录
自动 opcache 代码刷新似乎每隔一周发生一次,但不是在一天中的特定日期或时间发生。
我在 PHP 日志中没有关于 opcache 任何错误的日志
为什么 opcache 在拥有大量可用空间和内存时会自行清除,为什么清除 opcache 可能会导致缓存代码损坏?
解决方案
推荐阅读
- python - Python - 请求 - BeatuifulSoup - 在本地运行脚本时找到 HTML 但在 VPS 上运行时找不到
- azure - Azure AD - 联合应用程序 SAML
- javascript - 从 MySQL 到 html 表的数组记录 (json)
- kubernetes - Micronaut 2.0.0 - 无法在 kubernetes 上调用另一个服务
- nginx - 无法在子域上将 YouTrack 与 nginx 一起使用
- python - TF 迁移学习:google.protobuf.text_format.ParseError: 162:19
- javascript - 如何在 Vue.js 中使用异步等待?
- ios - 如何从 iOS Objective-C 中 WKWebView 中加载的 URL 获取 NSData?
- rust - 为什么使用 actix-lua 的测试线程会按预期出现恐慌,但测试永远不会完成?
- reactjs - 在调用另一个动作创建者之前等待动作创建者完成 - Redux thunk