我正在用PHP执行一个程序并且有时会收到以下错误。这是因为创建了很多对象并且没有销毁它们或任何其他原因?
允许的内存大小为16777216字节耗尽(尝试分配19456字节) 在PHP5中销毁对象的正确方法是什么。
一些代码:
App::import('Vendor','GoogleShipping',array('file'=>'googlecheckout'.DS.'library'.DS.'googleshipping.php'));
App::import('Vendor','GoogleTax',array('file'=>'googlecheckout'.DS.'library'.DS.'googletax.php'));
class Cart{
var $_itemname;
var $_unit_price;
public function Usecase($itemname,$unit_price,$url,$merchant_private_item_data)
{
$cart = new GoogleCart($this->_merchant_id, $this->_merchant_key, $this->_server_type,$this->_currency);
$item_1 = new GoogleItem($this->_itemname,$this->_item_description,$this->_total_count,$this->_unit_price,$this->_merchant_private_item_data);
}
}
答案 0 :(得分:3)
由于我在很多地方使用很多APP :: import来导入cakephp中的供应商文件,因此会消耗更多内存。
我没有使用APP :: import,而是使用了require_once(),但没有发生错误。
答案 1 :(得分:2)
使用unset销毁对象的引用。当所有引用都消失后,对象将被破坏。
您还可以使用memory_get_usage函数来查看当前正在使用的大量内存。尝试使用它来找出你的内存瓶颈所在。
答案 2 :(得分:2)
如果您这样做了,例如:
for($i=0;$i<=10000;$i++)
{
$Object = new MyObject();
//Blah
unset($Object);
}
你不仅使用unset
10K次创建一个10K倍的对象,这会降低你的应用程序的速度
$array = array();
$count = 0;
for($i=0;$i<=10000;$i++)
{
$array[$i] = new MyObject();
//Blah
$i++;
if($count == 500)
{
unset($array,$count);
$array = $array();
$count = 0;
}
}
现在你的记忆力不应达到巅峰,而且你只能使用未设置20次:)
这样你的保存表现也是如此。
答案 3 :(得分:1)
如果没有看到代码,我们无法确切地知道导致此错误的原因。它可能会创建太多的对象,但它可能很容易创建太大的数组或其他数据。
无论哪种方式,无论你正在创建什么类型的数据抛出错误,它都可能是一个失控的循环或递归函数,这是根本原因,在每次迭代时创建新数据,而不是你故意创建足够的对象来溢出那么多内存。如果你确实需要创建足够的数据来填充那么多内存,那么你可以修改PHP.ini中的最大内存容量,但这不太可能。