WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Visa resultat direkt i WHILE-loop i PHP ? (https://www.wn.se/forum/showthread.php?t=28858)

Bergman 2008-04-23 12:03

Någon som har nåt bra tips på hur man visar resultat direkt i en WHILE-loop i PHP? Jag har problem med att sidan en sida tar väldigt lång tid att ladda pga av en loop i scriptet. i WHILE-loopen så är det lite ECHO:s så det är inget komplicerat. Däremot så vill jag visa varje ECHO rad för rad lixom ... hoppas ni förstår vad jag menar och har nåt bra tips hur jag ska lösa det.

while($row = mysql_fetch_array($quer)) {
echo "Text".$row['Data'];
}

Mvh Bergman

coredev 2008-04-23 12:06

Kort svar: http://se2.php.net/flush

Fast du är nog ute på hal is. Dito loopar äter CPU.

Bergman 2008-04-23 12:09

Tack för snabbt svar!

Har du något bra tips på hur man kan visa att något händer bortsett från flush?

Det är ett admin-script som inte användarna ser men risken är att administratörerna kör en "Reload" mitt i för att dom tror att det hängt sig.

coredev 2008-04-23 12:29

Finns flera sätt..

A: http://se2.php.net/ignore_user_abort

B: Starta ett bakgrundsjobb via CURL

etc.. :)

Good luck!

Bergman 2008-04-23 12:46

En annan variant kanske är att man minskar antalet steg i loopen och sedan laddar om sidan och fortsätter. Kanske är det smidigaste när jag tänker efter

martine 2008-04-23 15:41

Om du behöver skriva ut så mycket data så att det tar för lång tid så dela upp det på flera sidor med 25 eller 50 poster på varje - sedan får användaren bläddra. Det är det vanliga sättet att lösa det på.

Annars om det är nödvändigt av någon anledning att alla poster kommer på "ett blad" så gör en download-knapp och låt användaren ladda ner listan (då har man förståelse för att det tar tid).

Du kan ju också förstås göra något med ajax, t.ex. "Hämtar rad 1…", "Hämtar rad 2…", osv. då är det nog ingen som avbryter om det nu inte är så att de inte alls vill/orkar se allt innehåll.

Om innehållet i databasen är någorlunda statiskt så kan du ju spara det i en textfil som du inkluderar (och uppdaterar då och då på något lämpligt sätt, t.ex CRON).

Vad är det för data som är så omfattande att den inte vill ladda ner snabbare? Eller är det så stora mängder?

Magnus_A 2008-04-23 15:52

Citat:

Originally posted by Bergman@Apr 23 2008, 12:03
Någon som har nåt bra tips på hur man visar resultat direkt i en WHILE-loop i PHP? Jag har problem med att sidan en sida tar väldigt lång tid att ladda pga av en loop i scriptet. i WHILE-loopen så är det lite ECHO:s så det är inget komplicerat. Däremot så vill jag visa varje ECHO rad för rad lixom ... hoppas ni förstår vad jag menar och har nåt bra tips hur jag ska lösa det.

while($row = mysql_fetch_array($quer)) {
echo "Text".$row['Data'];
}

Mvh Bergman

Dela upp hämtningen

Kod:

$result=array();

while($row = mysql_fetch_array($quer)) {
$result[]="Text".$row['Data'];
}


foreach($result as $value){

echo $value;
}

Eller skapa en textsträng direkt:
$result='';
Kod:


while($row = mysql_fetch_array($quer)) {
$result .= "Text {$row['Data']} <br>";
}
echo $result;

Bäst är nog ändå göra som martine föreslår, dela upp resultatet i bitar och bläddra dig framåt och bakåt.

Bergman 2008-04-23 18:23

Det blir nog att dela upp datat i mindre bitar samt försöka optimera MySQL-tabellerna för att snabba upp hanteringen. Det är alltså en massa prisinformation till PrisCentralen.com som uppdateras ganska ofta.

Tack för all hjälp iallafall!

Jonathan P 2008-04-23 20:57

Citat:

Originally posted by Magnus_A@Apr 23 2008, 15:52
Dela upp hämtningen
Kan du förklara för mig hur...
Kod:

$result=array();

while($row = mysql_fetch_array($quer)) {
$result[]="Text".$row['Data'];
}


foreach($result as $value){

echo $value;
}

... skulle kunna gå snabbare än...
Kod:

while($row = mysql_fetch_array($quer)) {
 echo "Text".$row['Data'];
}

?

;)

Magnus_A 2008-04-23 21:39

Nej, det kan jag inte, men tro det eller ej, det går fortare när det är väldigt många rader.

eg0master 2008-04-24 06:15

Citat:

Originally posted by Magnus_A@Apr 23 2008, 21:39
Nej, det kan jag inte, men tro det eller ej, det går fortare när det är väldigt många rader.
Det betvivlar jag starkt. Däremot kan du se en skillnad om du först kör den ena varianten och sedan den andra eftersom det är samma fråga som körs och databasen då vid andra körningen kommer ha en del interna strukturer cachade. Därför kommer den andra körningen bli klar snabbare. men det beror inte på din kod utan att databasen inte behöver göra riktigt samma arbete båda gångerna.

Magnus_A 2008-04-24 08:51

Jag beklagar, men jag kan bara redovisa de resultat jag får fram. Och jag känner till mysql:s frågechache och har kompenserat för den genom att ställa samma fråga flera gånger i samma uppkoppling.
Gör gärna försöket själv och posta här om du får andra resultat.

Jonathan P 2008-04-24 09:45

Citat:

Originally posted by Magnus_A@Apr 24 2008, 08:51
Jag beklagar, men jag kan bara redovisa de resultat jag får fram. Och jag känner till mysql:s frågechache och har kompenserat för den genom att ställa samma fråga flera gånger i samma uppkoppling.
Gör gärna försöket själv och posta här om du får andra resultat.

Jag kan med 100% säkerhet säga att det går snabbare att loopa igenom resultatet en gång istället för två....

SimonP 2008-04-24 10:26

Ja, det är rätt logiskt, en loop är bättre. Jag testade även det, det varierade mellan 5-10% snabbare.

EmilIsberg 2008-04-24 15:41

Citat:

Originally posted by Bergman@Apr 23 2008, 12:03
Någon som har nåt bra tips på hur man visar resultat direkt i en WHILE-loop i PHP? Jag har problem med att sidan en sida tar väldigt lång tid att ladda pga av en loop i scriptet. i WHILE-loopen så är det lite ECHO:s så det är inget komplicerat. Däremot så vill jag visa varje ECHO rad för rad lixom ...
Om du använder dig av en UNIX-server kan du använda följande rad i .htaccess:
Kod:

php_value output_buffering 0
Då kan du använda något liknande följande PHP-kod för att se utmatningen innan hela skriptet har laddats klart (eller mer exakt innan utmatningsbufferten är full):
Kod:

for($i=0;$i<20;$i++)
{
 sleep(1);
 echo "<span>$i</span><br>\n";
 flush();
}

Du kan läsa mer om output_buffering på:
http://se2.php.net/manual/en/ini.php#ini.list
http://se2.php.net/manual/en/outcont...tput-buffering


Alla tider är GMT +2. Klockan är nu 09:41.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson