new Memcached()不报错但set()返回false,主因是懒连接失败;应立即调用getStats()验证连接,用telnet检查端口,确认PHP启用memcached扩展而非memcache。

new Memcached() 不报错但 set() 返回 false 怎么办
这不是代码写错了,是连接根本没建立成功。Memcached 客户端采用懒连接机制:new Memcached() 只是创建对象,不发起网络请求;第一次调用 set() 或 get() 才尝试 TCP 连接,失败时静默返回 false,不抛异常。
- 立即验证连接:调用
addServer()后马上执行getStats(),返回空数组或false就说明连不上 - 用
telnet 127.0.0.1 11211检查端口是否可达;Docker 环境别写localhost,改用host.docker.internal或宿主机真实 IP - 确认 PHP 启用了
memcached扩展(不是memcache),运行php -m | grep memcached查看
set() 成功但 get() 返回 false,数据去哪了
Memcached 是纯内存存储,没有持久化能力。数据消失通常有三个原因:服务重启、内存满触发 LRU 清理、或过期时间设置出错。
- 传负数给
set()的第三个参数(比如-1)会被当成相对时间处理,导致立即过期;真要永不过期,必须传0 -
get()返回false不代表键不存在——它也可能是你存的就是布尔值false;要用getResultCode()判断:Memcached::RES_NOTFOUND才表示真没这个 key - 批量写入后没等几秒就立刻读,可能因异步写入或网络延迟还没落库,加点小延时或重试逻辑更稳妥
缓存数组或对象后 get() 总是 false
PHP 的 memcached 扩展默认开启自动序列化(Memcached::OPT_SERIALIZER),对数组、对象会调用 serialize() 存储。但反序列化失败时,它不报错,只静默返回 false。
- 优先缓存 JSON 友好结构:字符串、数字、关联数组;避免直接塞
stdClass或自定义类实例 - 若必须缓存对象,确保
get()前已加载对应类定义(例如提前require_once) - 禁用自动序列化更可控:
$m->setOption(Memcached::OPT_SERIALIZER, Memcached::SERIALIZER_NONE),然后手动json_encode()/json_decode()
该用 memcached 还是 memcache 扩展
现在应该无条件选 memcached 扩展。它基于 libmemcached,支持二进制协议、SASL 认证、多服务器哈希、CAS 一致性控制;而 memcache 是纯 PHP 实现,功能老旧,不支持现代运维需求。
-
memcached的addServer()支持权重、重试间隔、失败回调等参数,适合生产环境集群 -
memcache的connect()是阻塞式,连接失败直接报错或die,不适合高可用场景 - 两者方法名相似但参数细节不同:比如
memcache::set()第三个参数是 flag(MEMCACHE_COMPRESSED),而memcached::set()第三个是 expire 秒数
实际部署时最容易被忽略的是:getStats() 验证和 getResultCode() 判断这两步。很多人只看返回值是否为 false,结果把「键不存在」、「值就是 false」、「反序列化失败」、「连接超时」全混为一谈,排查起来绕一大圈。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











