PHP sleep();

Belee

Lt. Commander
Registriert
Dez. 2006
Beiträge
1.518
Hi

Eine Frage an die Profis.

Wenn ich eine Php-Datei mit Ajax an einer Stelle in die index.php einfüge bzw. austausche, die eine Verzögerung vom z.B. 2 Sekunden hat "sleep(2);". Wirkt sich diese Verzögerung auf die gesamte index aus oder nur auf die include Datei?
 
Der Ajax-Request dauert dann 2 Sekunden länger. Der Rest der Webseite sollte davon unbeeinflußt bleiben.
 
Man kann das sicherlich mit Ajax so ungeschickt lösen, dass die ganze Seite daraufhin 2 Sekunden langsamer lädt, in den Standardeinstellungen sollte es aber keinen Einfluss auf die index-Seite haben.
 
Mir fällt wirklich kein sinnvoller Anwendungsfall für Sleep unter PHP ein, solange man nicht auf der Konsole arbeitet (und selbst dann...).
 
Das liegt nicht an seiner unzureichenden Phantasie, es ist ein no-go den User bei einem HTTP-Request länger warten zu lassen, als nötig, wer das tut hat keine Ahnung von seinem Metier, und missbraucht PHP (wie in Stackoverflow zu sehen) für etwas, für das es deutlich bessere Ansätze als reines PHP gibt.
 
Die Diskussion ist müßig. Du setzt erstmal voraus, dass keine technischen Gründe dafür geben kann, den Benutzer warten zu lassen und dass die Benutzer außerdem nicht bereit wären, aus technischen Gründen auf irgendetwas zu warten. Beides ist rein hypothetisch und aus der Praxis leicht mit "nein" zu beantworten, denn es gibt tausende mögliche Einsatzbereiche (die Google-Maps-API ist bei SOF ein gutes Beispiel). Außerdem muss (u)sleep() nicht in Bereichen eingesetzt werden, die für Benutzer eine sichtbare Verzögerung bedeuten. Ob PHP für den Anwendungsfall die beste Programmiersprache ist, sei dahingestellt und darum drehte sich der Kommentar auch nicht. Die Aussage war: "Mir fällt kein sinnvoller Anwendungsfall für Sleep unter PHP ein". Die gibt es aber.

Mir nun zu unterstellen, ich habe keine Ahnung und "missbrauche" PHP...:lol:
 
@ice..
So ein Schwachsinn habe ich schon lange nicht mehr lesen dürfen, ich danke dir dafür, seit Tagen kann nicht nicht mehr kacken, jetzt gerade habe ich mich doch vor lauter lachen fast in die Hose geschissen.
Dir zu erklären was man mit sleep(); jetzt alles schönes anstellen kann AUSSER jemanden warten zu lassen, was kein Mensch machen wurde und nie auf so eine Idee kommen würde das dafür zu missbrauchen "warum auch?", wäre zwecklos, da dein PHP-Horizont wahrscheinlich bei echo anfängt und bei print aufhört, cheers!
 
Ist jetzt echt nicht böse gemeint (warum auch), aber an deiner Stelle würde ich den Mund nicht so weit aufmachen. Wie im anderen Thread ersichtlich ist wusstest du ja bisher nicht mal, dass Funktionsparameter wieder aus Funktionsaufrufen bestehen dürfen und das ist eigentlich so elementar dass sich seit Algol vor einem halben Jahrhundert nichts daran geändert hat.

Um mal wieder auf das Thema zu kommen, du hättest wenigstens dazu schreiben können, was deine Intention hinter dem sleep() ist, also warum du die Verzögerung willst. Wenn dich nur eine ja/nein-Antwort interessiert, dann hast du sie ja bereits erhalten.
 
Zuletzt bearbeitet:
philippgerard schrieb:
Die Diskussion ist müßig. Du setzt erstmal voraus, dass keine technischen Gründe dafür geben kann, den Benutzer warten zu lassen und dass die Benutzer außerdem nicht bereit wären, aus technischen Gründen auf irgendetwas zu warten.
nein, ich sage dass es keinen Grund gibt den Nutzer extra warten zu lassen. Wartezeiten/Delays entstehen durch jegliche Kommunikationen, aber nochmal manuell da etwas draufzulegen ist ein no-go.


