Hallo,
inspiriert von einer Progress-Klasse die ich irgendwo einmal per Google aufgeschnappt hatte, wollte ich folgendes anstellen (PHP 4

Das Ganze soll sich wie eine Art Ladebalken entwickeln, dazu wird JavaScript verwendet.
PHP-Code:
<?php
class progress {
var $message = '';
var $width = '';
var $percent = 0;
function setMessage($message) {
echo '<script language="javascript" type="text/javascript">';
echo 'setMessage("'.$message.'");';
echo '</script>';
echo "\r\n\r\n";
flush();
}
function setPercent($percent) {
for($count = ($this -> percent); $count <= $percent; $count ++) {
echo '<script language="javascript" type="text/javascript">';
echo 'setPercent("'.$percent.'");';
echo '</script>';
echo "\r\n\r\n";
flush();
}
$this -> percent = $percent;
}
function writeJS() {
echo '<script language="javascript" type="text/javascript">';
echo '(document.all) ? per = document.all[\'progress\'] : per = document.getElementById(\'progress\');';
echo '(document.all) ? msg = document.all[\'msglabel\'] : msg = document.getElementById(\'msglabel\');';
echo 'function setPercent(percent) {';
echo ' per.innerHTML = "Fortschritt: " + percent + " %";';
echo '}';
echo 'function setMessage(message) {';
echo ' msg.innerHTML = message;';
echo '}';
echo '</script>';
echo "\r\n\r\n";
}
}
?>
Das ist ersteinmal die Klasse die ich habe - vollgespickt mit JavaScript. Zum testen verwende ich derzeit folgende Syntax:
PHP-Code:
<?php
$progress = new progress;
echo '<div id="progress">0%</div>';
echo '<div id="msglabel">Text</div><br /><br />';
echo "\r\n\r\n";
$progress -> writeJS();
function send($email) {
global $progress;
echo "Sende E-Mail an $email ... OK<br>";
$progress->setMessage("Sende E-Mail an $email ...");
sleep(1);
}
for ($i=1;$i<=100;$i++) {
if ($i==10) send('paulmueller@domain.de');
if ($i==20) send('lisa@springfield.de');
if ($i==30) send('donald@entenhausen.de');
if ($i==40) send('marketing@firma.de');
if ($i==50) send('dr.peter@arzt.de');
if ($i==60) send('schueler@schule.de');
if ($i==70) send('lehrer@schule.de');
if ($i==80) send('niemand@world.de');
if ($i==90) send('xxx@yyy.de');
$progress->setPercent($i);
}
?>
Normalerweise sollte jedesmal, wenn setPercent() aufgerufen wird, der Inhalt an den Browser gegeben werden (durch flush() ). Nur leider funktioniert das nicht so wie ich möchte, er aktualisiert nur in folgenden Schritten:
Folgendes hatte ich auch einmal versucht, um herauszufinden, ob es nur an den (fehlerhaften?) Sleeps liegt:
PHP-Code:
<?php
for ($i=1;$i<=100;$i++) {
sleep(1);
flush();
if ($i==10) send('paulmueller@domain.de');
if ($i==20) send('lisa@springfield.de');
if ($i==30) send('donald@entenhausen.de');
if ($i==40) send('marketing@firma.de');
if ($i==50) send('dr.peter@arzt.de');
if ($i==60) send('schueler@schule.de');
if ($i==70) send('lehrer@schule.de');
if ($i==80) send('niemand@world.de');
if ($i==90) send('xxx@yyy.de');
$progress->setPercent($i);
}
?>
Jedoch bringt das den gleichen Effekt wie oben beschrieben.
Wo liegt mein Fehler? Warum läuft der Prozentzähler nicht so durch, wie ich es möchte?