【问题标题】:Where PHP stores static variables?PHP在哪里存储静态变量?
【发布时间】:2014-08-09 22:15:04
【问题描述】:

这是一个小测试的结果,用于测量 3 个存储之间的性能:mysql、memcached 和 php static。

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

步骤:

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

  2. 获取 5000 个 uuid 密钥

  3. 循环并搜索 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


【解决方案1】:

解决了

似乎问题出在变量分配中。此代码不会为复制的变量分配内存。

$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

【讨论】:

    猜你喜欢
    • 2015-11-03
    • 2011-12-12
    • 2021-03-18
    • 2012-01-13
    • 2010-09-10
    • 2018-08-14
    相关资源
    最近更新 更多