Fatal error: Allowed memory... bei Query?

bofh1337

Erfahrenes Mitglied
Versteht jemand die Welt? Ich habe eine Mysql-Query, die wie hier aufgebaut ist:


PHP:
$result = $this->db->setQuery ('SELECT c.*, p.data_name, u.uname
            FROM ' . $this->db->quoteName ($this->db_table_ordered) . ' AS c
            LEFT JOIN ' . $this->db->quoteName ('#__promote_data') . ' AS p
                ON (c.id = p.id)
                AND (c.group = p.group)
            LEFT JOIN ' . $this->db->quoteName ('#__users') . ' AS u
                ON (c.id = u.id)
                AND (c.group = u.group)
            ORDER BY c.order_date DESC');
        return $this->db->loadAssocList ($result);


Diese Query läuft ohne Probleme, jetzt ist aber der Fall, das dort zb. 300 Datensätze ausgelesen werden und ich aus "$this->db_table_ordered" nicht alle Felder brauche, also wollte ich nur die Felder auslesen lassen, welche ich wirklich brauche:

PHP:
$result = $this->db->setQuery ('SELECT c.title, c.stay_time, c.items, c.admin_pay,
            c.admin_pay_currency, c.user_pay, c.user_pay_currency, p.data_name, u.uname
            FROM ' . $this->db->quoteName ($this->db_table_ordered) . ' AS c
            LEFT JOIN ' . $this->db->quoteName ('#__promote_data') . ' AS p
                ON (c.id = p.id)
                AND (c.group = p.group)
            LEFT JOIN ' . $this->db->quoteName ('#__users') . ' AS u
                ON (c.id = u.id)
                AND (c.group = u.group)
            ORDER BY c.order_date DESC');
        return $this->db->loadAssocList ($result);


Bei dieser Query bekomme ich aber diesen Felder:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 202816221 bytes) in /var/www/project_orw_mail/libraries/document/themes.php on line 154
Der Fehler tritt also in der generation des Webseiten-Footers auf, aber eigentlich ist es ja egal, wo er auftritt, denn bei der Query sollte es doch auch laufen, oder?

// Edit: Die Query läuft nur, wen ich das "c.admin_pay_currency" weg lasse, vorhanden ist das Feld aber und hat auch jedes mal einen gültigen Inhalt... und es wird benötigt.
 
Zuletzt bearbeitet:
Hi,

das Problem ist, dass PHP hier mehr Arbeitsspeicher braucht, als ihm zugeteilt ist. In der php.ini Datei auf dem Server musst du da die max_memory_usage hochschrauben, dann sollte das gehen.

Grüße,
BK
 
Das Memory-Limit ist auf 128 MB, ich glaube aber, ich habe den (Denk)-Fehler gefunden ;)

LEFT JOIN....liest ja nur Datensätze, wenn die benötigen (angegebenen Felder) in beiden Querys vorkommen, das ist ja bei mir nicht der Fall.
Das dann der komplette Ram verbraten wird, ist mir trotzdem ein Rätsel, ich hätte eigentlich mit 0 Datensätze gerechnet.
 
Das ist es ja, es kommt kein Mysql-Error/Erno, es wird versucht, die Datensätze aus der DB zu holen und plötzlich kommt die Meldung mit dem Memory, beide Querys in Konsole ausgeführt laufen ohne Probleme
 
Es ist klar, dass es keine MySQL-Error ist. Dassiet man schon der Meldung an.
Aber wo genau tritt der Fehler auf?
Einen link um das herauszufinden habe ich dir ja schon gegeben.
 
