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

Hai*_*ood 10 php mysql memory caching

我们的应用目前的工作原理如下

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

因此,我只想查询数据库并$this->names使用数据库中的每个名称填充数组.

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

rdl*_*rey 7

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

但......

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

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

显然,您将从PHP获得其他开销来保存数据结构本身.你能用一种像SplFixedArray普通的数据结构更有效地存储东西array吗?可能 - 但是你失去了高度优化的array_*功能,否则你必须操纵列表.

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

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