在引发内存问题之前,php数组有多大?

时间:2012-08-29 04:13:20

标签: php mysql caching memory

我们的应用程序目前的工作方式如下:

class myClass{

    private $names = array();

    function getNames($ids = array()){
         $lookup = array();

         foreach($ids as $id)
             if (!isset($this->names[$id]))
                $lookup[] = $id;

         if(!empty($lookup)){
              $result;//query database for names where id in $lookup
                      // now contains associative array of id => name pairs
              $this->names = array_merge($this->names, $result);
         }

         $result = array();
         foreach($ids as $id)
             $result[$id] = $this->names[$id];

         return $result;
    }
}

哪个工作正常,但它仍然(通常会)导致多个查询(在这种情况下为400+)。

所以,我想简单地查询数据库并使用数据库中的每个名称填充$this->names数组。

但我担心数据库中有多少条目我应该开始担心内存这样做? (数据库列是varchar(100))

2 个答案:

答案 0 :(得分:7)

你有多少记忆?在高峰访问时间内,您的服务通常支持多少并发用户?这些是相关的信息。没有它们,任何答案都是无用的。通常,这是通过负载测试容易解决的问题。然后,找到瓶颈并进行优化。在此之前,只需使其工作(在合理范围内)。

但是......

如果你真的想知道你在看什么......

如果我们假设您没有存储多字节字符,那么您有400个名称* 100个字符(假设每个名称都超出您的字符数限制)...您正在查看~40Kb的内存。似乎太无关紧要了,不是吗?

显然,您将从PHP获得其他开销来保存数据结构本身。您是否可以使用SplFixedArray等数据结构而非普通array更有效地存储内容?可能 - 但是你失去了高度优化的array_*函数,否则你必须操纵列表。

用户是否会使用您计划在内存中缓冲的每个条目?如果您必须将它们用于您的应用程序,它们的重要程度并不重要,是吗?在内存中保存大量不需要的信息并不是一个好主意“只是因为。”您绝对不想做的一件事是在每个页面加载时查询数据库以获得4000条记录。至少你需要将这些类型的事务放入内存存储器,如memcached或使用APC。

这个问题 - 就像计算机科学中的大多数问题一样 - 只是一个受约束的最大化问题。除非您知道可供使用的变量,否则无法正确解决。

答案 1 :(得分:3)

一旦你获得了超过一千个项目,键入的查找开始变得非常慢(当你访问一个特定的密钥时有一个延迟)。您可以使用kso​​rt()来解决这个问题。 (我看到一个脚本从15分钟的运行时间下降到不到2分钟,只需添加一个ksort)

除此之外,你实际上只受到记忆的限制。

更好的方法是在脚本中构建一个缺失数据数组,然后使用IN列表在一个查询中获取所有数据。

如果你能提供帮助,你真的不应该浪费内存存储用户永远不会看到的数据。