Memory überschritten -> Warum?

Ungetestet:
PHP:
$number1 = '1000'; // Wird eigentlich ausgerechnet

$img_repeat = imagecreatefrompng( $pfad1 );
$img_size1  = imagesx( $pfad1 );
$img_size2 += $img_size1 * $number1;

$fillImg = array( 'avapic' => $img_repeat, 'sizex' => $img_size1 );

$img_end = array_merge( $img_end, array_fill( 0, $number1, &$fillImg ) );
 
Danke für die ausführliche Antwort! Ich habe es noch nicht 100% verstanden aber ich werde mir deinen Beitrag sobald ich wieder zuhause bin ganz in Ruhe durchlesen und versuchen zu verstehen.

Dein letzter Satz deutet darauf hin das ich es vergessen kann. Es also nicht funktionieren wird.

Denn...

PHP:
   $number1 = '1000'; // Wird eigentlich ausgerechnet
   $number2 = '1000'; // Wird eigentlich ausgerechnet
   $number3 = '1000'; // Wird eigentlich ausgerechnet
 
   $img_repeat1 =  imagecreatefrompng($pfad1);
   $img_size1 = imagesx($pfad1);
 
   for($i=0; $i < $number1; ++$i) {
       $img_end[] = array('avapic' => &$img_repeat1, 'sizex' => $img_size1);
       $img_size_total = $img_size_total + $img_size1;
   }

   $img_repeat2 =  imagecreatefrompng($pfad2);
   $img_size2 = imagesx($pfad2);
 
   for($i=0; $i < $number2; ++$i) {
       $img_end[] = array('avapic' => &$img_repeat2, 'sizex' => $img_size2);
       $img_size_total = $img_size_total + $img_size1;
   }

   $img_repeat3 =  imagecreatefrompng($pfad3);
   $img_size3 = imagesx($pfad3);
 
   for($i=0; $i < $number3; ++$i) {
       $img_end[] = array('avapic' => &$img_repeat3, 'sizex' => $img_size3);
       $img_size_total = $img_size_total + $img_size1;
   }

Hinweis: Ich kann den Code nicht ausprobieren, weil ich hier keinen Server Zugang habe.

Werden so die anderen Grafiken überschrieben oder so?

Beispiel:
PHP:
$pfad1 = 'a.png';
$pfad2 = 'b.png';
$pfad3 = 'c.png';

Es sollte DOCH EIGENTLICH aaaaaaaaaabbbbbbbbbbcccccccccc (tausend) rauskommen? Obwohl die Grafiken nur einmal (insgesamt 3) mal geladen wurden. Aber nach deinem Beitrag denke ich dass das Array irgendwie "kaputt" geht.

$img_end[] = ?
 
Ich denke schon, das es funktionieren sollte. Ich wollte nur darauf hinweisen, dass eine Veränderung der Daten im Array - also das was im Element 'avapic' steht - auch die Daten in der Variable $img_repeat1 (bzw. $img_repeat2 oder $img_repeat3) verändert. Solange du das nicht machst, ist es doch in Ordnung.

Werden so die anderen Grafiken überschrieben oder so?

Nein, werden sie nicht. Du solltest das wirklich noch mal in Ruhe durchlesen ;-)


Soll das eine Frage sein oder was willst du damit ausdrücken?
 
Soll das eine Frage sein oder was willst du damit ausdrücken?

Das sollte eine Frage sein. :)

Wenn ich jetzt aus "$img_end" eine Grafik (Ausgabe-Grafik) erstellen würde, was käme dann mit dem Code von oben raus?

a.png, b.png und c.png kannst du dir als einfache Buchstaben als Grafik vorstellen. Die drei Buchstaben sollten doch jeweils tausend mal hintereinander dargestellt werden, obwohl die Grafik nur EINMAL geladen wurde?
 
Genauso ist es. Aber angenommen, du änderst jetzt das allererste 'a'-Bild ab. Dann änderst du alle weiteren 'a'-Bilder ebenso. Das passiert automatisch, da alle 'a'-Bilder im Array den gleichen Speicher verwenden. Das Bild in $img_repeat, das ursprünglich das 'a'-Bild war, würde ebenfalls geändert.

Stell es dir wie eine Liste vor, die speicher-technisch alle den gleichen Inhalt nur unterschiedliche IDs haben.
 
Ich muss also das "ganze Programm" durchziehen damit keine Fehler auftreten können.

Wenn der Code funktioniert, spare ich locker 1000 - 6000 "Ladevorgänge". Dann sollte das Skript auch locker flockig durchlaufen nehme ich an.

Bei einem Array wie z.B. a@@@@@@@@@@@@@@@@@@@@@bc@@@@d@@@@@@e ist das einparen von "Ladevorgängen" in einer Schleife wahrscheinlich nicht möglich oder?

Bei diesem Array wird jedes einzelne Zeichen als eine Grafik interpretiert.

a ist a.png
@ ist @.png
b ist b.png
usw...
 
Mal noch eine Idee wie man das abkürzen könnte:
PHP:
$pfad[0] = 'a.png';
$pfad[1] = 'b.png';
$pfad[2] = 'c.png';

$number[0] = '1000'; // Wird eigentlich ausgerechnet
$number[1] = '1000'; // Wird eigentlich ausgerechnet
$number[2] = '1000'; // Wird eigentlich ausgerechnet

// $img_size_total und $img_end müssen vor der Schleife schon existieren!
foreach ( $pfad AS $key => $value )
{
    $img_repeat      = imagecreatefrompng( $value );
    $img_size        = imagesx( $value );
    $img_size_total += $img_size * $number[$key];
    
    $fillImg = array( 'avapic' => $img_repeat, 'sizex' => $img_size );
    
    $img_end = array_merge( $img_end, array_fill( 0, $number, &$fillImg ) );
}

Gruß
 
Zuletzt bearbeitet:
PHP:
   $number1 = '1000'; // Wird eigentlich ausgerechnet

   $img_repeat1 =  imagecreatefrompng($pfad1);
   $img_size1 = imagesx($pfad1);
 
   for($i=0; $i < $number1; ++$i) {
       $img_end[] = array('avapic' => &$img_repeat1, 'sizex' => $img_size1);
       $img_size_total = $img_size_total + $img_size1;
   }

...

Mein Code funktioniert nicht. Der Speicher wird wieder überschritten und das kann eigntlich nicht sein wenn die Grafik wirklich nur einmal geladen wird. Denn die Maße sind 1px x 2000px.
 
Zuletzt bearbeitet:
Ich habe mir eben noch einmal den Code und die Fehlermeldung (Memory) angeschaut und das "neue" Problem gefunden.

PHP:
$final_img = imagecreatetruecolor(10000, 2000);

Vielleicht richen die ca. 60MB einfach nicht aus um ALLEINE diese LEERE Grafik zu erstellen? Die vorhe in der Schleifen erstellten/geladenen Grafiken müssen ja irgendwo rein kopiert werden.

Wieviel "Verbrauch" würde denn "$final_img" brauchen in MB.
 
Rund 95 MB:
PHP:
$dblMemUsage = memory_get_usage();
$final_img = imagecreatetruecolor(10000, 2000);
$dblMemUsage = round( ( memory_get_usage() - $dblMemUsage ) / 1024, 4 );

echo "<p>Memory usage: {$dblMemUsage} KByte</p>";
 
Zurück