php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 21.07.2010, 13:17   #1 (permalink)
Neuer Benutzer
 
Registriert seit: 07.08.2009
Beiträge: 17
PHP-Kenntnisse:
Fortgeschritten
timo_peschka befindet sich auf einem aufstrebenden Ast
Standard [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();

timo_peschka ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 21.07.2010, 13:30   #2 (permalink)
Erfahrener Benutzer
 
Benutzerbild von Screeze
 
Registriert seit: 04.01.2009
Beiträge: 742
PHP-Kenntnisse:
Fortgeschritten
Screeze befindet sich auf einem aufstrebenden Ast
Screeze eine Nachricht über ICQ schicken Screeze eine Nachricht über Skype™ schicken
Standard

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.
__________________
Screeze ist offline   Mit Zitat antworten
Alt 21.07.2010, 13:40   #3 (permalink)
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 3.846
Chriz ist ein sehr geschätzer MenschChriz ist ein sehr geschätzer MenschChriz ist ein sehr geschätzer MenschChriz ist ein sehr geschätzer Mensch
Standard

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
__________________

Chriz ist offline   Mit Zitat antworten
Alt 21.07.2010, 14:12   #4 (permalink)
Neuer Benutzer
 
Registriert seit: 07.08.2009
Beiträge: 17
PHP-Kenntnisse:
Fortgeschritten
timo_peschka befindet sich auf einem aufstrebenden Ast
Standard

Hey,

Danke euch beiden. Funktioniert super. Hätte ich auch selbst drauf kommen dürfen...
timo_peschka ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Speicherproblem html2pdf Registrierer PHP Einsteiger 7 25.03.2010 20:12
Speicherproblem: memory_limit ändern hilft nicht Ronny76 PHP Tipps 2008 3 30.08.2007 14:42
Speicherproblem in Datenbank Arturo Leonardo PHP Tipps 2006 50 23.02.2006 12:47
Speicherproblem nach Providerumzug PHP Tipps 2005 10 25.04.2005 10:22
bild mit wasserzeichen uploaden! Speicherproblem!! 18inch PHP Tipps 2004-2 4 18.12.2004 00:23

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
mage::getmodel(\'customer/customer\' import, magento setpasswordhash, $customer->setgroupid magento, magento speicherfehler, $customer->setgroupid()

Alle Zeitangaben in WEZ +2. Es ist jetzt 17:47 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum