2010-11-18 3 views
1

Ich führe ein Programm in PHP und bekomme den unten genannten Fehler manchmal.Ist dies aufgrund der Menge von Objekten erstellen und nicht zu zerstören oder aus irgendeinem anderen Grund?Zerstöre Objekt in PHP

Erlaubte Speichergröße von 16777216 Bytes erschöpft (versucht, 19456 Byte zuzuordnen) Was ist die richtige Methode, um ein Objekt in PHP5 zu zerstören.

Einige Code:

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); 
    } 
} 
+3

Bitte Code anzeigen –

+0

App :: import ('Hersteller', 'GoogleShipping', Array ('Datei' => 'googlecheckout.DS.'library'.DS.'googleshipping.php')); App :: import ('Hersteller', 'GoogleTax', Array ('Datei' => 'googlecheckout.DS.'library'.DS.'googletax.php ')); Klasse Warenkorb { \t var $ _itemname; \t var $ _unit_price; – Sitansu

+0

Ich benutze CakePHP – Sitansu

Antwort

1

Ohne den Code zu sehen, können wir nicht genau sagen, was diesen Fehler verursacht. Es könnte zu viele Objekte erstellen, aber es könnte genauso einfach sein, ein zu großes Array oder andere Daten zu erstellen.

Unabhängig davon, welche Art von Daten Sie erstellen, die den Fehler verursacht, ist es wahrscheinlich eine Schleife oder rekursive Funktion außerhalb der Kontrolle, die die zugrunde liegende Ursache ist, neue Daten bei jeder Iteration, anstatt Sie absichtlich genügend Objekte erstellen, um so viel Speicher zu überfließen.

Wenn Sie wirklich genügend Daten erstellen müssen, um so viel Speicher zu füllen, dann können Sie die maximale Speicherberechnung in PHP.ini ändern, aber es ist unwahrscheinlich.

2

Verwenden unset den Verweis auf das Objekt zu zerstören. Wenn alle Referenzen weg sind, wird das Objekt zerstört.

Sie können auch die Funktion memory_get_usage verwenden, um zu sehen, wieviel Speicher Sie gerade verwenden. Versuchen Sie es zu verwenden, um herauszufinden, wo Ihre Speicherengpässe liegen.

2

Nun, wenn Sie dies zum Beispiel geschehen:

for($i=0;$i<=10000;$i++) 
{ 
    $Object = new MyObject(); 
    //Blah 
    unset($Object); 
} 

Ihr nicht nur ein Objekt 10K mal die Erstellung Ihrer auch unset 10K mal mit, die die Geschwindigkeit Ihrer Anwendung sie

Ihre besten verunsichert verringern würde wenn Iterationen über den Betrag X in etwa so:

$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; 
    } 
} 

Nun sollte Ihr Gedächtnis erreichen nicht Spitze, und Sie müssen lediglich mit ungesetzt 20 mal :)

Auf diese Weise Ihre Einsparungen auch.

+0

Sie fehlen das Inkrement auf '$ count' – acm

+4

Kleinere Aufsicht, aber der Punkt war da. – RobertPitt

+0

sollte es sein $ count ++ lol – Alex

3

Da ich viele von APP :: Import an vielen Orten verwendet, um Herstellerdateien in CakePHP zu importieren, verbraucht es mehr Speicher.

Anstatt APP :: Import zu verwenden, verwendete ich require_once() und der Fehler trat nicht auf.

+0

Danke für die Aktualisierung uns! – Christian