philippgerard schrieb:
Beides ist rein hypothetisch und aus der Praxis leicht mit "nein" zu beantworten, denn es gibt tausende mögliche Einsatzbereiche (die Google-Maps-API ist bei SOF ein gutes Beispiel).
Und gerade das Google Maps Beispiel finde ich extrem schlecht, dann lässt man soetwas über einen daemon machen und sorgt dafür, dass dieser i.R. schon die Daten hat oder stößt den Prozess früh genug an und holt die Daten später ab.
So kann ich meine 5ms Berechnungen machen und im Hintergrund werden von dem Daemon die Google-Maps-Daten inkl. Sleep abgeholt, ich werde nicht von Google auf Grund zuvieler Anfragen temporär gebannt und habe trotzdem im besten Fall keine manuellen unnötigen Sleeps eingebaut.
Rate-Limiting von APIs ist ein interessanter Fall und das Beispiel zeigt auch, dass sowas in PHP absolut idiotisch ist, den laufen 10 PHP-Requests parallel (was nun wirklich gering ist) hast du zwar in deinen einzelnen Prozessen einen Sleep, aber deine 10 Prozesse befeuern Google trotzdem mit mehr Anfragen als man es ggf. wollte.
Und das ist kein konstruierter Fall, ich dürfte auf Grund dieses Verhaltens schon API-Daemons bauen, damit man dieses Problem nicht mehr hat und nicht für den Rest der Stunde von der API ausgeschlossen wird.


philippgerard schrieb:
Außerdem muss (u)sleep() nicht in Bereichen eingesetzt werden, die für Benutzer eine sichtbare Verzögerung bedeuten.
jeder Einsatz eines manuellen Sleeps ist rein theoretisch (2ms sind nicht sichtbar, aber trotzdem vorhanden) eine sichtbare Verzögerung, egal in welchem Bereich.


philippgerard schrieb:
Mir nun zu unterstellen, ich habe keine Ahnung und "missbrauche" PHP...:lol:
ich habe nicht gesagt, dass du es tust, aber dass es i.R. getan wird.
Das ist aber daher begründet, dass die meisten nur normalen Webspace zur Verfügung haben und daher alle Konzepte so zurechtbiegen müssen, dass sie auf reinem PHP laufen, dass dies nicht immer die besten Lösungen sind, darüber müssen wir uns denke ich nicht streiten oder?

Belee schrieb:
@ice..
[...]
Dir zu erklären was man mit sleep(); jetzt alles schönes anstellen kann AUSSER jemanden warten zu lassen, was kein Mensch machen wurde und nie auf so eine Idee kommen würde das dafür zu missbrauchen "warum auch?", wäre zwecklos, da dein PHP-Horizont wahrscheinlich bei echo anfängt und bei print aufhört, cheers!
Du willst mir also erzählen, dass ein sleep nicht bedeutet, dass der Nutzer länger warten muss? Ahja :evillol:
Zudem wäre ich vorsichtig mit welchen Menschen du sprichst, es könnte durchaus passieren, dass diese Personen einige Jahre mehr Erfahrung haben, als man selbst. Denn wer hinter einem Nicknamen mit welcher Erfahrung und somit welchen Anforderungen an Anwendungen steckt kann man nicht sehen ;)

carom schrieb:
Ist jetzt echt nicht böse gemeint (warum auch), aber an deiner Stelle würde ich den Mund nicht so weit aufmachen. Wie im anderen Thread ersichtlich ist wusstest du ja bisher nicht mal, dass Funktionsparameter wieder aus Funktionsaufrufen bestehen dürfen und das ist eigentlich so elementar dass sich seit Algol vor einem halben Jahrhundert nichts daran geändert hat.
Korrekt, schaut man sich auch die Themen des Nutzers an so fällt doch auf, dass dier Nutzer garantiert unter einem Jahr entwickelt, weit unter einem Jahr, die gestellten Fragen sind durchgängig Anfängerfragen, was nicht schlimm ist, wir waren es alle mal, aber dann sollte man sich auch dementsprechend verhalten.
 
Zuletzt bearbeitet:
Du willst mir also erzählen, dass ein sleep nicht bedeutet, dass der Nutzer länger warten muss? Ahja
Schon mal darüber nachgedacht, dass nicht jedes PHP script zwangsläufig eine User Interaktion (und sei es nur Ablaufdarstellung) besitzt?
 
