Autor Zpráva
Majkelju
Profil
Dobrý den,

níže uvedený kód mi hází chybu Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 79 bytes) in /home/users/estiroad/estiroad.com/web/mpdf/mpdf.php on line 3004 ... Nevím, jestli je to špatně napsaným kódem, i když ten mi nepřijde nijak složitý, nebo tím, že používám mPDF ... nějaké návrhy, jak se chyby zbavit?

<?
if($sestava == 3){
$result = $db->query("
    SELECT
    `stavby`.`id` AS `id`,
    `stavby`.`znacka` AS `znacka`,
    `stavby`.`nazev` AS `nazev`
    FROM `stavby`
    JOIN `stavby_uzivatele`
    ON `stavby_uzivatele`.`k_stavby` = `stavby`.`id`
    WHERE `stavby_uzivatele`.`k_uzivatele` = '". $auth->uid ."' 
    AND `stavby_uzivatele`.`r` = 1
    ORDER BY `stavby`.`znacka` ASC,
    `stavby`.`nazev` ASC");
?>

<div style="border:2px solid black; border-radius:10px; width:100%;  margin-top:5px; margin-left:auto; margin-right:auto">
    <table class="exportTable" cellpadding="0" cellspacing="0" width="100%" border="0" align="center" style="table-layout: fixed">
    <thead>
    <tr class='stred_seda2'><th width="35%">Stavba<br />Stupeň / Značka stupně / Území / CÚ</th><th width="35%">Popis stavby<br />Název stupně</th><th width="10%">Cena MIN<br />[ tis. Kč ]</th><th width="10%">Cena<br />[ tis. Kč ]</th><th width="10%">Cena MAX<br />[ tis. Kč ]</th></tr>
    </thead>
    
    <tbody >
<?

    while($row = $result->fetch_assoc()){
 

?>
    <tr style="background:#F0F0F0">        
        <td ><? echo $row['znacka'];?></td>
        <td colspan="4"><? echo $row['nazev'];?></td>
    </tr>
            <tr>
        <td colspan="5">
<?    
    $idStavby = $row['id'];    
    $result2 = $db->query("
    SELECT 
    `stupne`.`znacka` AS `stupen`,
    `stavby_stupen`.`znacka` AS `znacka`,
    `stavby_stupen`.`nazev` AS `nazev`,
    `cu`.`nazev` AS `cu`,
    `stavby_stupen`.`uzemi` AS `uzemi`,
    `cena`,`cena_min`,`cena_max`
    FROM `stavby_stupen` 
    JOIN `stupne` 
    ON  `stupne`.`id` = `stavby_stupen`.`k_stupen` 
    JOIN `cu` 
    ON  `cu`.`id` = `stavby_stupen`.`k_cu`
    WHERE `stavby_stupen`.`k_stavba` = '$idStavby' 
    AND `stavby_stupen`.`cena` > 0
    ORDER BY `stavby_stupen`.`k_stupen` ASC 
    ");
    
    while($row2 = $result2->fetch_assoc()){ 
?>
    <table border=0>
    <tr style="background:#FFFFFF">

        <td width=50><? echo $row2['stupen']; ?></td>
        <td width=70><? echo $row2['znacka']; ?></td>
        <td width=100><? echo str_replace(array('1','2'), array('Extravilán','Intravilán'), $row2['uzemi']); ?></td>
        <td width=130><? echo str_replace(array('cenová úroveň'), array(''), $row2['cu']); ?></td>
        <td width=349><? echo $row2['nazev'];  ?></td>
        <td class="stred_b" width="100" ><? echo number_format(($row2['cena_min']/1000) ,0 ,'.' ,$oddelovac_tisicu);  ?></td>
        <td class="stred_g" width="100" ><? echo number_format(($row2['cena']/1000) ,0 ,'.' ,$oddelovac_tisicu);  ?></td>
        <td class="stred_r" width="100" ><? echo number_format(($row2['cena_max']/1000) ,0 ,'.' ,$oddelovac_tisicu); ?></td>
        </tr>
    </table>

<?    }?>
</td>
</tr>    
<?  }?>
    </tbody>
    </table>
    

</div>

<?}?>
Joker
Profil
Majkelju:
Důvod chyby je jasný, skript vyčerpal veškerou dostupnou paměť.

Otázka je proč, uvedený kód není příčinou. Podle toho souboru mpdf.php bych tipl, že paměť vyčerpá nějaký export do PDF.
Majkelju
Profil
Že by to bylo tak náročné? :( Teď ale, co s tím... našel jsem různé rady, že jde nastavit maximální paměťový limit v nastavení php...já tu ale žádnou složku s php nemám, takže to ani nemám kde nastavit.


Ještě bych měl dodat, že tento skript je odvozený od jiného, který mi funguje. Ten se liší jen v jednom řádku - V druhém SQL dotazu je přidána podmínka AND `stavby_stupen`.`default` = 1 , která jen trochu omezí výběr....je možné, že to nalezne příliš mnoho záznamů? To je asi blbost, ne?
Chro
Profil
Pokud nemáš možnost to nastavit mimo skript, zkus do skriptu na začátek přidat
ini_set('memory_limit', '256M');
nastaví pamět na 256 megabajtů.
Ugo
Profil
32 mega je fakt dost málo, i když je smutné že ten skript potřebuje tolik, přecijen byly doby kdy tolik neměl ani disk a i tak se daly i složitější operace, zkus kouknout na pár místech kolik paměti máš využito, abys věděl kolik vemeš ty a kolik mpdf, čili zda-li se nechá nějak rozumně optimalizovat

function getMem() {
  $size = memory_get_usage(true);
  $unit=array('b','kb','mb','gb','tb','pb');
  return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
}
Majkelju
Profil
Chro: Bohužel toto nepomáhá, ani když to zvednu na 2048M
Ugo: Zkusil jsem to dát všude možně na stránce (přičemž jsem zakomentoval vypisování dat, aby se vůbec něco zobrazilo) a jediný údaj, co jsem z toho dostal, je 17.25MB ...akorát nevím, jak s tím číslem teď naložit :) Mě ten kód hlavně přijde už tak dost jednoduchý, netuším, jak by se to dalo optimalizovat...
Joker
Profil
Majkelju:
Bohužel toto nepomáhá, ani když to zvednu na 2048M
To bude nejspíš muset zvednout hosting.
Medvídek
Profil
Majkelju:
Já to zkoušel teď na svým projektu, vyexportoval sem si události do PDF za poslední měsíc. Cca 3500 záznamů z toho asi tak 300 fotek a mPdf si vzalo 39MB paměti.
Tori
Profil
Majkelju:
Můžete ukázat kód, kterým generujete PDF? Nemůžou se někde kumulovat data v proměnné (např. zapomenutý řádek $promenna = '' na začátku cyklu apod.)?
Majkelju
Profil
<?php

session_start();

include('../safe/autentizace.class.php');
include('../mpdf/mpdf.php');
include('../_mysql.php');

$auth = new autentizace($db);

$oddelovac_tisicu = " ";
$ids = $_GET['ids'];
$sestava = $_GET['sestava1'];

$mpdf = new mPDF(
    'utf-8',        // mode - default ''
    'A4',        // format - A4, for example, default ''
    0,      // font size - default 0
    '',        // default font family
    15,        // margin_left
    15,       // margin right
    10,     // margin top
    16,        // margin bottom
    9,      // margin header
    9,        // margin footer
    'L'
);  // L - landscape, P - portrait

$mpdf->SetDisplayMode('fullpage');
$mpdf->list_indent_first_level = 0;  // 1 or 0 - whether to indent the first level of a list

ob_start();
if($sestava==1)      echo '<img style="float:left; margin-top:0px; width: 147px; height: 28px;" src="http://www.estiroad.com/obrazky/design2/logo_velke.png" alt="Logo - Správa cen dopravních staveb"><div style="margin-left:327px; margin-top:0px; font-size:20px"><span style="font-size:10px">Sestava 1.1</span> - Přehled staveb</div>';
else if($sestava==2) echo '<img style="float:left; margin-top:0px; width: 147px; height: 28px;" src="http://www.estiroad.com/obrazky/design2/logo_velke.png" alt="Logo - Správa cen dopravních staveb"><div style="margin-left:402px; margin-top:0px; font-size:20px"><span style="font-size:10px">Sestava 1.2</span> - Přehled staveb s rozpisem hlavních variant</div>';
else if($sestava==3) echo '<img style="float:left; margin-top:0px; width: 147px; height: 28px;" src="http://www.estiroad.com/obrazky/design2/logo_velke.png" alt="Logo - Správa cen dopravních staveb"><div style="margin-left:425px; margin-top:0px; font-size:20px"><span style="font-size:10px">Sestava 1.3</span> - Přehled staveb s rozpisem všech variant</div>';
    
    echo '<hr />';
    echo '<div style="height:597px;">';
    require './stavby_data.php';
    echo '</div>';
    echo '<hr />';
    echo '<div class="vygenerovano">Vygenerováno dne '. Date("d.m.Y").'</div>';

$html = ob_get_clean(); 
if($sestava!=1)
$mpdf->AddPage('L');
$mpdf->WriteHTML($html);

$mpdf->Output();


 ?>

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: