amnuts/opcache-gui

一个干净、高效且响应式的 Zend OPcache 界面,具有实时监控、过滤和失效文件的能力

资助包维护!
amnuts

安装数: 3,540,478

依赖项: 9

建议者: 0

安全性: 0

星标: 1,219

关注者: 48

分支: 198

开放问题: 8

3.5.5 2024-06-23 13:01 UTC

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_resetrefresh_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相关的所有统计信息(包括命中次数、使用的内存、空闲和浪费的内存等)。

Screenshot of the Overview tab

缓存文件

这里列出了当前缓存中的所有文件及其相关统计信息。

你可以过滤结果以帮助找到你正在寻找的特定脚本,并更改缓存文件的排序方式。从这里,你可以使单个文件或与你的搜索匹配的所有文件的缓存失效。

如果你根本不想显示文件列表,则可以使用allow_filelist配置选项;将其设置为false将完全抑制文件列表。

如果你想调整分页长度,可以使用per_page配置选项进行设置。

Screenshot of the Cached files list showing filtered results and pagination

忽略的文件

如果你已经设置了一个不希望缓存的文件列表,通过提供opcache.blacklist_filename的值,那么文件列表将在这个标签页中列出。

如果你没有在php.ini文件中提供该配置选项,则此标签页将不会显示。如果你将allow_filelist配置选项设置为false,则无论你的ini设置如何,此标签页都不会显示。

预加载文件

PHP 7.4引入了通过在php.ini文件中的opcache.preload设置来在服务器启动时预加载一组文件的能力。如果你已经设置了它,那么特定预加载的文件列表将在这个标签页中列出。

与忽略的文件一样,如果你没有提供ini设置,或者allow_filelist配置选项设置为false,则此标签页将不会显示。

重置缓存

你可以重置整个缓存,也可以强制使单个文件或文件组失效,以便它们再次被缓存。

可以通过使用配置选项allow_resetallow_invalidate来禁用重置功能。

实时更新

界面可以不时地对opcache进行轮询,以获取最新的外观。你可以通过配置选项refresh_time(以秒为单位)来更改此操作的频率。

当实时更新激活时,界面将根据需要自动更新所有值。

此外,如果你选择使任何文件失效或重置缓存,它将在不重新加载页面的情况下完成,因此你输入的搜索词或你导航到的页面不会被重置。如果实时更新未开启,则在任何失效使用时页面将重新加载。

自行构建

界面是基于这样一个原则:只需要一个文件就可以开始运行。为此,有一个模板文件、语言文件、jsx和css,它们都用于创建界面,并在构建过程中组合在一起。

这个构建过程允许你更改使用的语言、如何包含所需的第三方javascript库、外观和感觉,甚至如果你愿意,还可以是核心组件。

构建命令

要从仓库根目录运行构建过程,请运行命令php ./build/build.php(你需要已经安装了nodejsnpm)。一旦运行,你应该会看到类似于以下输出的内容:

🐢 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 选项,后跟 cloudflarejsdelivrunpkg。例如,如果您想使用 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 buildcomposer build-frenchcomposer build-spanish

如果您想创建语言文件,则 build/_languages/example.json 包含所有所需内容。它是一个简单的 JSON 结构,键是匹配 UI 中的英语版本,值是要转换成的版本——在示例文件中是空的。如果值是空的或索引不存在,则将使用英语版本。这使您能够根据需要替换部分或全部界面字符串。

要开始使用一门新语言,请将 example.json 复制到您想要添加的语言(如果该语言尚未存在)——例如,pt-br.jsonpirate.json。然后填写翻译到值中。完成后,使用 php ./build/build.php -l pt-brphp ./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 文件中删除 namespaceuse 语句来移除了一些PHP 8.2的警告。

版本 3.5.1
这仅仅是3.5.0,但是修正了版本标签,以使Packagist满意并纠正我的错误。🤦

版本 3.5.0
本版本改变了构建过程中包含JavaScript的方式。

  • 现在,-j/--local-js 标志将JavaScript嵌入到 index.php 文件中,而不是作为单独的文件。
  • 新增了 -r/--remote-js 选项,允许您决定获取第三方文件的位置(无论是本地获取还是添加为远程脚本链接),可选的选项有 cloudflarejsdelivrunpkg
  • 已将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_consumptionmax_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

只需从每个参数中删除 ? 即可。