Hoe geheugen leegmaken van class?
In een script waarin ik een groot aantal PDF bestanden probeer te genereren en daarna te e-mailen, loop ik tegen een geheugengebruik probleem aan:
Code (php)
1
Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 1245184 bytes) in /www/vhosts/gameforaday.com/www/dompdf/lib/class.pdf.php(2219) : eval()'d code on line 5914
Oftewel: 16MB geheugen is er voor het script dat is opgebruikt, en het script wil nog 1MB toekennen, even grof. Het probleem ontstaat doordat er meerdere PDF's worden gegenereerd. Bij de 4e PDF ontstaat dit probleem.
De relevante code is:
Code (php)
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
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
<? function blaat(){
$mail = new PHPMailer();
$mail->Mailer = 'mail';
$mail->From = $set['company-email'];
$mail->FromName = $set['company-name']. ' administration system';
$mail->AddAddress($to_email);
$mail->AddReplyTo($set['company-email'], $set['company-name']);
$mail->IsHTML(false);
$mail->Subject = 'blabla';
$mail->Body = $result;
// create and attach the PDF invoice.
require_once("dompdf/dompdf_config.inc.php");
$dompdf = new DOMPDF();
$dompdf->load_html(generate_pdf($_GET['id']));
error_reporting(E_ERROR); // DomPDF is not very cleanly coded.
$dompdf->render();
$filename = 'blabla.pdf';
$mail->AddStringAttachment($dompdf->output(), $filename);
error_reporting(E_ALL);
if(!$mail->Send()) {
echo 'Message was NOT sent! <br>';
echo 'Mailer Error: '.$mail->ErrorInfo;
} else {
echo 'Message sent <br>';
}
unset($mail);
unset($dompdf);
} ?>
$mail = new PHPMailer();
$mail->Mailer = 'mail';
$mail->From = $set['company-email'];
$mail->FromName = $set['company-name']. ' administration system';
$mail->AddAddress($to_email);
$mail->AddReplyTo($set['company-email'], $set['company-name']);
$mail->IsHTML(false);
$mail->Subject = 'blabla';
$mail->Body = $result;
// create and attach the PDF invoice.
require_once("dompdf/dompdf_config.inc.php");
$dompdf = new DOMPDF();
$dompdf->load_html(generate_pdf($_GET['id']));
error_reporting(E_ERROR); // DomPDF is not very cleanly coded.
$dompdf->render();
$filename = 'blabla.pdf';
$mail->AddStringAttachment($dompdf->output(), $filename);
error_reporting(E_ALL);
if(!$mail->Send()) {
echo 'Message was NOT sent! <br>';
echo 'Mailer Error: '.$mail->ErrorInfo;
} else {
echo 'Message sent <br>';
}
unset($mail);
unset($dompdf);
} ?>
Zoals je ziet heb ik al met "unset" geprobeerd alles uit het geheugen te krijgen. Ook "= NULL" heb ik geprobeerd. Het lijkt echter allemaal niet te werken. Ook met google waren dit de enige gevonden mogelijkheden.
Helaas ben ik nog niet zo sterk in classes, gebruiken oke, maar maken, nee :)
Het zal vast iets heel kleins en makkelijks zijn!
Gewijzigd op 01/01/1970 01:00:00 door Sneeuwvlok
Bovenaan neerzetten: ini_set("memory_limit","12M");
GaMer13 schreef op 08.07.2007 14:46:
Bovenaan neerzetten: ini_set("memory_limit","12M");
Daarmee stel je alleen maar het probleem uit. ik wil dat het geheugen telkens opgeruimd wordt. Jij vergroot het geheugen, als die dan weer meer pdf bestanden per keer wil genereren krijgt die weer een probleem.
is 16MB niet heel veel?
Jurgen schreef op 08.07.2007 15:22:
is 16MB niet heel veel?
Hm, de pdf's die gegenereerd worden zijn vrij groot, en het gaat om tientallen PDF's, en dit gebeurd al bij de 4e. 'k hoop toch nog op een oplossing, ik begrijp ook niet waarom dat geheugen open blijft staan.
kan dat niet met ob-clean of vergis ik me?
dit artikel tegen vandaag. Misschien interessant.
Ik kwam toevallig Freek schreef op 08.07.2007 21:58:
kan dat niet met ob-clean of vergis ik me?
ob-clean? ik kan er niet veel informatie over vinden op het web, maar kan je het mss een beetje toelichten?
Jelmer schreef op 08.07.2007 22:47:
Ik kwam toevallig dit artikel tegen vandaag. Misschien interessant.
Interessant artikel, echter kan ik het niet gebruiken bij het oplossen van dit probleem, toch bedankt
Heb je al op php.net gekeken? Ik dacht iig dat het bedoelt was om het tijdelijke buffer op te ruimen, kan je het niet gewoon eens proberen toe te passen? dat je na elk gemaakt pdf'je een ob_clean(); ding doet.
Is je geheugen probleem nou opgelost Sneeuwvlok?
Freek schreef op 09.07.2007 17:18:
Is je geheugen probleem nou opgelost Sneeuwvlok?
Ik heb m'n probleem inderdaad nu opgelost, via passthru,
In ieder geval heb ik het nu opgelost door met ob_start, de output opvangen van passthru, en daarna de output in een string zetten. Werkt goed :) het enige is dat mensen met safemode nu wat gedoe krijgen.
Het word alleen wel minder gebruiksvriendelijk. Ik zorgde er altijd voor dat het wilde werken met safe mode, maar nu word dat moeilijker: het kan wel, maar dan moeten de gebruikers wel netjes de openbase_dir instellen, en een temponary directory opgeven.
Zonder temp. directory kan het ook werken, maar dat vereist een hoop meer code: het PDF-generate script moet dan de HTML zelf ophalen. Of weet iemand of ik als argument ook een hele HTML code kan meegeven aan passthru? Dat zou handiger zijn. Normaal kun je dat op de command line prima doen, maar dat werkt nu even anders.
Ik ga nog even wat experimenteren. In ieder geval bedankt voor alle info mbt geheugenlegen... hier mag PHP nog wel eens wat aan gaan werken. Ik las dat in PHP 6 safe-mode helemaal gaat verdwijnen trouwens... dat word nog wat.
ik ben bang dat je basis opzet iet wat rammmelt.
wat probeer je ongeveer te berijken...