Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Speicherproblem bei Massenimport

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Speicherproblem bei Massenimport

    Hallo!

    Ich habe folgendes Problem:

    Ich lese aus einer Datenbank ca. 70k Kundendaten aus und füge sie in einen Magentoshop wieder ein. Wer sich ein bisschen mit Magento auskennt, wird die Schreibweise wiedererkennen:
    PHP-Code:
    $customer Mage::getModel('customer/customer');
    ... 
    Daten setzen
    $customer
    ->save(); 
    Das Problem ist nur, dass $customer mit jedem Schleifendurchlauf größer wird und ich die Variable auf Grund von Beziehungen in beide Richtungen mit unset() nicht löschen kann.

    Den Speicher erhöhen möchte bzw. kann ich nicht.

    Was für alternativen habe ich?

    Bereits nach dem 6000. Kunden ist der Speicher voll.


    Einmal das ganze Skript
    PHP-Code:
    $result mysql_query("
        SELECT
            customers_firstname, customers_lastname, customers_email_address,
            customers_password, customers_newsletter
        FROM
            customers"
    ) or die(mysql_error());

    //Magento vars
    $storeId Mage::app()->getStore()->getId();

    $inserts 100;

    $i 0;
    $start time();

    $x 0;
    while (
    $row mysql_fetch_assoc($result)) {
        if (
    $x <301) {
        if (
    $i $inserts) {
            
    $customer Mage::getModel('customer/customer');

            
    $customer->setFirstname($row['customers_firstname']);
            
    $customer->setLastname($row['customers_lastname']);
            
    $customer->setEmail($row['customers_email_address']);

            
    //Password
            
    $customer->setPasswordHash($row['customers_password']);

            
    //Newsletter
            
    $customer->setIsSubscribed($row['customers_newsletter']);

            
    $customer->setStoreId($storeId);
            
    $customer->setWebsiteId(1);
            
    $customer->setGroupId(1);
            
    $customer->setCreatedIn('Admin');

            try {
                
    //Ein paar ifs und das customer->save()
            
    }
            catch (
    Exception $e) {
                
    //echo $e->getMessage() . "<br />";
            
    }
        }
        else {
            
    $i 0;
            
    $end time()-$start;
            echo 
    "Zeit für " $inserts " Inserts: <strong>" $end "</strong> ";
            echo 
    "Memory: " memory_get_usage() . "<br />";

            
    $start time();
        }

        
    $i++;
        
    //print_r($customer);
        
    echo memory_get_usage() ."-";
        unset(
    $customer); <= kein Effekt
        
    echo memory_get_usage()."<br>";
        
    set_time_limit(120);
        
    flush();

    http://www.ippon-judo.de
    http://www.judoimtv.de


  • #2
    Wenn du das Script im browser aufrufst, könntest du versuchen einen partiellen import zu erstellen.

    D.h. du übergibst einfach nen parameter mit der nummer des nächsten datensatzes. Wenn der parameter nicht gesetzt ist fängst du bei 0 an.

    Dann fügst du dem mysql statement die id als LIMIT zu, und rufst jedes mal z.b. 4.000 datensätze ab.
    PHP-Code:
    if(isset($_GET['next']){
        
    $next = (int)$_GET['next'];
    }
    else {
        
    $next 0;
    }
    // noch ne $count variable mit anzahl der datensätze ermitteln

    $result mysql_query("
        SELECT
            customers_firstname, customers_lastname, customers_email_address,
            customers_password, customers_newsletter
        FROM
            customers
        LIMIT "
    .$next.",4000
    "
    ) or die(mysql_error()); 
    /*
    [...]
    */
    $next += 4000;
    if(
    $next $count){
        
    header(...);

    Am anfang ermittelst du jeweils noch die gesamtanzahl der datensätze, und solange $next kleiner ist als die gesamtanzahl, leitet das script mit header() angaben auf sich selbst um, und übergibt jeweils das aktuelle $next+4000 als neuen parameter.
    (allerdings weis ich nicht ob das mit header weiterleitung klappt, hab da was in erinnerung das der browser das als endlosschleife sehen könnte, notfalls musst du halt ne html umleitung nehmen)

    Obs die beste lösung ist weis ich nicht.

    Kommentar


    • #3
      Dann starte das PHP-Skript erneut nach 6000 Einträgen und merk dir, welche Einträge du schon übertragen hast.

      Edit: Tab zu lange offen gewesen, zu spät
      "Mein Name ist Lohse, ich kaufe hier ein."

      Kommentar


      • #4
        Hey,

        Danke euch beiden. Funktioniert super. Hätte ich auch selbst drauf kommen dürfen...
        http://www.ippon-judo.de
        http://www.judoimtv.de

        Kommentar

        Lädt...
        X