Diskuze: Boj s pamětí v PHP
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Tvůrce

Zobrazeno 12 zpráv z 12.
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Ahoj,
tak otázka také je, kdy tu chybu dostaneš,,, zda-li už při include... nebo
později.
Proč třeba nezabalíš soubory najednou a neoddělíš to od jejich
generování?
Předpokládám, že by se ti to pak lépe odlaďovalo ...
Z kódu není třeba patrná velikost proměnné $prubeh ...
takže bych zkusil nejdříve pouze vygenerovat všechna PDFka... pokud to
projde.. tak po vygenerování všechna zabalit, pokud to nepůjde tak po jednom
třeba podle idk...
$mpdf->WriteHTML($prubeh);
nezabere tohle reseni 2x tolik pameti co zabere sama promenna prubeh?
Pozn.: Bylo by fajn, kdyby odpovedet fungovalo jako odkaz, s moznosti pres prave tlac. otevrit v novem okne. Vlevo bych mel okno se zadanim, vpravo okno s okenkem pro odpoved.
1) ini_set('memory_limit', '512'); // na zacatku programu si zmen limit, nebo v .htaccess nebo php.ini memory_limit = 256M, php_value memory_limit 256M
$zip->close(); // ok
$mpdf=null; // ok
unset($mpdf); // ok
$zip->close(); // ok
Nelibi se mi tam to mpdf. Tam by to chtelo zkouknout kod. Nejspis duplikuje
spoustu veci. A nebo proste pocitej s tim, ze budes potrebovat trochu vic
pameti. Ostatne, tomu by odpovidala i ta chybova hlaska. Pamet dosla, kdyz
vykonaval prikaz na radku...
/volume1/web/mf/mpdf.php on line 30620
Mrkni, co tam je a pripadne to nech cele zkouknout, kdy to zabere kolik
pameti.
function m($name='') {echo $name.' '.memory_get_usage().'<br>';}
a na zacatku kazde funkce dej m() nebo m('jmeno funkce')
Pripadne to vyresit nejak elegantne pres classy se da pridat neco, co se pusti
jeste pred funkci, tusim. Pouziva to tusim nette pro lepsi vypis chyb. Ja nic
takoveho nepouzil, zatim a ani v tom nevidim prinos, prilis.
4)
"SELECT * FROM sas_uzivatel2 WHERE id IN (SELECT DISTINCT(idk) FROM
sas_prubeh_sluzby2 WHERE datum>=? AND datum<=?)"
Jak dlouho sql provadi jen tento samotny dotaz? A Koli mu to veme pameti? Neslo
by to napsat logicteji, treba opacne?
SELECT DISTINCT(idk) FROM sas_prubeh_sluzby2 LEFT JOIN uzivatele... WHERE
datum>=? AND datum<=?
Ano, mPDF je velká knihovna pro tvorbu PDF souborů, ale obyčejná tvorba bez toho je pro mě za trest - pozicování každého prvku (x,y), takto schroupe html a hotovo.
Chyba nastane cca v půlce, dejme tomu po 30 minutách běhu, zkusím tedy vygenerovat všechny PDF, zda to projde a pak celou složku zabalit, zatím díky.
Ahoj, bohužel nemohu změnit limit paměti, do ini nemám přístup a změna v htaccess není povolena a ani v samotném skriptu, zkusím to zkoumat přes memory_get_usage(), tak uvidíme,, zatím děkuji.
Tak jiny pdf generator.
A ty predchozi pdf jsou spravne?
A v kodu neni ani z ceho ziskavas $prubeh? Jestli treba nezapisuje nahodny
retezec z pameti nebo tam nemas nekde scitani. $prubeh.=neco;
Jo, a jak pise Hynek, mozna se v te funkci duplikuje promena, ikdyz nic
takoveho nepotrebujes.
$mpdf->WriteHTML($prubeh);
... function WriteHTML($prubeh);
... function WriteHTML(&$prubeh); // preda pointer - to by mohlo byt
pomalejsi, ale uspornejsi na pamet
unlink($cesta.$file);
nejdriv to ulozis a pak soubor smazes?
Ano, to bych se mohl podívat
Vše je správně, uloží se mi do zipu přes 20 funkčních pdf souborů
$prubeh získávám z dalšího dotazu DB, tzn., nejdřív se ptám:
ukaž mi všechny uživatele mající zápis v zadaném období (* v dotazu z
důvodu, že ty informace o uživateli zapisuju také do pdf)
a další dotaz je:
ukaž mi všechny záznamy daného uživatele
to vše postupně ukládám do proměnné $prubeh a pak předám mPDF, ale
$prubeh se mi nezvětšuje, protože na začátku dalšího uživatele opět
$prubeh přepíšu novými daty dalšího uživatele
mohu to zkusit s tím pointerem
co se týče unlink, tak původní soubor mohu smazat, když už ho mám v tom
zipu
Přijde mi trochu zvláštní tento kontext...
include("mf/mpdf.php");
....
foreach($uzivatele as $uz)//jedu uživatele
{
...
$mpdf->WriteHTML($prubeh);
...
}
Není mi jasné zda to prochází jednoho uživatele nebo několik
uživatelů?
Pokud jednoho uzivatele - proč je tam foreach?
Pokud několik, jak to, že se nemění $prubeh? Ani nemá index. Tj. ke všem
uživatelům se vloží stejný obsah.
Pokud se $prubeh mění podle uživatele mimo zde uveřejněný kód a
následně se tento výše uvedený spouští, nerozumím tedy neustálému
include a foreach...
Jo, to prave napsal, ze nas osidil a dulezitou cast kodu a napsal jen tu, co si myslim, ze je v ni problem. A v ni zrovna asi problem neni.
https://www.php.net/…icrotime.php
Zkus upravit ten example1 tak, aby vypsal cas a schvalne zkus vypis casu pred
dotazem a po dotazu. Pokud to trva dlouho, tak mas dotaz spatne a urcite to jde
lepe Pripadne nemas spravne
nastavene indexy v sql tabulce. Jak jsem psal minule, ten tvuj dotaz te v
podstate zajima z opacneho konce. Dodatecne info si muzes pridat LEFT JOINem.
Zkus si odpovedet na otazku, co chces mit jako vysledek z dotazu. A tou tabulkou
bys mel zacit, kde jsou takove udaje.
'ukaž mi všechny záznamy daného uživatele'
SELECT a.*, b.sloupec AS id2 FROM uzivatele_vazebni a LEFT JOIN uzivatel ...
WHERE a.user_id IN (...) ok, ale...
chces vsechno, co najdes k uzivateli
SELECT sloupce FROM uzivatele a LEFT JOIN uzivatel_terminy b ... WHERE
b.datum1... and b.datum2
IN je ok, ale SELECT ti vybere nejaka data, ktera pak uz nejsou indexovana. Takze IN ma mnohem pak nepracuje s indexem. Tusim, ze index muzes nastavovat u tmp a cursor pomocnych tabulek.
Zobrazeno 12 zpráv z 12.