PHP存储静态变量的位置?

时间:2014-08-09 22:15:05

标签: php mysql memory static memcached

以下是测量3个存储之间性能的小测试结果:mysql,memcached和php static。

我只对脚本执行期间的数据感兴趣,所以静态是可以接受的。

步骤:

  1. 用15000个对象填充存储空间(uuid,某些名称和1 KB的随机数据)

  2. 获取5000个uuid密钥

  3. 循环并搜索3个存储空间中的每个密钥

  4. 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内存耗尽错误”)?

    如果我只在执行期间使用数据,那么最好的(静态或内存缓存)是什么?

1 个答案:

答案 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行为在这里解释

How PHP manages variables

PHP创建一个指针,直到我们对变量进行有意义的更改

self::$data[$object['guid']] = $object;
self::$data[$object['guid']]['data'] = $object['data']; // reference
self::$data[$object['guid']]['data'] = $object['data'] . ''; // copy