PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ausgabe der seite noch während des parsen?


CyberAge
01.05.2002, 16:16:16
Ich hatte ja schonmal gefragt, wie man die timeout-sperre umgehen kann, und hierzu auch promt eine funktionierende hilfestellung bekommen. Nun möchte ich allerdings, dass währenddessen die newsletter gesendet werden mir eine rückmeldung gegeben wird, wie weit das script bereits ist. so in der art, dass ein statusbalken wächst. wie kann ich nun, während die php-datei noch geparst wird einen inhalt ausgeben? wenn ich meinen test mit 100 mails durchlaufen lasse, dann kommt immer erst am ende des parse-vorgangs die seite mit komplettem statusbalken. evtl geht es ja erstmal mit ner reinen prozentanzeige bzw. einem balken in textform und nicht als grafik. hier mal der code, der bis hierhin funktioniert:


<?php
if(!$titel || !$text || !$id)
{
header("location: ../index.php?open=error&case=feld");
break;
}
$adressen = "SELECT * FROM `newsletter` WHERE 1";
$adressen_x = mysql_query($adressen, $mydb) or die("Verbindung zur Datenbank nicht Möglich!");
$adressenzahl = mysql_num_rows($adressen_x);
set_time_limit(0);
?>&nbsp;<br><center>
<table bgcolor="#000000" bordercolor="#000088" border="1" align="center">
<tr>
<td bgcolor="#000066" bordercolor="#000066" border="1" align="center"><b><font color="#FFFFFF">Sende-Vorgang</b></font></td>
</tr><tr>
<td bordercolor="#000088" border="1">Insgesamt werden <b><?php echo $adressenzahl; ?></b> Newsletter versendet</td>
</tr><tr>
<td><img src="img/raster.jpg" border="0" hspace="0" vspace="0"></td>
</tr><tr>
<td>&nbsp;<?php
$print = 0;
for($sender=0; $sender<=$adressenzahl; $sender++)
{
$adresse = "SELECT * FROM `newsletter` LIMIT ".$sender.", 1";
$adressen = mysql_query($adresse, $mydb) or die("Auslesen nicht Möglich");
$adresse = mysql_fetch_array($adressen);
mail($adresse, $titel." - Newsletter von Dorsten-Network.de", $text."<p>Sie erhalten diesen Newsletter, weil Sie mit dieser eMail-Adresse in unserer Datenbank eingetragen wurden. Ein Abbestellen dieses Newsletters ist auf www.dorsten-network.de möglich.", "From: [email]noreply@dorsten-network.de
Content-Type: text/html");
$prozent = ($sender / $adressenzahl) * 100;
$balken = round($prozent / 5)-1;
for(; $print <= $balken; $print++)
{
?><img src="img/dotrot.jpg" border="0" height="5" width="20" hspace="0" vspace="0"><?php
}
}
?>
</td>
</tr>
</table>


Ich danke schonmal wieder im Voraus, da ich wieder mit einer schnellen und kompetenten antwort rechne!

CU CyberAge

P.S.: Sorry wegen der Breite, aber der Code ist bei mir im Editor genauso lang!

Coda
01.05.2002, 16:21:45
Sorry das ist nicht möglich. HTTP ist ein verbindungsloses Protokoll und daher kann nur immer die ganze Seite in einem Rutsch übertragen werden, dynamische Inhalte sind nicht möglich. Du könntest höchstens versuchen die Zeit abzuschätzen und mit einem kleinen JavaScript den Balken wachsen lassen, is aber nur ne Idee.

CyberAge
01.05.2002, 16:25:58
Du sagtest gerade, dass es nicht möglich ist, die HTML-Seite anzuzeigen, bevor sie komplett ist, wie soll ich dann einen balken darstellen, der mit javascript zum wachsen gebracht wird (was ja nicht sehr schwer wäre). Ich mößte ja schon eine art rückmeldung bekommen, die dem javascript die ungefähre restdauer sagt, oder?

Coda
01.05.2002, 16:31:03
Ok stimmt geht auch ned. Die Sache lässt sich wohl kaum lösen sorry.

|Coding
01.05.2002, 21:18:45
öhm wie wäre es den mit einem frame für die anzeige ?

CyberAge
01.05.2002, 21:23:45
Da während des parsen keine infos ausgegeben werden, kann man im zweiten frame auch keine anzeige erstellen, oder kennst du da einen trick? wenn ja, dann sag ihn mir bitte!

Progman
01.05.2002, 23:23:30
flush();

Diese Funktion leert ... ach lest selber http://de.php.net/manual/de/function.flush.php

Coda
02.05.2002, 18:11:21
Nützt aber au ned unbedingt was....

CyberAge
02.05.2002, 18:21:14
und warum? wenn du schon so etwas postest, dann begründe es bitte auch, denn sonst muß ich immer extra nachbohren!

Coda
02.05.2002, 19:13:10
Hmm du könntest vielleicht das JS oben einfügen das rausflushen und dann den rest berechnen... aber ich wage zu bezweiflen dass du die Zeit genau berechnen kannst und dann stimmt der balken ned....

ingo
03.05.2002, 16:32:56
hi.
hab vor kurzem ein recht nettes javascript preload script gefunden. man gibt die bilder an, auf die man warten will, bis sie ganz geladen sind, derweil wächst der balken. nach dem fertigen reloaden wird man redirected...

die diskussion hats schon einmal gegeben. bei einem file upload über http gehts nicht, weil du im vorhinein nicht weißt, wie groß die datei ist.. über ftp gehts, da kriegst du was zurück. die zeit zu schätzen ist die einzige möglichkeit. (oder gehts hier überhaupt um einen file upload?)

nachdem ich da jetzt grad nichts seh zum datei anhängen, bin ich gezwungen, den code hier rein zu pasten:

viel spaß damit:

<html>
<head>
<script language="JavaScript1.2">
<!-- begin hiding
// (C) 2000 Marcin P Wojtowicz [one_spook@hotmail.com]. All rights reserved.
// Obtain permission before selling/redistributing in any medium.

startingColor = new Array() // <-- Do not modify!
endingColor = new Array() // <-- Do not modify!

// YOU MAY MODIFY THE FOLLOWING:
var yourImages = new Array("http://images.amazon.com/images/P/1565924940.01.TZZZZZZZ.jpg","http://images.amazon.com/images/P/0201353415.01.TZZZZZZZ.jpg","http://images.amazon.com/images/P/1556225865.01.TZZZZZZZ.jpg","http://images.amazon.com/images/P/1893115054.01.TZZZZZZZ.jpg","http://images.amazon.com/images/P/1861001746.01.TZZZZZZZ.jpg") // Fill this array with the images you wish to preload
var locationAfterPreload = "http://your.homepa.ge" // The script will redirect here when the preloading finishes *successfully*
var preloadbarWidth = 250 // The length of the preload bar. Should be greater than total amount of images you want to preload!
var preloadbarHeight = 15 // The height of the gradient/preload bar
var backgroundOfGradient = "#000000" // Default color while the preload bar is "filling up"

// Color the preloadbar is starting with - enter 1st, 3rd and 5th numbers/letters of color code
startingColor[0] = "c"
startingColor[1] = "f"
startingColor[2] = "f"

// Color the preloadbar is going to end up with - enter the 1st, 3rd and 5th numbers/letters of color code
endingColor[0] = "c"
endingColor[1] = "0"
endingColor[2] = "0"

// FOR TROUBLESHOOTING:
var gap = 5 // PLAY AROUND WITH THIS SETTING IF YOU GET A JAVASCRIPT ERROR!!! 2 is the minumum value!!!


// DO NOT MODIFY ANYTHING BEYOND THIS POINT!!!

if (!document.all) location.replace(locationAfterPreload)
var a = 10, b = 11, c = 12, d = 13, e = 14, f=15, i, j, ones = new Array(), sixteens = new Array(), diff = new Array();
var convert = new Array("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"), imgLen = yourImages.length;
var loaded = new Array(), preImages = new Array(), currCount = 0, pending = 0, h = 0, hilite = new Array(), cover = new Array();
var num = Math.floor(preloadbarWidth/gap);
for (i = 0; i < 3; i++) {
startingColor[i] = startingColor[i].toLowerCase();
endingColor[i] = endingColor[i].toLowerCase();
startingColor[i] = eval(startingColor[i]);
endingColor[i] = eval(endingColor[i]);
diff[i] = (endingColor[i]-startingColor[i])/num;
ones[i] = Math.floor(diff[i]);
sixteens[i] = Math.round((diff[i] - ones[i])*15);
}
endingColor[0] = 0;
endingColor[1] = 0;
endingColor[2] = 0;
i = 0, j = 0;
while (i <= num) {
hilite[i] = "#";
while (j < 3) {
hilite[i] += convert[startingColor[j]];
hilite[i] += convert[endingColor[j]];
startingColor[j] += ones[j];
endingColor[j] += sixteens[j];
if (endingColor[j] > 15) {
endingColor[j] -= 15;
startingColor[j]++;
}
j++;
}
j = 0;
i++;
}
function loadImages() {
for (i = 0; i < imgLen; i++) {
preImages[i] = new Image();
preImages[i].src = yourImages[i];
loaded[i] = 0;
cover[i] = Math.floor(num/imgLen)*(i+1)
}
cover[cover.length-1] += num%imgLen
checkLoad();
}
function checkLoad() {
if (pending) { changeto(); return }
if (currCount == imgLen) { location.replace(locationAfterPreload); return }
for (i = 0; i < imgLen; i++) {
if (!loaded[i] && preImages[i].complete) {
loaded[i] = 1; pending++; currCount++;
checkLoad();
return;
}
}
setTimeout("checkLoad()",10);
}
function changeto() {
if (h+1 > cover[currCount-1]) {
var percent = Math.round(100/imgLen)*currCount;
if (percent > 100) while (percent != 100) percent--;
if (currCount == imgLen && percent < 100) percent = 100;
defaultStatus = "Loaded " + currCount + " out of " + imgLen + " images [" + percent + "%].";
pending--;
checkLoad();
return;
}
eval("document.all.cell" + (h+1) + ".style.backgroundColor = hilite[h]");;
h++;
setTimeout("changeto()",1);
}
defaultStatus = "Loaded 0 out of " + imgLen + " images [0%]."
// end hiding -->
</script>
</head>
<body>
<center>
<font face="Verdana, Arial, Helvetica" size="2"><center>Preloading Images... Please Wait..</center>
<script language="JavaScript1.2">
<!-- beging hiding
document.write('<table border="0" cellpadding="0" cellspacing="0" width="' + preloadbarWidth + '"><tr height="' + preloadbarHeight + '" bgcolor="' + backgroundOfGradient + '">');
for (i = 0; i < num; i++) {
document.write('<td width="' + gap + '" id="cell' + (i+1) + '"></td>');
}
document.write('</tr></table>');
document.write('<p><small><a href="javascript:location.replace(locationAfterPreload)">Skip Preloading</a> &nbsp;| &nbsp;<a href="http://www.me.org">Script Credits</a></small></p></font>')
loadImages();
// end hiding -->
</script>
</font></center>
</body>
</html>

ingo
03.05.2002, 16:33:28
ups. versehentlich zwei mal gepostet. nun ja. nachdem ich nicht löschen darf, muss ich den platz hier zwangsweise wohl mit irgendwas füllen.

lg, ingo

CyberAge
06.05.2002, 19:28:06
es geht nicht um einen fileupload, sondern um einen newsletter-versand, der bei voll laufendem projekt um die 2000 newsletter versendet. dafür möchte ich eine statusanzeige haben, welche mir den aktuellen status ausgibt, wieviel prozent bereits versand wurden. Die berechnung ist schon drin, aber ich bekomme keine rückmeldung aus dem script. ich habe das script mal testweise ein wenig umgebaut, um einen mailversand zu simulieren (pausen von knapp einer halben sekunde während des parsen) und ich bekomme bei 1000 sendungen keine rückmeldung, sondern erst wenn das parsen beendet ist. nun will ich aber, dass ein balken erstellt wird, welcher mir den status anzeigt. wenn jemand noch eine ID hat, dann bitte ich hiermit um antwort! ansonsten muß ich wohl damit leben, dass ich keine rückmeldung bekommen kann!

Progman
06.05.2002, 23:56:56
immernoch flush();

for($i=0;$i<10;$i++)
(
sleep(2);
echo($i." ");
flush();
}

http://de.php.net/flush