PHP项目中如何使用Memcached?

wen PHP项目 5

本文目录导读:

PHP项目中如何使用Memcached?

  1. 安装 Memcached 扩展
  2. 连接 Memcached 服务器
  3. 基本缓存操作
  4. 高级操作
  5. 实际应用示例
  6. 最佳实践
  7. 注意事项

在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);

注意事项

  1. 内存限制:监控 Memcached 内存使用,设置合理的 -m 参数
  2. 过期策略:合理设置过期时间,避免缓存雪崩
  3. 序列化开销:避免存储过大的对象
  4. 安全性:生产环境建议使用 SASL 认证或限制访问IP
  5. 键名长度:键名不宜过长,建议控制在250字符以内
  6. 数据大小:单个值建议不超过1MB

通过以上方式,你可以在 PHP 项目中高效地使用 Memcached 来提升应用性能。

抱歉,评论功能暂时关闭!