首页 > 解决方案 > 不要停止 PHP 中的内存缓存致命错误

问题描述

memcache在我的php代码中使用:

$memcache = new Memcache;
$memcache->connect('127.0.0.1', 11211) or die ("Could not connect");
$memcache->set($key, serialize($Rows), MEMCACHE_COMPRESSED, 36000);

但是,在某些情况下,该set指令会产生错误:

PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 28037120 bytes)

我不想加注,php's memory_limit,我会继续忽略这$memcache->set条线,我会做类似的事情:

try {
    $memcache->set($key, serialize($Rows), MEMCACHE_COMPRESSED, 36000);
} catch(...) {
    // do nothing
}

我该怎么做?

标签: php

解决方案


您得到错误的根本原因不是setmemcache 的接口,而是serialize()您所做的调用。

即使问题不是给读者任何关于 值的提示$rows,您可能正在尝试序列化:

  1. 一大堆对象/值(其中有很多项目$rows),当它们被序列化时,它们不可能一次性放入内存中。
  2. 中的某些对象/值$rows不可序列化?资源?
  3. 中的一些对象/值$rows具有循环引用(与学说实体的常见场景)

潜在的解决方案可能是:

  1. 减少堆栈中的项目数量。尝试应用批处理($rows以块的形式序列化项目)或简单地增加memory_limit
  2. 不要试图序列化资源等不可序列化的东西。
  3. 仔细实现__wakeup__sleep在您使用的对象中,$rows并且只返回/使用在那里有意义的属性。

就我个人而言,我总是更喜欢 Memcache 中更简单的 JSON 结构,而不是serialize()依赖unserialize()于当你反序列化它时对象。这可能会导致很难理解和调试的错误。PHP 中的 json/array 转换也非常简单直接。他们不需要参与__magic

希望能帮助到你。


推荐阅读