本文目录导读:

在PHP项目中使用Memcached主要涉及安装扩展、连接服务器、执行缓存操作等步骤,以下是详细的使用指南:
安装 Memcached 扩展
在 Linux 上安装
# Ubuntu/Debian sudo apt-get install memcached php-memcached # CentOS/RHEL sudo yum install memcached php-pecl-memcached
在 macOS 上安装
brew install memcached brew install php-memcached
验证安装
<?php
phpinfo(); // 搜索 memcached
// 或
echo extension_loaded('memcached') ? '已加载' : '未加载';
连接 Memcached 服务器
基本连接
<?php
$memcached = new Memcached();
// 添加服务器(地址,端口,权重)
$memcached->addServer('localhost', 11211);
// 或者添加多个服务器实现分布式
$memcached->addServer('server1.example.com', 11211, 33); // 权重33%
$memcached->addServer('server2.example.com', 11211, 67); // 权重67%
连接池配置
<?php
$memcached = new Memcached();
// 配置持久化连接
$memcached->setOption(Memcached::OPT_PERSISTENT, true);
// 配置连接超时
$memcached->setOption(Memcached::OPT_CONNECT_TIMEOUT, 1000);
// 配置压缩
$memcached->setOption(Memcached::OPT_COMPRESSION, true);
$memcached->addServer('localhost', 11211);
基本缓存操作
存储数据
<?php
// set(key, value, expiration_time)
// 过期时间:0表示永不过期,单位秒
// 存储简单数据
$memcached->set('user_name', '张三', 3600); // 1小时过期
// 存储数组
$userData = [
'id' => 1,
'name' => '张三',
'email' => 'zhangsan@example.com'
];
$memcached->set('user_1', $userData, 86400); // 24小时过期
// 批量存储
$items = [
'key1' => 'value1',
'key2' => 'value2',
'key3' => 'value3'
];
$memcached->setMulti($items, 3600);
获取数据
<?php
// 获取单个
$userName = $memcached->get('user_name');
echo $userName; // 输出:张三
// 获取多个
$keys = ['key1', 'key2', 'key3'];
$values = $memcached->getMulti($keys);
print_r($values);
// 检查是否存在
if ($memcached->get('user_1') !== false) {
echo "缓存存在";
} else {
echo "缓存不存在";
}
删除数据
<?php
// 删除单个
$memcached->delete('user_name');
// 删除多个
$memcached->deleteMulti(['key1', 'key2']);
// 清空所有缓存
$memcached->flush();
高级操作
递增/递减操作
<?php
// 计数器应用
$memcached->set('page_views', 1000, 0); // 永不过期
// 递增
$newCount = $memcached->increment('page_views', 1);
echo "当前访问量:".$newCount;
// 递减
$memcached->decrement('page_views', 1);
CAS(检查并设置)操作
<?php
// 用于解决并发问题
$casToken = null;
$value = $memcached->get('counter', null, $casToken);
if ($value !== false) {
// 只有在值未被其他进程修改时才更新
$memcached->cas($casToken, 'counter', $value + 1, 0);
}
实际应用示例
数据库查询缓存
<?php
class UserService {
private $memcached;
private $db;
public function __construct() {
$this->memcached = new Memcached();
$this->memcached->addServer('localhost', 11211);
$this->db = new PDO('mysql:host=localhost;dbname=test', 'user', 'password');
}
public function getUser($userId) {
$cacheKey = "user_{$userId}";
// 尝试从缓存获取
$user = $this->memcached->get($cacheKey);
if ($user === false) {
// 缓存未命中,从数据库查询
$stmt = $this->db->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$userId]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
// 存入缓存,设置1小时过期
$this->memcached->set($cacheKey, $user, 3600);
}
return $user;
}
public function updateUser($userId, $data) {
// 更新数据库
// ...
// 使缓存失效
$this->memcached->delete("user_{$userId}");
}
}
Session 存储
<?php
// 配置 Memcached 作为 Session 存储
ini_set('session.save_handler', 'memcached');
ini_set('session.save_path', 'localhost:11211');
// 或者在代码中配置
$memcached = new Memcached();
$memcached->addServer('localhost', 11211);
$memcached->setOption(Memcached::OPT_PREFIX, 'session_');
session_start();
$_SESSION['user_id'] = 123;
全页面缓存
<?php
function cachePage($key, $content, $expire = 300) {
global $memcached;
if ($memcached->get($key) === false) {
// 生成页面内容
ob_start();
// 页面内容...
$content = ob_get_clean();
// 存储到缓存
$memcached->set($key, $content, $expire);
}
return $content;
}
// 使用示例
$pageKey = 'homepage_' . date('YmdH');
$pageContent = cachePage($pageKey, null, 3600);
echo $pageContent;
最佳实践
键命名规范
<?php
// 使用命名空间前缀
$prefix = 'app1:';
$memcached->setOption(Memcached::OPT_PREFIX, $prefix);
// 或手动添加前缀
function buildCacheKey($key) {
return 'prefix_' . $key;
}
错误处理
<?php
$result = $memcached->set('key', 'value');
if (!$result) {
switch ($memcached->getResultCode()) {
case Memcached::RES_NOTSTORED:
echo "存储失败";
break;
case Memcached::RES_SERVER_ERROR:
echo "服务器错误";
break;
default:
echo "其他错误:" . $memcached->getResultMessage();
}
}
监控和统计
<?php $stats = $memcached->getStats(); print_r($stats); // 获取服务器版本 $version = $memcached->getVersion(); print_r($version);
注意事项
- 内存限制:监控 Memcached 内存使用,设置合理的
-m参数 - 过期策略:合理设置过期时间,避免缓存雪崩
- 序列化开销:避免存储过大的对象
- 安全性:生产环境建议使用 SASL 认证或限制访问IP
- 键名长度:键名不宜过长,建议控制在250字符以内
- 数据大小:单个值建议不超过1MB
通过以上方式,你可以在 PHP 项目中高效地使用 Memcached 来提升应用性能。