amnuts / opcache-gui
一个干净、高效且响应式的 Zend OPcache 界面,具有实时监控、过滤和失效文件的能力
Requires
- php: >=7.1.0
- ext-json: *
- ext-zend-opcache: *
README
一个干净、响应式的 Zend OPcache 信息界面,显示统计数据、设置和缓存文件,并提供信息实时更新。
此界面使用 ReactJS 和 Axios,适用于现代浏览器,并要求至少 PHP 7.1。
许可证
MIT: http://acollington.mit-license.org/
赞助此项目
如果您能够并且愿意以某种方式赞助此项目,那么这将非常棒 ❤️。您可以通过 GitHub Sponsorship 页面进行。
或者,如果您只想通过 X (也称为 Twitter) 告诉我您在使用它,那么这也将是件很棒的事情!(还有人怀念卡片软件吗?)
使用 opcache-gui
安装
开始使用此界面的方式有两种
复制/克隆此存储库
开始使用 opcache-gui 最简单的方法是克隆此存储库,或者将 index.php
文件复制/粘贴/下载到您的 Web 服务器可以加载的位置。然后,将浏览器指向该位置,例如 https://www.example.com/opcache/index.php
。
通过 Composer 安装
您可以通过运行命令 composer require amnuts/opcache-gui
来使用 Composer 包含文件。
一旦在您的 vendor
目录中,您可以使用多种方式使用此界面。例如,如果您使用的是像 Symfony 或 Laravel 这样的框架,您可以将 opcache-gui 加载到 Controller
中。您在选择框架时设置的设置需求可能会有所不同,因此在此说明书中详细说明如何进行设置是不可能的……但我相信您能找出解决办法!
用于类的命名空间是 Amnuts\Opcache
,因此一旦依赖项存在于您的 autoload.php
中,您就可以使用 \Amnuts\Opcache\Service
类。例如,您可以进行如下操作:
<?php use Amnuts\Opcache\Service; // assuming location of: /var/www/html/opcache.php require_once __DIR__ . '/../vendor/autoload.php'; // specify any options you want different from the defaults, if any $options = [/* ... */]; // setup the class and pass in your options, if you have any $opcache = (new Service($options))->handle();
然后您可以使用任何视图来创建想要显示的 opcache 详细信息。尽管此存储库中提供了一个基于 React 的相当不错的界面。
或者直接包含 vendor/amnuts/opcache-gui/index.php
,这将产生与复制/粘贴 index.php
到任何地方相同的结果。
<?php // assuming location of: /var/www/html/opcache.php require_once __DIR__ . '/../vendor/amnuts/opcache-gui/index.php';
您甚至可以简单地创建一个指向 vendor
目录中的 index.php
的符号链接
ln -s /var/www/vendor/amnuts/opcache-gui/index.php /var/www/html/opcache.php
基本上,有足够多的方法可以让界面运行起来 - 选择适合您需求的方法。
配置
界面的默认配置如下所示
$options = [ 'allow_filelist' => true, // show/hide the files tab 'allow_invalidate' => true, // give a link to invalidate files 'allow_reset' => true, // give option to reset the whole cache 'allow_realtime' => true, // give option to enable/disable real-time updates 'refresh_time' => 5, // how often the data will refresh, in seconds 'size_precision' => 2, // Digits after decimal point 'size_space' => false, // have '1MB' or '1 MB' when showing sizes 'charts' => true, // show gauge chart or just big numbers 'debounce_rate' => 250, // milliseconds after key press to send keyup event when filtering 'per_page' => 200, // How many results per page to show in the file list, false for no pagination 'cookie_name' => 'opcachegui', // name of cookie 'cookie_ttl' => 365, // days to store cookie 'datetime_format' => 'D, d M Y H:i:s O', // Show datetime in this format 'highlight' => [ 'memory' => true, // show the memory chart/big number 'hits' => true, // show the hit rate chart/big number 'keys' => true, // show the keys used chart/big number 'jit' => true // show the jit buffer chart/big number ], // json structure of all text strings used, or null for default 'language_pack' => null ];
如果您想更改任何默认设置,您只需传入您想要更改的,如果其他保持不变。只需修改 index.php
脚本顶部(或以不同的方式将数组传递给 Service
类)。
例如,以下将仅更改 allow_reset
和 refresh_time
的值,但保持其他一切默认不变
$opcache = (new Service([ 'refresh_time' => 2, 'allow_reset' => false ]))->handle();
或者这个示例,让标签页带有轻微的“海盗”风格
$opcache = (new Service([ 'language_pack' => <<<EOJSON { "Overview": "Crows nest", "Cached": "Thar Booty", "Ignored": "The Black Spot", "Preloaded": "Ready an' waitin', Cap'n", "Reset cache": "Be gone, yer scurvy dogs!", "Enable real-time update": "Keep a weathered eye", "Disable real-time update": "Avert yer eyes, sea dog!" } EOJSON ]))->handle();
界面
概览
概览将显示所有核心信息。从这里,你可以看到你在哪个主机和平台上运行,你正在使用哪个版本的OPcache,它上次是在何时重置的,可用的函数和指令(包含指向php.net手册的链接),以及与OPcache相关的所有统计信息(包括命中次数、使用的内存、空闲和浪费的内存等)。
缓存文件
这里列出了当前缓存中的所有文件及其相关统计信息。
你可以过滤结果以帮助找到你正在寻找的特定脚本,并更改缓存文件的排序方式。从这里,你可以使单个文件或与你的搜索匹配的所有文件的缓存失效。
如果你根本不想显示文件列表,则可以使用allow_filelist
配置选项;将其设置为false
将完全抑制文件列表。
如果你想调整分页长度,可以使用per_page
配置选项进行设置。
忽略的文件
如果你已经设置了一个不希望缓存的文件列表,通过提供opcache.blacklist_filename
的值,那么文件列表将在这个标签页中列出。
如果你没有在php.ini
文件中提供该配置选项,则此标签页将不会显示。如果你将allow_filelist
配置选项设置为false
,则无论你的ini设置如何,此标签页都不会显示。
预加载文件
PHP 7.4引入了通过在php.ini
文件中的opcache.preload
设置来在服务器启动时预加载一组文件的能力。如果你已经设置了它,那么特定预加载的文件列表将在这个标签页中列出。
与忽略的文件一样,如果你没有提供ini设置,或者allow_filelist
配置选项设置为false
,则此标签页将不会显示。
重置缓存
你可以重置整个缓存,也可以强制使单个文件或文件组失效,以便它们再次被缓存。
可以通过使用配置选项allow_reset
和allow_invalidate
来禁用重置功能。
实时更新
界面可以不时地对opcache进行轮询,以获取最新的外观。你可以通过配置选项refresh_time
(以秒为单位)来更改此操作的频率。
当实时更新激活时,界面将根据需要自动更新所有值。
此外,如果你选择使任何文件失效或重置缓存,它将在不重新加载页面的情况下完成,因此你输入的搜索词或你导航到的页面不会被重置。如果实时更新未开启,则在任何失效使用时页面将重新加载。
自行构建
界面是基于这样一个原则:只需要一个文件就可以开始运行。为此,有一个模板文件、语言文件、jsx和css,它们都用于创建界面,并在构建过程中组合在一起。
这个构建过程允许你更改使用的语言、如何包含所需的第三方javascript库、外观和感觉,甚至如果你愿意,还可以是核心组件。
构建命令
要从仓库根目录运行构建过程,请运行命令php ./build/build.php
(你需要已经安装了nodejs
和npm
)。一旦运行,你应该会看到类似于以下输出的内容:
🐢 Installing node modules
🏗️ Building js and css
🚀 Creating single build file
🔗 Using remote js links from 'cloudflare'
💯 Done!
构建脚本只需要安装一次 node_modules
,所以在后续构建中应该会快得多!
构建过程将在 build/interface.css
创建编译后的 CSS 文件,界面 JavaScript 将在 build/interface.js
中。如果您愿意,您可以在自己的框架和模板系统中使用这两个文件。
样式
界面的 CSS 在 build/_frontend/interface.scss
文件中。如果您想更改颜色或格式,请在那里进行更改。
如果您对 scss 文件进行了任何更改,则需要运行构建脚本才能看到更改。
布局
如果您想更改界面本身,请更新 build/_frontend/interface.jsx
文件——它基本上是一组 ReactJS 组件。您可以在这里更改小部件布局、文件列表的工作方式、分页等。
在此处进行更改后,请再次运行构建脚本。
JavaScript
在构建过程中使用的包装 PHP 模板,它将各种数据传递到 ReactJS 侧,位于 build/template.phps
。如果您想更新使用的 ReactJS 版本,或更改包装 HTML 的结构(例如,您想向 ReactJS 侧传递额外的数据),则此文件是您想要更新的文件。
界面需要一些第三方 JavaScript 文件才能正确运行。您可以选择更改这些文件的位置(在 CloudFare、JSDelivr 和 Unpkg 之间),或者可以选择完全本地化和内联 JavaScript(例如,您有 CSP 策略并已将远程 URL 加入白名单)。
要更改第三方资源的位置,请使用 -r
或 --remote-js
选项,后跟 cloudflare
、jsdelivr
或 unpkg
。例如,如果您想使用 jsdelivr,则可以像这样运行构建命令:php ./build/build.php -r jsdelivr
。默认值为 cloudflare
。
如果您想将 JavaScript 内联化,则可以在构建时使用 -j
或 --local-js
标志,例如 php ./build/build.php -j
。这将获取远程脚本文件并将 JavaScript 内嵌到主 index.php
文件中。如果您想再次使用远程文件构建,请不带标志重新运行命令。如果提供了,文件获取将考虑您的 -r
选项。
语言
有句老话说,“如果你懂一门以上的语言,你就是多语种的人,如果你不懂,你就是英国人。”这不仅是对英国人对其他语言的蔑视,也解释了为什么 UI 到目前为止只使用英语——因为我,尽管有罪,是英国人。
然而,现在可以构建支持不同语言的界面。目前,由于贡献者的帮助,法语和西班牙语也得到了支持。如果有人想贡献额外的语言包,请提交 PR!
如果语言包在 build/_languages/
目录中,则可以使用它与 -l
或 --lang
标志一起使用。例如,如果有一个 fr.json
语言包,则可以使用 php ./build/build.php -l fr
来使用该语言进行构建。
已添加一些 composer 脚本以帮助构建。它们是 composer build
、composer build-french
和 composer build-spanish
。
如果您想创建语言文件,则 build/_languages/example.json
包含所有所需内容。它是一个简单的 JSON 结构,键是匹配 UI 中的英语版本,值是要转换成的版本——在示例文件中是空的。如果值是空的或索引不存在,则将使用英语版本。这使您能够根据需要替换部分或全部界面字符串。
要开始使用一门新语言,请将 example.json
复制到您想要添加的语言(如果该语言尚未存在)——例如,pt-br.json
或 pirate.json
。然后填写翻译到值中。完成后,使用 php ./build/build.php -l pt-br
或 php ./build/build.php -l pirate
重新构建。
版本发布
版本 3.5.5
感谢 @cvc90(PR#110)添加了西班牙语翻译
版本 3.5.4
改进了对JIT启用或禁用情况的处理。现在还会显示为什么即使打开了设置,JIT可能仍然被禁用。界面还会在JIT被禁用的情况下正确地禁用图表和内存统计信息。
版本 3.5.3
解决了 php.net 上 opcache 文档中链接的一些不一致问题。
版本 3.5.2
通过在捆绑的 index.php
文件中删除 namespace
和 use
语句来移除了一些PHP 8.2的警告。
版本 3.5.1
这仅仅是3.5.0,但是修正了版本标签,以使Packagist满意并纠正我的错误。🤦
版本 3.5.0
本版本改变了构建过程中包含JavaScript的方式。
- 现在,
-j
/--local-js
标志将JavaScript嵌入到index.php
文件中,而不是作为单独的文件。 - 新增了
-r
/--remote-js
选项,允许您决定获取第三方文件的位置(无论是本地获取还是添加为远程脚本链接),可选的选项有cloudflare
、jsdelivr
和unpkg
。 - 已将CloudFlare设置为远程js链接的默认值。
- 添加了来自 @M-Falken 的PR#94。
- 添加了来自 @firassziedan 的PR#95。
版本 3.4.0
本版本添加了一些关于缓存中文件的信息,并通过配置和构建脚本提供了一些额外的配置选项。
- 添加了新的
datetime_format
配置选项,用于灵活地格式化日期/时间值。 - 将缓存文件的
modified
日期/时间添加到输出中(文件被添加或更新时)。 - 现在可以使用本地URL而不是远程URL构建
index.php
文件中的js文件。 - 添加了来自 @Stevemoretz 的PR#83。
- 添加了使用不同语言构建界面的能力。如果您需要某种语言,但尚未提供,请提交一个PR!
- 添加了来自 @bbalet 的法语语言包(PR#91)。
版本 3.3.1
只是一些小的调整。
- 对JIT值添加了更多的解释。
- 将日期函数替换为 \DateTime 和相关类。
- 更新了README,包括故障排除和赞助信息(并精炼了标题级别)。
版本 3.3.0
主要添加了PHP 8的JIT信息。
- 添加了JIT缓冲图(可选关闭)。
- 将JIT信息添加到内存使用面板中。
- 改进了在指令中显示的JIT信息。
- 修复了一个长期存在的界面错误,该错误允许您在失效选项为
false
的情况下看到“失效所有”链接。
如果您要启用JIT,必须为opcache.jit_buffer_size ini设置提供一个值,否则默认禁用。
如果您不是使用PHP 8,界面将进行补偿,不会显示额外的JIT信息。
版本 3.2.1
这是一个小型的维护版本。
- 放回了“飞船操作符”,这样PHP8就不会给出弃用警告(可能是在之前的提交中意外删除的)。
- 在参数方面对axios的使用进行了更精细的优化。
- 对opcache优化级别进行了一些额外的格式化。
版本 3.2.0
将ReactJS更新到最新版本,并使用最小化版本,并在没有分页的情况下对排序选项进行了轻微的改进。
版本 3.1.0
添加了多种方式对缓存的文件列表进行排序的能力。
版本 3.0.1
这是一个小更新,将根据您所使用的内容使用 http 或 https 获取 JavaScript 库。
版本 3.0.0
尽管界面看起来基本相同,但在底层进行了完全重写!一些更显著的变化包括
- 为基本服务类添加了新的命名空间,以确保与 composer 兼容
- 现在可以分页显示缓存的文件列表,使其更容易渲染大型文件列表
- 预加载的任何脚本都将显示在标签页中
- 忽略的任何文件路径将显示在标签页中
- 现在可以一次性使所有匹配搜索条件的文件失效
- jQuery 已被移除;整个界面现在使用 ReactJS 和更现代的 JavaScript(因此只支持现代浏览器)
- 现在使用 SASS 来编写 CSS,这使得更改界面颜色变得更加容易
- 现在使用 SVG 来显示任何图标或仪表图
- 当激活“实时”时,界面变得更加响应
- 添加了构建脚本以编译 ReactJS 和 SASS,并将它们放入单个简单的主界面脚本中
版本 2.5.4
优化了初始 CSS 命名空间的放置,以便在 Moodle 插件和其他系统中运行良好。还调整了一些 CSS。
版本 2.5.3
已添加 CSS 类名称,并更新了样式规则以使用它们。
版本 2.5.2
针对 v2.5.1 中发布的优化_level 值的修复补丁。
版本 2.5.1
修复了一些错误,并改进了优化级别细节。
- optimization_level 现在显示将要执行优化的级别,而不是一个抽象的数字
- 修复了问题 #43
- 修复了问题 #44
版本 2.5.0
添加了一个新的突出显示图表,以显示缓存的键百分比,并提供选项来开启/关闭单个突出显示图表。
版本 2.4.1
主要是错误修复
memory_consumption
和max_file_size
配置设置现在显示为可读大小- 包含了四个缺失的指令
- 改进了在
file_cache_only
激活时的处理 - cache-control 标头设置为不缓存页面
版本 2.4.0
添加了用于存储实时状态的 cookie 存储,允许在加载时激活实时。cookie 名称和 TTL 长度可以在配置中调整
版本 2.3.0
添加了关于内联字符串的信息和 PHP 5.4 兼容性
版本 2.2.2
在过滤文件列表时引入了优化
版本 2.2.1
仪表现在随着实时脉冲更新,并修复了一些舍入问题
版本 2.2.0
提供了开启/关闭文件列表的能力(默认为开启)
版本 2.1.0
现在以更简单的方式配置一些选项,无论是轮询时间、切换重置缓存的选项、实时更新等。它还允许您将大数值(内存使用率和命中率)显示为仪表图,而不是大数字。
版本 2.0.0
引入了 React.js 的使用,提供了在实时(默认每五秒)无缝更新更多信息的能力 - 因此现在文件以及概览都会刷新。外观也进行了更新,去除了渐变,采用更平的设计风格。代码总体上也进行了重写。
GUI 的发布可在以下地址找到
https://github.com/amnuts/opcache-gui/releases/
故障排除
PHP-FPM 的使用
许多人质疑 opcache-gui 是否在他们自己的 PHP-FPM 实例上运行,因为显示的文件似乎不是所有缓存的文件,这与 Apache 显示的不同。
本质上,这是预期的行为。多亏了贡献者 Michalng 的一条精彩评论,以下解释应该涵盖了这些差异
界面只能显示它对其自身 OPcache 实例的 OPcache 使用情况,因此当它通过 Apache 和 mod_php 访问时,它只能看到那个 Apache 网络服务器 OPcache 实例的 OPcache 使用情况。当它使用经典 CGI 访问时,它只能看到自己被缓存为一个新的 PHP 和 OPcache 实例,在这种情况下,OPcache 本身通常没有意义。
为了能够监控和管理所有网络应用的 OPcache,所有应用都需要使用相同的 FastCGI,即 PHP-FPM 实例。
在 Apache 的情况下,通常需要主动配置它,以便不使用其内部的 mod_php,而是通过 mod_proxy_fcgi 将 PHP 处理器请求发送到共享的 PHP-FPM 服务器,这还需要使用事件 MPM。这通常是现在的首选配置,尤其是对于高流量网站。这是因为每个通过 MPM prefork + mod_php 到来的请求都会创建一个自己的子进程,这需要额外的时间和内存,而使用事件 MPM 和专门的 PHP-FPM 服务器时,Apache 和 PHP 端通常会使用一个已经等待的处理线程,这几乎不需要额外的内存或时间来生成进程。
与 PHP 7.0 兼容
脚本需要 PHP 7.1 或更高版本。我没有降低代码以使其与版本 7.0 兼容的诱惑,并希望大多数人现在都已经升级了。但我也真的很感激,有时候人们没有能力改变他们使用的 PHP 版本,因为这超出了他们的控制。所以如果你是不幸者之一,你可以在 index.php
(或 Service.php
)中进行以下更改,并运行构建脚本。对于以下行
public function getOption(?string $name = null)
public function getData(?string $section = null, ?string $property = null)
public function resetCache(?string $file = null): bool
只需从每个参数中删除 ?
即可。