2025年4月16日更新
果然随意配置是会出问题的,最近谷歌广告被限投广告的页面越来越多,而且修改配置文件LocalSettings.php还无法起效,原因就出在了opcache上(初步猜想是因为opcache.revalidate_freq = 0的缘故),具体情况可查看《都是缓存惹的祸——MediaWiki的配置文件不起作用》一文。
老实说,我并不确定以下的设置对网站性能提升到底有多大,完全就是按照官方文档操作了一遍而已。但有一点可以可定的是,它确实对网站是有“影响”的,具体放到另一篇文章中讲。
以下所使用的PHP 8.2扩展都是通过Debian 12的apt安装,各扩展的配置文件分别位于/etc/php/8.2/cli/conf.d目录下,比如20-apcu.ini为APCu的配置文件,10-opcache.ini为opcache的配置文件(数字前缀可能会有所不同)。
APCu
PHP APCu是一种用于缓存数据的扩展,它可以显著提高PHP应用程序的性能。它的前身是APC,是从APC剥离出来的用户数据缓存功能,而去掉了apc的opcode cache。
APC的主要作用有两点,一是缓存代码编译后产生的操作码来进行重复使用(opcode cache),二是提供用户数据缓存的能力,使用上类似于memcache和redis。它虽然不能缓存opcode,但可以配合Opcache使用。
具体的功能就不展开了,网上都有,而且原理的东西太复杂。只要记得它是加速PHP应用的理想选择就行。所以MediaWiki的性能提升文档中才会提到它。
在Debian 12中,如果需要安装,可以通过apt方式:
apt install php8.2-apcu
为了避免出错,最好记得加上版本号,虽然网上很多教程中让运行apt install php-apcu,但两者可能并不一样,所以保险起见还是用前者好了。
当然也可以通过pecl方式安装:
pecl install apcu
通过php -m | grep apcu来验证安装是否成功。
打开配置文件20-apcu.ini,可按如下内容修改:
[APCu]
extension="apcu.so"
apc.enabled=1
apc.shm_size=128M
apc.shm_segments=1
apc.ttl=0
apc.enable_cli=1
其中:
- apc.enabled:启用或禁用APCu。设置为1表示启用,设置为0表示禁用。默认值为1
- apc.shm_segments:为编译器缓存分配的共享内存段数量。默认为1
- apc.shm_size:共享内存大小。默认值为32M
- apc.ttl:缓存对象的生命周期(以秒为单位)。默认值为0,表示永不过期
- apc.enable_cli:是否启用APCu的CLI模式。1表示启用,0表示禁用。默认值为0
默认配置可能只有extension="apcu.so"这一条,但默认已经启用了APCu。
可以从https://github.com/krakjoe/apcu中下载apc.php文件并上传至服务器根目录下。效果如下:
opcache
OPCache是Zend官方出品的,开放自由的opcode缓存扩展,还具有代码优化功能,省去了每次加载和解析PHP脚本的开销。
OPCache缓存的机制主要是:将编译好的操作码放入共享内存,提供给其他进程访问。
在Debian 12中,如果需要安装,可以通过apt方式:
apt -y install php8.2-opcache
当然也可以通过pecl方式安装:
pecl install zendopcache
通过php -v命令查看安装结果。如果需要查看更多信息,也可以使用php -i | grep opcache命令。
打开配置文件10-opcache.ini,修改内容如下:
; 是否开启OPcache
opcache.enable=1
; 检查脚本文件的时间戳来判断缓存是否过期(生产环境强烈建议关闭)
opcache.validate_timestamps = 0
; 多长时间(以秒为单位)后重新检查是否需要更新缓存中的文件(生产环境强烈建议设为0)
opcache.revalidate_freq = 0
; 设置OPcache可用内存,单位为MB(默认值为64)
opcache.memory_consumption=256
; 最大缓存的文件数目
opcache.max_accelerated_files=10000
; 设置OPcache字符串缓存池的大小 (以 MB 为单位)(默认为8)
opcache.interned_strings_buffer=32
; 设置 Pcache可以缓存的PHP文件数量(最好在质数集合 {223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987, ...} 中找到的第一个大于等于设置值的质数)(默认为4000)
opcache.max_accelerated_files = 32532
; 控制在PHP进程终止时是否要尽快清除OpCache内的缓存(生产环境强烈建议开启)
opcache.fast_shutdown=1
; 是否保存文件/函数的注释
opcache.save_comments=0
; 是否开启JIT(PHP8中引入的功能)(强烈推荐开启)
opcache.jit=on
; 为编译 JIT 代码保留的共享内存量(值0表示禁用 JIT)
pcache.jit_buffer_size=64M
注意:如果将opcache.revalidate_freq设置为0,那么后期如果需要调试系统的时候切记要改回某个具体数值或暂时关闭opcache缓存功能以免因为缓存关系而无法得到正确结果(参见《MediaWiki中已登录用户显示图片时,出现“创建缩略图出错:文件丢失”错误》一文中的惨痛教训)。
设置完毕并加载配置:
systemctl reload php8.2-fpm
注意:尽量不要使用restart,而是使用reload平滑重启。
Memcached
Memcached是一个免费开源的、高性能的、具有分布式内存对象的缓存系统,它通过减轻数据库负载加速动态Web应用。
原理和功能这些就不多写了,网上也都有,而且这个缓存系统在WordPress中也会用到。
在Debian 12中,如果需要安装,可以通过apt方式:
apt -y install memcached
打开配置文件/etc/memcached.conf,常见的配置选项如下:
-m:指定内存分配大小(单位:MB),默认为64MB。-p:指定监听端口,默认是11211,最好是1024以上的端口。-l:指定监听地址,默认为本机,即127.0.0.1。-d:以守护进程方式运行。-u:运行Memcache的用户-c:最大运行的并发连接数,默认为1024
除了内存大小可能需要调整外,一般情况都保持默认好了。
运行以下命令,启动Memcached:
systemctl start memcached
检查运行情况:
systemctl status memcached
如果运行顺利,可以打开MediaWiki的配置文件LocalSettings.php,在其中加入:
$wgMainCacheType = CACHE_MEMCACHED;
$wgMemCachedServers = [ '127.0.0.1:11211' ];
至此,与MediaWiki有关的缓存都已安装并设置完毕。
文件缓存
MediaWiki有一个缓存条目的HTML代码的可选缓存方案。文件缓存只为匿名用户服务,他们看到的是相同的HTML渲染。 已登录用户不能用这个缓存,因为他们的页面包含了用户名、选择的皮肤等。
在配置文件LocalSettings.php中增加如下代码:
$wgUseFileCache = true; // 默认: false
$wgFileCacheDirectory = "$IP/images/cache"; // 默认值:"{$wgUploadDirectory}/cache",等于"$IP/images/cache"
$wgFileCacheDirectory也可以使用绝对路径。如果需要每天自动更新缓存,可以添加如下代码:
$wgCacheEpoch = date( "Ymd000000" ); #每天零点更新
缓存文件的修改时间会跟$wgCacheEpoch设定的时间进行比较,如果缓存文件比较旧或不存在,将继续分析和渲染,并保存结果以供将来使用。
如果希望进行压缩也可以设置以下代码:
$wgUseGzip = true;
该功能需要在PHP配置中启用zlib。
如果需要手动生成缓存文件,在MediaWiki根目录下运行以下命令:
php maintenance/run.php rebuildFileCache
1.40版本以下可以使用:
php maintenance/rebuildFileCache.php
运行如下图:
请注意,重定向页面不会被缓存,所以看到没缓存的也不用担心。
还有进一步的静态化方式,需要修改apache或nginx配置,让网站直接显示html页面,有机会测试的话单独开一篇文章。
参考资料:
https://www.mediawiki.org/wiki/Manual:Performance_tuning
https://learnku.com/articles/84314
https://www.mediawiki.org/wiki/Manual:File_cache/zh