Miten tehdään streamiin kirjoittaminen sitä mukaa kun dataa valmistuu?
header("Content-type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=data.xls");
for ($i=0; $i
header("Content-type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=data.xls");
for ($i=0; $i
Vastaukset 4
Vanhimmat
http://php.net/manual/en/book.outcontrol.php
esmes alussa ob_end_flush() ja sitten flush() siellä for-loopissa.
ongelmallista Excelin käsitellä "streamina" koska ihan viimeisissäkin datoissa
saattaa olla jotain joka ohjaa koko datan käyttäytymistä.
Kirjoitin alkuperäisen viestin turhan epäselvästi ja esimerkissä oli liikaa liikkuvia osia, sorry. Yritän siis saada aikaan sellaista, että kun serveri pukkaa ulos tekstiä niin se tulisi selaimelle välittömästi eikä vasta kun skripti on ajettu. Esim. taulukon ensimmäinen rivi näkyisi jo selaimessa kun toista riviä vasta generoidaan serverillä. Se, että selaimelle kerrotaan että data pitää avata Exceliin (noi header-lauseet) ei ole oleellista, ne vain sattui turhaan jäämään esimerkkiin. Sleep(1) taas on koodissa siksi, että loopin suoritus kestäisi jonkin aikaa ja ehtisi nähdä tuleeko data pätkittäin vai kerralla.
Kiitos linkintä flushiin. Flush ei kuitenkaan auttanut. Linkin takana kyllä kerrotaan, että
"flush() may not be able to override the buffering scheme of your web server and it has no effect on any client-side buffering in the browser. ... Several servers, especially on Win32, will still buffer the output from your script until it terminates before transmitting the results to the browser."
Serverinä on Apache Win32-ympäristössä. Siitäköhän tässä on kyse? Mulla on Java-servletti joka tekee samaa Win32-Tomcatissa ja sieltä data tulee hienosti pätkittäin sitä mukaa kun sitä tulostetaan.
Löysin netistä tämmöisen. Se toimii, vaikka en ihan kokonaan tiedä miksi :-)
function forceFlush() {
ob_start();
ob_end_clean();
flush();
@ob_end_flush();
}