本文目录导读:

在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 来提升应用性能。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播