php - 不要停止 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
}
我该怎么做?
解决方案
您得到错误的根本原因不是set
memcache 的接口,而是serialize()
您所做的调用。
即使问题不是给读者任何关于 值的提示$rows
,您可能正在尝试序列化:
- 一大堆对象/值(其中有很多项目
$rows
),当它们被序列化时,它们不可能一次性放入内存中。 - 中的某些对象/值
$rows
不可序列化?资源? - 中的一些对象/值
$rows
具有循环引用(与学说实体的常见场景)
潜在的解决方案可能是:
- 减少堆栈中的项目数量。尝试应用批处理(
$rows
以块的形式序列化项目)或简单地增加memory_limit - 不要试图序列化资源等不可序列化的东西。
- 仔细实现
__wakeup
和__sleep
在您使用的对象中,$rows
并且只返回/使用在那里有意义的属性。
就我个人而言,我总是更喜欢 Memcache 中更简单的 JSON 结构,而不是serialize()
依赖unserialize()
于当你反序列化它时对象。这可能会导致很难理解和调试的错误。PHP 中的 json/array 转换也非常简单直接。他们不需要参与__magic
。
希望能帮助到你。
推荐阅读
- powershell - 如何以编程方式在 Exchange Online 中批量添加/编辑/删除 GAL 全局地址列表中的条目
- laravel - Laravel - 根据登录表单上的语言字段将用户重定向到自定义网址
- parse-platform - iOS Parse Server 在运行时设置服务器 url 而无需重新启动应用程序
- php - 卷曲错误:操作被回调中止
- scala - 为 sbt 提取项目
- python - 如何过滤包含格式为 yyyyMmm 的日期的列?
- android - 自定义 ImageSpan 无法正确显示
- google-sheets - 如何使用 SUMIFS 连接两个 google sheet 工作簿?
- emacs - emacs 作为其他应用程序的外部编辑器(Houdini、Joplin)
- c++ - cpp:通过传递给构造函数的类型定义类成员变量类型