Debian系统下的PHP缓存机制主要分为字节码缓存(优化脚本执行)和数据缓存(减少数据库/IO访问)两类,通过内置扩展或第三方工具实现,旨在提升PHP应用性能、降低服务器负载。
OPcache是PHP 5.5+内置的字节码缓存扩展,核心作用是将PHP脚本编译后的**opcode(操作码)**缓存到内存中,避免每次请求都重新解析、编译脚本,显著减少CPU占用和脚本执行时间。
sudo apt update
sudo apt install php-opcache
/etc/php/8.1/apache2/php.ini或/etc/php/8.1/cli/php.ini),添加/修改以下参数:[opcache]
zend_extension=opcache.so # 启用扩展
opcache.enable=1 # 开启字节码缓存
opcache.memory_consumption=128 # 缓存内存大小(MB),根据服务器调整
opcache.interned_strings_buffer=8 # 内部字符串缓存大小(MB)
opcache.max_accelerated_files=4000 # 最大缓存文件数
opcache.revalidate_freq=60 # 检查脚本更新频率(秒),0表示每次请求都检查
opcache.fast_shutdown=1 # 快速关闭,提升脚本结束时的清理效率
phpinfo.php文件,查看“OPcache” section是否显示启用状态。适合所有PHP应用(尤其是动态脚本多的站点),能有效提升PHP脚本执行效率,是Debian PHP环境的基础缓存优化工具。
APCu(Alternative PHP Cache User)是OPcache的“用户空间补充”,专注于用户级数据缓存(如数据库查询结果、对象、变量等),数据仅存储在内存中,重启服务器后丢失。
sudo apt install php-apcu
[apcu]
extension=apcu.so # 启用扩展
apcu.enable_cli=1 # 允许命令行使用(开发调试用)
apcu.shm_size=32M # 共享内存大小(MB)
apcu.ttl=7200 # 数据过期时间(秒,默认0表示永不过期)
<?php
// 存储数据到缓存(有效期1小时)
if (!apcu_exists('user_data_123')) {
$userData = fetchUserDataFromDB(123); // 模拟数据库查询
apcu_store('user_data_123', $userData, 3600);
} else {
$userData = apcu_fetch('user_data_123'); // 从缓存读取
}
echo $userData;
?>
适合缓存频繁访问的小数据(如用户会话、热点数据、配置信息),减少数据库查询次数,提升应用响应速度。
当应用需要跨服务器共享缓存(如分布式系统)或持久化缓存(避免服务器重启丢失数据)时,Redis和Memcached是首选。两者均为内存缓存系统,但Redis支持更丰富的数据结构(如哈希、列表、集合),且具备持久化功能。
sudo apt install redis-server php-redis
sudo systemctl enable --now redis-server
<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379); // 连接本地Redis
$cacheKey = 'product_list';
if (!$redis->exists($cacheKey)) {
$productList = fetchProductListFromDB(); // 模拟数据库查询
$redis->set($cacheKey, $productList, 3600); // 缓存1小时
} else {
$productList = $redis->get($cacheKey); // 从缓存读取
}
print_r($productList);
?>
sudo apt install memcached php-memcached
sudo systemctl enable --now memcached
<?php
$memcached = new Memcached();
$memcached->addServer('127.0.0.1', 11211); // 连接本地Memcached
$cacheKey = 'news_feed';
if (!$memcached->get($cacheKey)) {
$newsFeed = fetchNewsFeedFromDB(); // 模拟数据库查询
$memcached->set($cacheKey, $newsFeed, 1800); // 缓存30分钟
} else {
$newsFeed = $memcached->get($cacheKey); // 从缓存读取
}
echo $newsFeed;
?>
两者均需单独部署服务器,适合中型及以上规模的分布式PHP应用。
memory_consumption、Redis的maxmemory),避免内存溢出。opcache_get_status()、redis-cli info、memcached-tool)监控缓存命中率、内存使用情况,及时优化配置。