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.
Zobrazeno 12 zpráv z 12.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
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.