Autor Zpráva
jaa
Profil *
Zdravím,

mám dotaz ohledně jQuuery ajax funkce. AJAXem posílám pomocí POST data php třídy, která zpracuje formulář a vykreslí graf. Pokud ale uživatel zadá příliš velký rozsah, skončí to php chybou memory limit exceeded. Jak ajaxem tu chybu odchytit a spustit funkci pro chybu?

Zkoušel jsem error: function ... ale stejně ajax skončí "úspěšně" a vypíše pomocí html() php chybu na stránku místo grafu... Nemáte s tím někdo zkušenosti?

Díky za případné odpovědi
weroro
Profil
Ajax v jQuery som nikdy nepotreboval ale predpokladám, že error sa vykoná iba v prípade ak server pošle hlavičku inú ako 200 OK, to znamená, že ak potrebuješ odchytiť chybu ktorá vzniká chybou pri spracovávaní dát v PHP, musíš ju odchytávať priamo v onload a tam dať podmienku, že ak server odošle chybovú hlášku, tak sa vykoná chybová funkcia a ak hlášku neodošle, tak normálne dáta vypísať/spracovať ako to máš teraz.
xROAL
Profil
Keď v PHP nastane chyba, PHP ju jednoducho vypíše, ako akýkoľvek iný výstup. AJAX nemá podľa čoho usúdiť, že sa jedná o chybu, pretože dostane stavový kód 200, čo znamená, že server na požiadavku úspešne odpovedal.

Neviem, či je možné "memory limit exceeded" v PHP odchytiť a reagovať naň vlastným error handlerom, ak však hej, môžeš poslať iný stavový kód už z PHP pri chybe (ktorý AJAX odchytí a zachová sa podľa neho).
Druhá možnosť je zistiť v JavaScripte či ti PHP skript vráti chybu (napr. kontrolovať výskyt nejakého slova/frázy) a spustiť podľa toho príslušnú funkciu.
Keeehi
Profil
Vypisování php chyb by na produkčním servru vůbec nemělo být zapnuté! Při vypnutém výpiu chyb pak php s apachem při standardní konfiuraci vracejí prázdnou odpověď s kódem 500 Server Error.
jaa
Profil *
xROAL:
pátral jsem po vlastní ose a zjistil jsem v podstatě to stejné. Asi nemá smysl se s tím pro tento účel tak složitě zabývat. Nastavil jsem pravidla pro výběr data od a do v určitém maximálním rozmezí, takže větší nelze vybrat. Tím jsem myslím problém vyřešil. Otestoval jsem to a mám tam ještě slušnou rezervu, pro strýčka příhodu. Zároveň i range je podle mě dostačující, takže pro mě asi vyřešeno :)

Ale díky všem za rady, zase jsem o něco chytřejší


Keeehi:
zatím to mám v debug módu, takže hlášky samozřejmě vidět chci. Zkusím vypnout a uvidím, co se stane...


Tak je to opravdu tak :) Pokud vypnu hlášky, tak mi AJAX vyhodí chybu.

Díky moc, to by mě snad ani nenapadlo.
mimochodec
Profil
Taky bych se možná zamyslel nad tím php. Nefunguje to náhodou špatně proto, že to je špatně napsané?
jaa
Profil *
mimochodec:
funguje to tak, jak má... Bohužel, jde o výpis dat z čidel, která se logují po pěti minutách. Pokud uživatel zadá rozsah, že chce vyjet záznamy za poslední 4 roky, je to 12*24*30*365*4 záznamů. To je trošku moc. Dotaz už víc optimalizovat nejde. Požadavek ale je ze zadaného rozsahu vytvořit graf -> stránkování mi tady nepomůže (to můžu použít maximálně při tabulárním výpisu hodnot).

Takže, mám omezení na určitý rozsah, který jsem si ozkoušel a je nastaven tak, aby php bylo s daným nastavením schopno dotaz zpracovat (samozřejmě s jistou rezervou). K tomu jsem chtěl ještě hlášku, kdyby náhodou došlo k překročení limitu i přes nastavení povoleného rozsahu. Pro uživatele je přece jen lepší, když uvidí hlášku "hele lojzo, máš moc velkej rozsah" než když vše proběhne, ale graf se nevykreslí. Pochybuju, že by ho něco o nedostatku paměti napadlo.

Takže tak. Ošetřený to je jak na úrovni JS, tak na úrovni php, aby nedešlo k překročení limitu paměti. Bohužel nejsem schopen ovlivnit zapisování dat z těch čidel a narazil jsem na období, kdy jsou v DB záznamy duplicitní (tzn. jedno čidlo v jednu danou dobu vykazovalo 2 až tři hodnoty). Nevím, co se kde stalo, toto není moje záležitost. Já jen potřebuju, aby zobrazování dat proběhlo korektně bez chyb.
Keeehi
Profil
jaa:
Ta 30 je počet čidel? Pokud má reprezentovat počet dní v měsíci, pak to zase nemůžeš násobit 365 ale 12. Pro jedno čidlo to je tedy 300 000 hodnot. Není to zanedbatelné množství ale nic extra to taky není. Co je ale důležité je to, že v dost případech si všechny data nemusíš pamatovat celou dobu. Ty co už nepotřebuješ můžeš zapomínat a ty co budeš teprve potřebovat v budoucnu můžeš načítat postupně. Takže pamětí sice projde stejně velké množství dat, ovšem postupně, takže limit se nepřekročí. Ukaž nám ten kód a třeba to budeme schopni upravit tak, aby to fungovalo i s neomezeným rozsahem.
jaa
Profil *
Keeehi:
jo, jasně. ta 30 tam být nemá.

Vím, že by to šlo vyřešit i jinak, a data načítat postupně, napadlo X řešení, jak to smysluplně vyřešit:

- při velkém rozsahu načítat například jen záznamy po hodinách, při ještě větším po dnech a ty pak při přiblížení grafu načítat podrobněji v nějakém užším rozsahu.
- graf by uměl "stránkovat" podobně jako data v tabulce - zobrazil by se jen nějaký užší rozsah (případně s kombinací výše popsaného) a ten by se při posouvání načítal dál
- kombinace předešlých řešení
- víc grafů pro určité rozsahy
.....

všechno je to ale otázka smyslu. Pro tento účel, kdy se na to jednou nebo dvakrát za rok někdo podívá, ukáže auditorům, že hodnoty logujeme a jsme schopni je dohledat, je to myslím takto dostačující. Nemyslím si, že by někdo chtěl projíždět graf byť jen s rozsahem třeba 2 měsíců, i to je obrovské množství hodnot. Spíš se někdo podívá například jaké byly hodnoty v tu a v tu hodinu. Kvůli tomu nemám v úmyslu trávit čas na vyladění grafu, který sice bude umět načíst trilion řádků z tabulky, ale stejně to nikdo nevyužije :) Já jen mám rád, když si můžu všechny varianty chování ošetřit. Kdyby někdo šťoural a chtěl si zkusit, co to dokáže, tak aby viděl hlášku, že toho chce moc a hotovo.

Jinak graf mi vykresluje nějaká free knihovna z netu, která potřebuje vypsat hodnoty přímo do stránky. Takže i toto je limit - asi nejzásadnější. Ale jak píšu, nemá smysl se párat s grafem, který by si tahal data sám ajaxem podle potřeby, nebo složitě řešit jiné způsoby, když k situaci výše popsané s největší pravděpodobností nikdy nedojde. Navíc mi byla kladena na srdce priorita času... :)

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

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