Der Fehler tritt innerhalb des Template-Systems auf, genau da, wo der Footer generiert wird (Zeile 4: $theme_template['script_output'] = ob_get_clean ();:

Ich glaube aber, du kannst mit dieser Antwort nicht viel anfangen :D


PHP:
function themefooter()
{
    $theme_template = orwRequest::get ('theme_template', array ());

    // Im Puffer stehen hier die Ausgaben des Moduls
    $theme_template['script_output'] = ob_get_clean ();
    // hier ist das Modul komplett durchgelaufen und die Variablen koennen jetzt im Template ersetzt werden
    $theme_template['template'] = replace_vars ($theme_template['template']);
    $contentvars = define_content ();
    extract_part ($theme_template['template'], $contentvars['output_container'], $theme_template['script_output']);
    unset ($theme_template['script_output']);
    foreach ($theme_template['blockcontainers'] as $container => $sidex) {
        $allmenus = '';
        $blockcount[$container] = 0;
        $menus = getMenus ($sidex['posi']);
        foreach ($menus as $menu) {
            $func = $sidex['function'];
            $created = $func ($menu['title'], $menu['content'], $menu, 'noecho');
            // und den fertigen Block anfuegen
            $allmenus .= $created;
            $blockcount[$container]++;
        }
        // hier steht der Blockinhalt komplett formatiert zur Verfuegung
        extract_part ($theme_template['template'], $container, $allmenus);
    }
    unset ($allmenus, $menu, $container, $sidex, $theme_template['blockcontainers']);
    // pruefen ob ueberhaupt rechte Bloecke aktiv sind, wenn nicht $index auf 0 stellen
    // dies verhindert, dass eine leere rechte Spalte angezeigt wird
//        $right_menus = ($blockcount[$contentvars['index_on_block_container']] > 0) ? $GLOBALS['right_menus'] : 0;
    // je nach $index, die Tabellenspalten der rechten Bloecke extrahieren oder entfernen
    $show_menus = ($blockcount[$contentvars['index_on_block_container']] > 0) ? orwRequest::getInt ('show_menus', 0, 'METHOD') : 0;
    if (empty ($show_menus)) {
        $contentvars = define_content ();
        extract_part ($theme_template['template'], $contentvars['index_on_container']);
    }
    // ersetzen von eigenen Theme-Elementen, kann veraendert und ergaenzt werden
    $theme_template['template'] = replace_end ($theme_template['template']);
    // hier Testen der zu ersetzenden Dinge....
    // preg_match_all('#( class="(?:formbutton|formcheckbox)"){2}#si',$theme_template['template'],$matches);
    // images innerhalb von TextArea's 'entwerten', damit diese nicht ersetzt werden
    $theme_template['template'] = preg_replace_callback ('#(<textarea[^>]*>.*)(\.(?:gif|jpe?g|png))?(.*</textarea>)#isU', 'theme_killimages', $theme_template['template'], -1, $match);
    // Struktur des Ordners sys_images analysieren
    // ersetzen und Ausgabe in das template-Array speichern
    $theme_template['template'] = replace_parts ($theme_template['template'], getmore_parts ());
    // images innerhalb von TextArea's wieder herstellen
    if ($match) {
        $theme_template['template'] = unkillimages ($theme_template['template']);
    }
    // falls der sys_images-Pfad doppelt ersetzt wurde
    $folder = THEME_DIR . '/sys_images/';
    $theme_template['template'] = preg_replace ("#($folder){2,}#", '$1', $theme_template['template']);

    /**
     * hier wird der eindeutige String fuer die Platzhalter durch die
     * eigentlichen Platzhalter, bzw. dessen Werte ersetzt (ab 0.1.9)
     */
    if (function_exists ('define_placeholders')) {
        $parts = define_placeholders ();
        $key = '-:_' . PLACEHOLDER . '_:-';
        foreach ($parts as $uups) {
            $searches[] = $key . trim ($uups[0], '{');
            $replaces[] = $uups[1];
        }
        $theme_template['template'] = str_replace ($searches, $replaces, $theme_template['template']);
    }
    // Puffer wieder starten fuer evtl. mod_rewrite
    if (!ob_get_level ()) {
        // Falls keine Pufferebene mehr vorhanden, obwohl in mxBaseconfig explizit gestartet...
        ob_start ();
    }
    /* Inhalt abschicken */
    echo $theme_template['template'];
}
 
Und wie ist nun der Zusammenhang zwischen dem SQL und dem Footer?

Kommt der Fehler beim abrufen des Resultates oder nachher in einer Schleife oder so?
 
Der Fehler kommt beim Abrufen, die HTML-Ausgabe dauert (nach dem Abrufen) extrem lange (ca. 7-9 Sekunden), dann kommt der Fehler, ich konnte den Fehler aber eingrenzen, die Serialisierung der Instance einer Klasse hat nicht funktioniert, deshalb wurden da für jeden Datensatz eine neue Instance erzeugt, jetzt geht es zwar, aber ich schreibe den ganzen Kram noch etwas um ;)
 

Neue Beiträge

Zurück