Autor | Zpráva | ||
---|---|---|---|
amorekj Profil |
#1 · Zasláno: 3. 2. 2014, 20:07:07
Dobrý den,
předem se omlouvám za hloupou otázku, ale opět nevím, kde dělám chybu. Limit je navýšen na 64MB a stejně nestačí. Údaje bych si chtěl ukládat do PHP z důvodu dalšího použití. Chyba: Fatal error: Allowed memory size of 41943040 bytes exhausted (tried to allocate 536 bytes) on line 23 $i=1; $vypis = mysql_query("SELECT * FROM `--`"); while ($zaznam = mysql_fetch_array($vypis )){ $datum = strtotime($zaznam["od"]); $zarazka = strtotime($zaznam["do"] . ' + 1 day'); while($datum < $zarazka) { $formatovany = date('d.m.Y', $datum); $cas[$i] = $zaznam["apartman"]; $cas[$i."_datum"] = $formatovany; $cas[$i."_jmeno"] = $zaznam["jmeno"]; $cas[$i."_poznamky"] = $zaznam["poznamky"]; $cas[$i."_id"] = $zaznam["id"]; $i++; } } Děkuji za Vaše odpovědi. Za vše jsem moc rád. |
||
Micruss Profil |
#2 · Zasláno: 3. 2. 2014, 20:13:03
Co zkusit omezit počet vypisovaných dat ? A nebo opět navýšit limit na 128mb -.-
|
||
Fisir Profil |
#3 · Zasláno: 3. 2. 2014, 20:13:23
Reaguji na amorekje:
Možná by pomohlo nastavit „zarážku“ přímo v SQL dotazu a pokud nevybíráte všechny sloupce, tak specifikovat, které ano. „on line 23“ Značí, že se paměť zaplnila na této řádce. S největší pravděpodobností bude ale problém někde výše v kódu. |
||
amorekj Profil |
#4 · Zasláno: 3. 2. 2014, 20:28:39
Občas to píše:
Fatal error: Maximum execution time of 30 seconds exceeded on line 23 Z databáze to tahám vše s tím, že se to dole pak přehodnocuje, co je v danou chvíli užitečné - příp. se to zvýrazní a odkazuje na další stránku. Data se ukládají do PHP tím, že se vypíší všechny datumy (co jsou mezi od do) - dalo by se to omezit max. že by se vypisovali jen datumy, kterých se to týká v daném měsíci - tam mám proměnnou $month, nevím ale jak by SQL dotaz měl znít. Webový hosting mi napsal, že většině stačí 32 MB. Já mám 64 MB a prý v kódu mám zbytečnosti, které by se daly odstranit a určitě by pomohly i k rychlosti chodu aplikace. Nahoře je tedy část kódu, která paměť tolik zaplní. |
||
Mike8748 Profil |
#5 · Zasláno: 3. 2. 2014, 21:39:58
amorekj:
já ti nevím, ale ten vnitřní cyklus na řádkách 7-16 podle mě nikdy neskončí (donekonečna plní pole $cas stejnýma datama) dokud ti nedojde pamět (nevidim tam změnu proměnné $datum takže podmínka cyklu bude vždy platit) navíc tam opakovaně vkládáš z DB poznámky (což ti v případě dlouhých textů akorat rychleji sežere paměť) |
||
Micruss Profil |
#6 · Zasláno: 3. 2. 2014, 22:11:24
A taky, místo while($datum....), nechtěl jste dát if?
|
||
janbarasek Profil |
#7 · Zasláno: 3. 2. 2014, 22:35:40
amorekj:
Zkus udělat úplně jednoduchou kontrolu, jestli to náhodou není nekonečný cykl, já to zjišťuji obvykle úplně jednoduše: <?php $i = 0; while (...) { $i++; if ($i >= 5000) { echo 'BACHA: Přetýká zásobník!'; break; } } |
||
amorekj Profil |
#8 · Zasláno: 4. 2. 2014, 00:11:23
Máte pravdu - místo while tam mělo být if :) Děkuji za upozornění.
Ta ochrana je dobrá věc - to určitě začnu používat :) Už mi to jede normálně. Moc dík :) moc moc :) |
||
Keeehi Profil |
#9 · Zasláno: 4. 2. 2014, 00:18:43
amorekj:
„Ta ochrana je dobrá věc“ Mě to zase až tak moc úžasné nepřijde. Při vývoji a testování možná, ale ve finálním kódu to není potřeba. Nejlepší je si nastavit limit už při výběru z databáze jelikož se nepřenáší zbytečná data. |
||
Alphard Profil |
amorekj:
„Ta ochrana je dobrá věc - to určitě začnu používat“ Těžko, neřeší to problém blbě navržené konstrukce, raději investujte více času do návrhu algoritmu samotného. Nesouhlasím ani s tím, že je to rozumné používat to při testování, naopak by to mohlo skrývat chyby. |
||
aDAm Profil |
#11 · Zasláno: 4. 2. 2014, 08:52:31
Přetýká to je dobrej češtin ;)
|
||
Časová prodleva: 10 let
|
0