Mike Lowrey schrieb:
Schon mal darüber nachgedacht, dass nicht jedes PHP script zwangsläufig eine User Interaktion (und sei es nur Ablaufdarstellung) besitzt?
Natürlich, ändert aber auch nur marginal etwas, von CMD ist es natürlich irrelevant, dafür wird PHP aber kaum genutzt.
Für jeden PHP-Aufruf der über den Webserver läuft wird ein PHP-Prozess genutzt, PHP-Prozesse sind nicht unendlich, sind nicht "kostenlos" (Ressourcenverbrauch), ergo blockiert ein Anfrage, solange bis ein PHP-Prozess frei ist, was auch wieder in längeren Antwortzeiten für echte Nutzer resultiert.

Und wer meint dass er einfach die Anzahl der PHP-Prozesse hochsetzen kann, sollte sich mal anschauen, was mit dem Indianer bei zuvielen gleichzeitigen Anfragen passiert :D
 
Ich hab den Thread zum Schließen vorgeschlagen

@Topic
Ich glaube sehr wohl dran, dass es sinnvollen Einsatz für sleep() geben kann. Inbesondere bei Skripts die nicht auf Interaktionen mit den Benutzer beruhen. Abgesehen davon, lässt sich sonst die berechtigte Frage aufstellen, wieso diese Funktion in PHP existiert.
 
Wenn ihr die anderen Themen zu der Webseite halbwegs aufmerksam gelesen hättet, dann wär euch spätestens nach 5 Minuten klar geworden, dass in diesem Projekt ohne Datenbank und dafür auf Dateiebene gearbeitet wird.
Außerdem kann ich sagen, dass einige Task innerhalb dieses Projekts als cronjob laufen und es da definitiv keinen User stört, wenn die zwischendurch mal pause machen.

Ich möchte also behaupten, dass ich mindestens 3 Fälle in dem Projekt nennen kann, wo ich persönlich auch (u)sleep verwenden würde, wenn ich ein bisschen an Rechenleistung freischaufeln möchte.

Das ist zum einen in der Schleife, die auf die Freigabe einer Datei durch einen anderen (php-)Prozess wartet und außerdem das Script, das intervallgesteuert den aktuell spielenden Song vom Radioserver abfragt.

Zu dem Chaoten, die der Meinung sind, dass ein Sleep in der Bearbeitung eines PHP-Requests den User verärgert, würde ich gerne anmerken, dass es bei einem Sleep von 2 Sekunden für den Client-PC völlig schnuppe ist, ob das Sleep (wie von euch vorgeschlagen) von JavaScript durchgeführt wird und der User zwischen den (für ihn eh unsichtbaren) Abfragen wartet oder vom Verbindungsprotokoll, das auf die Serverantwort wartet. Ich lehn mich jetzt mal gaaaanz weit aus dem Fenster und behaupte, dass beide Sleeps (Wird im Endeffekt wahrscheinlich eh ein WaitForSingleObjectEx hinauslaufen) fast das gleiche Resultat liefern.

Somit bestehen die "Nachteile" hauptsächlich auf dem Server, der 2 Sekunden länger eine Anwendung ausführen muss und der Tatsache, dass dem Server die offenen Ports für die Verbindungen bestimmt viel schneller ausgehen als dem Client.

Insofern ist sleep in PHP zwar nicht die schönste Lösung, aber eine, die funktioniert und auch mit Manipulationen im Client-JavaScript leben kann.

Ansonsten fordere ich die Kritiker hiermit auf, zu demonstrieren, wie sie Serverseitig eine Abfrage so verzögern, dass sie Pro Client nur alle X Sekunden beantwortet wird, ohne a) ein DBMS einzubeziehen b) die Fortgeschrittenen Programmierkenntnisse zu verwenden, die ihr dem TO absprecht oder c) irgendwelche Techniken einzubeziehen, die sich clientseitig manipulieren lassen (z.B. JavaScript, Cookies, SessionIDs etc.)

Diese Aufgabenstellung zu lösen wäre nämlich mal eine wirklich konstruktive Kritik und Problemlösung, die sicherlich auch gerne angenommen wird.
 
Zurück
Oben