Autor Zpráva
danhill
Profil
Ahoj,
na JS jsem fakt lama, tak se jdu spíše jen poradit jako moc je složité udělat to co bych si představoval.
Na web si nahrávám větší xml soubory. V extrémních případech mohou mít až 100MB.
Nahrání takových souborů nějakou dobu trvá, to by až tak nevadilo, protože aspoň chrome má ve spodní liště procentuální hodnotu hotového uploadu.
Ale potom daný soubor zpracovávám ve foreach. A to samozřejmě u tak velkých souborů trvá třeba i půl minuty.

Jak moc je reálné, udělat pro takový foreach progress bar nebo jakékoli jiné ukazovátko třeba na základě známé velikosti souboru?
Veškeré mé pokusy ztroskotaly a co jsem na netu našel nic mi nefungovalo.
z toho co jsem zkoušel se asi mi nejvíce líbilo použití něčeho čemu se asi říká EventSource
Ale tohle se mi a dle příspěvků pod článkem ani ostatním nepodařilo rozchodit ...

moje představa by asi byla, pro začátek, kdybych si dokázal zobrazit aktuální číslo smyčky foreache ($i++)
Už to by byl pro mě úspěch ...

mé php na zpracování souboru má asi takovou strukturu:
Klasický form
<input type="file" name="fileToUpload" id="fileToUpload" />
<input type="submit"  value="Upload" name="submit" />
a po odeslání formu pracuje php
if(isset($_POST["submit"])) {
        //controller zajistí uložení souboru na serveru a zkontroluje,zda odpovídá požadavkům.Pokud ano, vrátí "1"
    include ("upload_controller.php");
    
    if ($uploadOk == 1) {
        //pokud se soubor bez chyb uploadoval,pak ho necháme zpracovat enginem
        include ("upload_engine.php");
    }
}

V enginu je pak právě ten dlouhotrvající foreach, který soubor zpracuje, vybere požadované hodnoty atd...
Dusann
Profil
danhill:
moje představa by asi byla, pro začátek, kdybych si dokázal zobrazit aktuální číslo smyčky foreache ($i++)

PHP štandartne počas vykonávania skriptu drží celý output v bufferi. Sú dve vstvy bufferu v PHP: prvú vrstvu/buffer riadiš cez funkcie s prefixom ob_...(), tento buffer je defaultne vypnutý. Za ním nasleduje ďalší buffer, ktorý môžeš vyprázdňovať pomocou flush() funkcie.

Vo foreach loope teda po každom výpise použi flush(); čo spôsobí že output je počas vykonávania skriptu priebežne odosielaný do aktívnej HTTP response správy. Ak za týmito PHP buffermi neexistuje nejaký ďalší buffer, tak výpis by si mal vidieť priebežne v browseri. Pozor, browser ale musí prijať určité množstvo znakov pred prvým výpisom.
danhill
Profil
Mohl bych poprosit o trochu example abych to lépe pochopil a mohl vyzkoušet?
Děkuji moc.


Respektive, když kouknu na popis funkce flush()
tak hned první příklad funguje asi přesně jak bych si představoval.
Ale výsledek se zobrazuje někde jako mimo hlavní stránku,jakoby se přesměrovalo jinam ...
if (ob_get_level() == 0) ob_start();

for ($i = 0; $i<10; $i++){

        echo $i;

        ob_flush();
        flush();
        sleep(1);
}

echo "Done.";

ob_end_flush();

Tohle sice hezky vypíše čísla,což by mi bohatě stačilo,ale za sebou, a já bych ale potřeboval aby se mi měnilo jedno číslo zobrazené "echované" někde v <body> stránky a ne v foreach samotném.

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: