【发布时间】:2014-08-09 22:15:04
【问题描述】:
这是一个小测试的结果,用于测量 3 个存储之间的性能:mysql、memcached 和 php static。
我只对脚本执行期间的数据感兴趣,所以静态是可以接受的。
步骤:
用 15000 个对象(uuid、一些名称和 1 KB 随机数据)填充存储空间
获取 5000 个 uuid 密钥
循环并搜索 3 个存储中的每个键
结果:
Object count: 15000
Search requests: 5000
================================
[filling] mysql
time: 175.268 s
memory: 2.519 Mb
================================
[filling] memcached
time: 7.79517 s
memory: 1.9455 Mb
================================
[filling] static
time: 0.229687 s
memory: 3.7875 Mb
================================
[search] mysql
time: 3.12171 s
memory: 0.991821 Mb
================================
[search] memcached
time: 1.41455 s
memory: 0.686646 Mb
================================
[search] static
time: 0.0488684 s
memory: 0.762939 Mb
汇总了 5000 个搜索请求的时间和内存。 测量代码
$timeInit = (float) microtime(true);
$memoryInit = (float) memory_get_usage(false);
function(); // measured operations
$timeFinish = (float) microtime(true);
$memoryFinish = (float) memory_get_usage(false);
$time = $timeFinish - $timeInit;
$memory = ($memoryFinish - $memoryInit)/1024/1024;
因此,memcache 和 mysql 将它们的数据存储在 php 之外。但是“静态”内存使用在哪里?
静态存储会导致脚本期间内存不足(“PHP Memory Exhausted Error”)吗?
如果我只在执行期间使用数据,那么最好的(静态或内存缓存)是什么?
【问题讨论】:
-
"PHP 在哪里存储静态变量?" - 在茶几旁边的侧板下!
-
静态变量存储在分配给 PHP 的堆内存中,因此它们确实占用了可能导致“内存耗尽错误”的部分内存分配:
$object占用内存,self::$data[$object['guid']] = $object;占用一个内存数组条目,包含对 $object 的引用 -
请注意,如果您在数组中存储标量,情况会有所不同:您可以存储任意数量的对象指针,它们始终是指向原始对象实例的指针;如果您分配标量变量(整数、浮点数、字符串、布尔值甚至数组),那么它们是您存储的实际副本(除非您使用
&明确将它们设置为引用 -
您关于更改时复制的 cmets 仅适用于函数的传递或参数
标签: php mysql memory static memcached