以下是测量3个存储之间性能的小测试结果:mysql,memcached和php static。
我只对脚本执行期间的数据感兴趣,所以静态是可以接受的。
步骤:
用15000个对象填充存储空间(uuid,某些名称和1 KB的随机数据)
获取5000个uuid密钥
循环并搜索3个存储空间中的每个密钥
Resuts:
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内存耗尽错误”)?
如果我只在执行期间使用数据,那么最好的(静态或内存缓存)是什么?
答案 0 :(得分:0)
解决
似乎问题在于变量赋值。此代码不会为复制的变量生成内存分配。
$object = [
'guid' => Guid::generate(),
'name' => substr(md5(rand()), 0, 7),
'data' => openssl_random_pseudo_bytes(10*1024),
];
// start measure
self::$data[$object['guid']] = $object;
// stop measure
但是这显示了正常的内存使用情况
self::$data[$object['guid']] = serialize($object);
这种情况的PHP行为在这里解释
PHP创建一个指针,直到我们对变量进行有意义的更改
self::$data[$object['guid']] = $object;
self::$data[$object['guid']]['data'] = $object['data']; // reference
self::$data[$object['guid']]['data'] = $object['data'] . ''; // copy