[PHP] foreach buffered ?

Pagina: 1
Acties:

Onderwerpen


  • Av3ng3rtje
  • Registratie: December 2002
  • Laatst online: 18-08 10:15
Hallo,

Ik ben bezig met een scriptje wat xmlfeeds leest daaruit informatie uithaalt en een array opbouwt en die vervolgens in een database stopt. Om de gebruiker op de hoogte te houden van hoe snel het verwerken van een item gaat heb ik een teller er op gebouwd. Elke keer als er een item verwerkt is doe ik flush() en zou het de echo die er invoor komt op het scherm toveren, dit is echter niet het geval , hij buffert namelijk de flush een aantal keer en flusht hem dan.

Neem een kijkje naar me code:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
        //files is een array waarvan de value de bestandsnaam bevat
        foreach($files AS $k => $v) {
            
            //lees alle lines in van het bestand en plaats ze in een array
            $lines = file($this->pathSaveID . $v);
            
            //maak een nieuw object aan om een item te verwerken
            $item = new ItemInfo();
            
            //doorloop alle lines een voor een
            foreach($lines AS $line) {
                
                $line = trim($line);
                
                if (empty($line)) continue;
                
                //bekijk of het record al bestaat
                if ($sql->RecordExists('items', 'itemID', $line, $sql) != 0)
                {
                    continue;
                    
                } // end if
                
                //start timer
                $b = (array_sum(explode(" ", microtime())));
                
                //verzamel  informatie , bouw een array, maak een query en zet ze in de database.
                $sql->query($this->CreateInsertQuery("items","itemID",$line,$item->createItemArray($line)));
                
                $b = (array_sum(explode(" ", microtime())) - $b);
                
                //gooi de array in het object leeg
                $item->clearItemArray();
                
                //het aantal items gedaan
                $items++;
                
                //totale tijd versterken
                $ttime += $b;
                
                //schuif een element van de array af
                array_shift($timesAverage);
                
                //zet er weer eentje in voor het gemiddelde
                $timesAverage[] = $b;
                
                //tel het gemiddelde 
                $average = array_sum($timesAverage) / count($timesAverage);
                $oTime = $ttime / $items * ($aItems - $items);
                
                $time = $average * ($aItems - $items);
                
                //assign de waardes in de template.
                $tpl->assign("file",$v);
                $tpl->assign("timee",$this->filterTime($ttime));
                $tpl->assign("timeor",$this->filterTime($oTime));
                $tpl->assign("timer",(($items < 20) ? 'Calculating...' : $this->filterTime($time)));
                $tpl->assign("itemsr",($aItems - $items));
                $tpl->assign("line",$line);
                $tpl->assign("proctime",round($b, 6));
                
                //echo de template
                echo $tpl->parse("flush");
                
                //flush
                flush();
                
            }
            
        }


de template:

HTML:
1
2
3
4
5
6
7
<script>
<!--
                
document.getElementById('time').innerHTML = 'Busy with: {file} Time elapsed: {timee} Overall time remaining: {timeor} Current time remaining: {timer} Items remaining: {itemsr}';
document.getElementById('textbox').value = "Item: {line} succesfully inserted ({proctime} sec)\n" + document.getElementById('textbox').value;
-->
</script>

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Dit wordt geschreven in de manual:
Several servers, especially on Win32, will still buffer the output from your script until it terminates before transmitting the results to the browser.

Server modules for Apache like mod_gzip may do buffering of their own that will cause flush() to not result in data being sent immediately to the client.

Even the browser may buffer its input before displaying it. Netscape, for example, buffers text until it receives an end-of-line or the beginning of a tag, and it won't render tables until the </table> tag of the outermost table is seen.

Some versions of Microsoft Internet Explorer will only start to display the page after they have received 256 bytes of output, so you may need to send extra whitespace before flushing to get those browsers to display the page.
Ik denk dus dat hier verder weinig aan te doen is.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Terranca
  • Registratie: April 2000
  • Laatst online: 18-09 18:25
Misschien kan je nog kijken bij output buffering (oa ob_flush() etc), werkt bij mij vaak iets beter dan een rauwe flush()

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Of beter idee, is niet proberen een applicatie te maken afhankelijk van hoe de data bij de client aankomt...

Aangezien er nogal verschil zit in hoe ook de verschillende clients dit verwerken. Het is zelfs afhankelijk van je html opbouw hoe en wanneer een browser delen laat zien.

Wil je daar echt je applicatie op bouwen?

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Terranca schreef op vrijdag 12 augustus 2005 @ 01:40:
Misschien kan je nog kijken bij output buffering (oa ob_flush() etc), werkt bij mij vaak iets beter dan een rauwe flush()
ob_flush() heeft toch niets te maken met flushen richting de client? Het enige wat het doet is zorgen dat na het bufferen van de ouput die geflushed wordt als werkelijke output. Je moet hierna nog wel flush() aanroepen wil het direct naar de client gestuurd worden.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • JeRa
  • Registratie: Juni 2003
  • Laatst online: 30-04 10:28

JeRa

Authentic

Michali schreef op vrijdag 12 augustus 2005 @ 09:13:
[...]


ob_flush() heeft toch niets te maken met flushen richting de client? Het enige wat het doet is zorgen dat na het bufferen van de ouput die geflushed wordt als werkelijke output. Je moet hierna nog wel flush() aanroepen wil het direct naar de client gestuurd worden.
Daarom moet je ze ook altijd in combinatie met elkaar gebruiken :)
PHP:
1
2
ob_flush();
flush();

In die volgorde dus. Ervaring leerde me gisteren dat dit ook niet hoeft te werken, buffering is van een hoop factoren aan zowel de server- als de clientside afhankelijk.

ifconfig eth0 down


Acties:
  • 0 Henk 'm!

  • Av3ng3rtje
  • Registratie: December 2002
  • Laatst online: 18-08 10:15
PHP:
1
2
ob_flush();
flush();


Dat werkt in mijn geval, bedankt voor jullie reacties.

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Av3ng3rtje schreef op vrijdag 12 augustus 2005 @ 18:03:
PHP:
1
2
ob_flush();
flush();


Dat werkt in mijn geval, bedankt voor jullie reacties.
Dat werkt terwijl je verder geen output buffering gebruikt? Lijkt me sterk.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • JeRa
  • Registratie: Juni 2003
  • Laatst online: 30-04 10:28

JeRa

Authentic

Michali schreef op zaterdag 13 augustus 2005 @ 13:44:
[...]

Dat werkt terwijl je verder geen output buffering gebruikt? Lijkt me sterk.
Lees de PHP manual eens door zodat ik het niet hoef op te zoeken en te quoten ;) het werk, dus kennelijk maakt PHP vaak gebruik van een interne buffer.

ifconfig eth0 down


Acties:
  • 0 Henk 'm!

  • knopper
  • Registratie: September 2001
  • Laatst online: 07-09 23:05

knopper

Sander Knopper

Pagina: 1