• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[PHP] Verzögerungsfunktion

Tantalus

Member
Gibt es eine Funktion in PHP mit der ich den Durchlauf des scripts verzögern kann??
Ich hab mir schon selber eine geschrieben :
function stop($zeit){
$time=time();
while($time+$zeit<=time());
}
Aber ich glaub die würde den Server überlasten.
 
Moin Tantalus,

die Funktion die Du suchst heißt sleep() der Wert in der Klammer ist vom Typ integer und gibt die Wartezeit in Sekunden an.
 

basman

Member
Die while-Methode erinnert an alte DOS-Zeiten, als man die CPU für sich hatte und sie während dem Warten ohnehin nichts sinnvolles machen konnte. Die Zeiten haben sich jedoch geändert und daher ist sleep() angesagt.

Was das sleep() besser kann? - Es meldet dem Betriebssystemkern, dass es momentan nichts zu tun gibt und daher bekommen andere Prozesse die Rechenzeit geschenkt. Erst nach Ablauf der angegebenen Sekunden wird der PHP-Prozess (bzw. HTTP-Server) wieder als runable markiert und bekommt Rechenzeit zugeteilt.

Dieses moderne Verhalten macht den Server-Admin happy. PHP-Skripte laufen bei stark besuchten Servern parallel und wenn jeder mit while() ankommt, kann der Kernel nicht ahnen, dass in Wirklichkeit keiner was wichtiges zu tun hat. Die Folge ist, dass der Server vom vielen Warten allein schon überlastet ist.
 
OP
T

Tantalus

Member
Danke,
Genau die so eine Funktion hab ich gesucht.
Meine Funktion wollte ich auch nicht wirklich einem Webserver antun :D.
Deshalb hatte ich ja auch gefragt.

So also die Funktion brauchte ich für eine Chat den ich am schreiben bin.
Jetzt hab ich aber noch ein paar Probleme.
Hier erst mal der Quellcode:
<html>
<head>
<title>
</title>
</head>
<body>
<?php
$mysqlhost = "localhost";
$mysqluser = "user";
$mysqlpassword = "passwort";
$mysqldb = "chat";
mysql_pconnect($mysqlhost,$mysqluser,$mysqlpassword);
mysql_select_db($mysqldb);

$start_id=1;
while(1){
$query = "SELECT * FROM chat where id > $start_id";
$ergebnis = @mysql_query($query);
while($datensatz = @mysql_fetch_array($ergebnis)){
echo "$datensatz[autor] > $datensatz[text]<br>";
flush();
$start_id=$test[id];
}
sleep(2);
mysql_free_result();
}
?>
</body>
</html>
Mein Problem ist das die Funktion flush() die den Ausgabepuffer ausgeben und leeren soll irgendwie nichts tut.
Die Sachen werden erst nach einem 30 sekunden Error ausgegeben, aber sie sollen sofort ausgegeben werden.
Zudem gibt es eine Möglichkeit ein Script länger als 30 Sekunden laufen zu lassen.

Ich hoffe ihr könnt mir helfen.
 
OP
T

Tantalus

Member
Hatte es bisher nur bei einem Freund unter windoof getestet.
Unter Liux funzt es ohne Probleme :D.

Jetzt hab ich nur noch ein Problem.
Wie kann man ein iframe dazu bewegen von alleine ganz nach unten zu scrollen.??
 

basman

Member
Du versuchst ein Grundlegendes Problem von HTTP zu umgehen: Datentransfers werden stets vom Client iniziiert, nie vom Server.

Ich denke, Du wirst mit der Methode (ewig laufendes PHP-Script) schnell an unlösbare Probleme stossen, weil der Browser erwartet, dass irgendwann die Übertragung beendet ist.

Soweit ich bislang gesehen habe, macht man das mit auto-refresh's (im HTML head-Teil). Optimal wäre es, wenn alle 10 Sekunden ein Refresh statt findet, der Browser jedoch nicht sogleich die ganze Ausgabeseite neu holt, sondern erst mal mit einem sogenannten HEAD-request das Änderungsdatum der Seite abfragt und nur den Inhalt erneuert, wenn es sich geändert hat. Man muss den HEAD-response wohl in PHP coden, denn das änderungsdatum der PHP-Datei zurückzugeben macht keinen Sinn.

Genaueres Vorgehen kann ich Dir nicht sagen. Aber vom Prinzip her könnte es so besser laufen.
 
Oben