我在谷歌搜索上没有看到很多东西,或者在运行时对PHP最大类处理有任何疑问。
假设我有一个自定义的arrayaccess类,可容纳最多8k个“User”类型的对象。
由于arrayaccess
课程不允许我这样做:
$d[0]->username = "sam"
当你执行foreach()
每个循环带出一个对象但是数组本身没有任何对象时,只为剩余对象设置类,就像我可以在迭代器中一样,它只是分配一个新的填充对象(允许您在数组的每个循环中反复重复使用内存中的相同位置。我只能在offsetGet()
类中的数组偏移量内的arrayaccess
方法中设置一个对象。因此,我需要在此arrayaccess
类中的任何一个点(甚至可能是20k对象)中容纳任何高达8K对象的任何东西。
因此,arrayaccess
类中的每个偏移量都可以是“用户”的对象,最多可以有20k(至少8k)。
我的问题是: PHP能否处理这么多类实例?我的意思是这是很多课程,我担心这很容易破坏我的记忆消耗。
答案 0 :(得分:5)
您正在谈论对象而不是类。
PHP处理大量对象没有问题,但如果出现问题,只需增加memory_limit
中的php.ini
。
答案 1 :(得分:2)
您可以实例化的类(对象)通常受内存限制的约束。因此,它取决于每个对象消耗的内存量和对象总数。
因此,您实际需要测试对象将消耗多少内存。我为demonstration purposes做了一点测试。那个显示了439 000
对象实例的stdClass
个实例可能有128m
个内存限制:
$store = array();
$max = 500001;
for($i = 0; $i < $max; $i++)
{
if ($i % 1000 === 0)
echo $i, '(', number_format(memory_get_usage(),0, '',' '),')', "\n";
;
$obj = new stdClass;
$obj->name = 'just some data';
$store[] = $obj;
unset($obj);
}
所以回答你的问题:你需要测试你的场景实际消耗了多少内存,这将显示你可以拥有多少个对象实例。它不是arrayaccess
,而是实际的对象实例数以及与应用程序总数相关的数据。
答案 2 :(得分:1)
我的问题是:PHP能够处理这么多的类实例吗?我的意思是这是很多课程,我担心这很容易破坏我的记忆消耗。
我的座右铭是;如果你问有关限制的问题,你可能做错了什么。为什么你需要一个类的8k实例?一个简单的数组不足以满足这个特定情况吗?你在建一个清单吗?如果是这样,实施分页不是很有益吗?
我尽可能地使用物品,当他们被召唤时。如果您正在使用8k的对象,那么您可能正在执行类似报告的操作,其中实例化对象并不适合,并且通常不鼓励使用。如果要进行报告,请使用简单数组(因为您实际上不会使用对象的行为),或将计算保留在数据库中。
答案 3 :(得分:0)
问题是:你能用吗?它适用于索引数组
http://sandbox.phpcode.eu/g/38fde.php
这很好用
<?php
class c1{
function c1(){
echo 'c1';
}
}
class c2{
public $username;
function c2(){
echo '_c2';
}
function getUsername(){
echo $this->username;
}
}
$c[0] = new c1();
$c[1] = new c2();
$c[1]->username = "test";
$c[1]->getUsername();