Versio

Geheugen loopt vol, waar zit lek?

Overzicht Reageren

Teun Beijers

Teun Beijers

02/08/2009 22:16:00
Quote Anchor link
Ik heb een script gemaakt voor een spel genaamd tribalwars, de mysql database is in totaal 20MB groot, maar bij het volgende script loopt toch steeds mijn memory limit van php(zelfs bij 128MB) vol. Iemand die weet waar de lek zit?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
$center
= array('x' => 500,'y' => 500);
$zoom = 1;

$part = (1000/$zoom)/2;
$x_min = $center['x']-$part;
$x_max = $center['x']+$part;
$y_min = $center['y']-$part;
$y_max = $center['y']+$part;

$mysql = new PDO('mysql:host=localhost;dbname=tribalwars' , 'root' , '******');

$query = $mysql->prepare("SELECT v.x, v.y, v.player, p.name AS playername, p.ally, a.tag AS allytag FROM villages AS v, players AS p, allies AS a WHERE p.id = v.player AND a.id = p.ally AND v.x > :x_min AND v.x < :x_max AND v.y > :y_min AND v.y < :y_max");
$query->execute(array(':x_min' => $x_min,
                      ':x_max' => $x_max,
                      ':y_min' => $y_min,
                      ':y_max' => $y_max));

$fetched = $query->fetchAll();

$img = imagecreate(1000,1000);

$black = imagecolorallocate($img, 0, 0, 0);
$white = imagecolorallocate($img, 255, 255, 255);
$red = imagecolorallocate($img, 255, 0, 0);
$green = imagecolorallocate($img, 0, 0, 255);
$blue = imagecolorallocate($img, 0, 255, 0);
$gray = imagecolorallocate($img, 150, 150, 150);

foreach($fetched as $fetchid => $village)
{

    $village['x'] = ($village['x'] - $x_min)*$zoom;
    $village['y'] = ($village['y'] - $y_min)*$zoom;
    imagesetpixel($img, $village['x'], $village['y'], $white);
    unset($fetched[$fetchid]);//Save some memory
}

header("Content-type: image/jpeg");
imagejpeg($img);
imagedestroy($img);
?>


Andere verbeteringen in dit script zijn ook gewoon welkom, zoals die mysql query, kan volgens mij ook wel wat beter aan.
Gewijzigd op 01/01/1970 01:00:00 door Teun Beijers
 
PHP hulp

PHP hulp

24/05/2012 19:35:49
Gesponsorde koppelingen:
BHosted Hosting al vanaf € 1,- per maand

Controleer nu gratis jouw domeinnaam:

  
 
Jan Koehoorn

Jan Koehoorn

02/08/2009 22:18:00
Quote Anchor link
Het kan zijn dat het plaatje dat je creëert te groot is. Probeer het maar eens met een plaatje van 100 bij 100.
 
Teun Beijers

Teun Beijers

02/08/2009 22:19:00
Quote Anchor link
Jan Koehoorn schreef op 02.08.2009 22:18:
Het kan zijn dat het plaatje dat je creëert te groot is. Probeer het maar eens met een plaatje van 100 bij 100.


Geeft precies hetzelfde effect, plaatje van 1000x1000 is me al gelukt op andere manier, maar sinds ik het via de database doe gaat het niet goed
 
Johan

johan

02/08/2009 23:46:00
Quote Anchor link
je haalt data op uit de DB en zet je in een array hoe groot is die array ??? je haalt tog niet ales op DB !

@ Wesley sorry ik probeer het zo veel mogelijk het goed neer te zetten maar het valt niet altijt me "Ja ik gebruik word en google"
Gewijzigd op 01/01/1970 01:00:00 door johan
 
Wesley Overdijk

wesley Overdijk

03/08/2009 08:39:00
Quote Anchor link
@Johan: Dit is zeker ook dyslexie?

Er al eens aan gedacht om misschien op eerdere plekken in je script een exit te gooien? zodat je stukje voor stukje kan kijken tot waar het goed gaat? Bijvoorbeeld eens kijken welke data je allemaal hebt in het script op dat moment *moment van de exit*. Als ik het niet kan vinden doe ik dat.
 
Wes

wes

03/08/2009 08:44:00
 
Wesley Overdijk

wesley Overdijk

03/08/2009 08:47:00
Quote Anchor link
handig. Was vast niet voor mij bedoeld, maar ik zal het eens lezen. btw, WES.. vette hamster.
 
Jelmer rrrr

Jelmer rrrr

03/08/2009 10:19:00
Quote Anchor link
Je kan heel $fetched achterwege laten, en de foreach-lus over $query heen laten wandelen (PDOStatement instanties zijn namelijk itereerbaar) Dan fetcht hij één resultaat per wandeling, en heb je niet al je resultaten tegelijkertijd in het geheugen.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
foreach($query as $village)
{

    $village['x'] = ($village['x'] - $x_min)*$zoom;
    $village['y'] = ($village['y'] - $y_min)*$zoom;
    imagesetpixel($img, $village['x'], $village['y'], $white);
}

?>

Je mag er ook een while-lus van maken en $query->fetch(PDO::FETCH_ASSOC) gebruiken, achter de schermen betekent doet dit ongeveer hetzelfde. Het resultaat is in ieder geval hetzelfde :)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
while($village = $query->fetch(PDO::FETCH_ASSOC))
{

    // ...
}
?>
 
Teun Beijers

Teun Beijers

04/08/2009 00:50:00
Quote Anchor link
Dankje jelmer, ik was toevallig zelf al op die oplossing gekomen, en hij werkt wel ;).
 
Johan

johan

04/08/2009 09:40:00
Quote Anchor link
En dat is ?
 
Jan Koehoorn

Jan Koehoorn

04/08/2009 09:51:00
Quote Anchor link
@ johan: dat schrijft Jelmer toch? In plaats van:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
    foreach($fetched as $fetchid => $village)
?>

doe je
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
    foreach($query as $village)
?>

Je kunt een PDOStatement variabele gewoon met foreach doorlopen (dat bedoelt Jelmer met itereerbaar)
 



Overzicht Reageren