Hoe geheugen leegmaken van class?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Sneeuwvlok

Sneeuwvlok

08/07/2007 14:03:00
Quote Anchor link
beste php'ers
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)
PHP script in nieuw venster Selecteer het PHP script
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)
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
<? 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);
}
?>


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
 
PHP hulp

PHP hulp

16/07/2024 01:44:53
 
GaMer B

GaMer B

08/07/2007 14:46:00
Quote Anchor link
Bovenaan neerzetten: ini_set("memory_limit","12M");
 
Sneeuwvlok

Sneeuwvlok

08/07/2007 14:52:00
Quote Anchor link
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.
 
Jurgen assaasas

Jurgen assaasas

08/07/2007 15:22:00
Quote Anchor link
is 16MB niet heel veel?
 
Sneeuwvlok

Sneeuwvlok

08/07/2007 21:38:00
Quote Anchor link
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.
 
Citroen Anoniem Graag

Citroen Anoniem Graag

08/07/2007 21:58:00
Quote Anchor link
kan dat niet met ob-clean of vergis ik me?
 
Jelmer -

Jelmer -

08/07/2007 22:47:00
Quote Anchor link
Ik kwam toevallig dit artikel tegen vandaag. Misschien interessant.
 
Sneeuwvlok

Sneeuwvlok

08/07/2007 23:07:00
Quote Anchor link
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?
 
Sneeuwvlok

Sneeuwvlok

08/07/2007 23:08:00
Quote Anchor link
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
 
Citroen Anoniem Graag

Citroen Anoniem Graag

09/07/2007 00:16:00
Quote Anchor link
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.
 
Citroen Anoniem Graag

Citroen Anoniem Graag

09/07/2007 17:18:00
Quote Anchor link
Is je geheugen probleem nou opgelost Sneeuwvlok?
 
Sneeuwvlok

Sneeuwvlok

09/07/2007 19:59:00
Quote Anchor link
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.
 
Bart van der veen

bart van der veen

09/07/2007 20:13:00
Quote Anchor link
misschien is het mailen van tientallen pdf ook niet zo leuk voor de mailserver...
ik ben bang dat je basis opzet iet wat rammmelt.

wat probeer je ongeveer te berijken...
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.