PHP 中实现函数缓存的方法
函数缓存可以显著提高 PHP 应用的性能,特别是对于那些计算密集型或频繁调用的函数。以下是几种在 PHP 中实现函数缓存的方法:
1. 使用数组缓存
最简单的缓存方式是使用静态变量或全局数组:
function expensiveOperation($param) {
static $cache = [];
if (isset($cache[$param])) {
return $cache[$param];
}
// 执行耗时操作
$result = // ... 复杂计算 ...
$cache[$param] = $result;
return $result;
}
2. 使用 APCu 扩展
APCu 是 PHP 的用户缓存系统,适合单服务器环境:
function expensiveOperation($param) {
$cacheKey = 'expensive_op_' . md5($param);
if (apcu_exists($cacheKey)) {
return apcu_fetch($cacheKey);
}
// 执行耗时操作
$result = // ... 复杂计算 ...
apcu_store($cacheKey, $result, 3600); // 缓存1小时
return $result;
}
3. 使用 Memcached 或 Redis
对于分布式环境,可以使用 Memcached 或 Redis:
$memcached = new Memcached();
$memcached->addServer('localhost', 11211);
function expensiveOperation($param) {
global $memcached;
$cacheKey = 'expensive_op_' . md5($param);
if ($result = $memcached->get($cacheKey)) {
return $result;
}
// 执行耗时操作
$result = // ... 复杂计算 ...
$memcached->set($cacheKey, $result, 3600); // 缓存1小时
return $result;
}
4. 使用文件缓存
对于简单的文件系统缓存:
function expensiveOperation($param) {
$cacheFile = '/tmp/cache_' . md5($param) . '.php';
if (file_exists($cacheFile) && (time() - filemtime($cacheFile) < 3600) {
return unserialize(file_get_contents($cacheFile));
}
// 执行耗时操作
$result = // ... 复杂计算 ...
file_put_contents($cacheFile, serialize($result));
return $result;
}
5. 使用装饰器模式
创建一个通用的缓存装饰器:
function cached($callable, $ttl = 3600) {
return function(...$args) use ($callable, $ttl) {
$cacheKey = md5(serialize([$callable, $args]));
if (apcu_exists($cacheKey)) {
return apcu_fetch($cacheKey);
}
$result = call_user_func_array($callable, $args);
apcu_store($cacheKey, $result, $ttl);
return $result;
};
}
// 使用方式
$cachedFunction = cached('expensiveOperation');
$result = $cachedFunction($param);
选择哪种缓存方法取决于你的应用场景、性能需求和基础设施。对于简单的单机应用,APCu 或静态变量通常足够;对于分布式系统,则需要考虑 Memcached 或 Redis。