JavaScript mit PHP kombinieren?

Hallo,

wenn man auf einer Website einen Countdown integrieren möchte, kann man das ja mittels PHP oder auch JavaScript machen. JavaScript hat natürlich den Nachteil, dass es Client-basiert ist und aktiv sein muss. Meine Frage zielt aber auf etwas anderes ab. Bei einem JavaScript-Countdown wird die Zeit ja vom Client geholt; wenn die Client-Uhr falsch geht, geht der Countdown falsch. Der Vorteil des JavaScript-Counters ist, dass die Zeit dynamisch aktualisiert wird. Nun zu meiner Frage: Kann man einen JavaScript-Counter basteln, der als Ausgangszeit die Serverzeit nimmt?

Würde mich über Hilfe sehr freuen.

Liebe Grüße
Hugo

Grundsätzlich: Ja. Allerdings gibt es keine direkte Schnittstelle zwischen PHP und JavaScript. Das muss es aber auch nicht, denn JavaScript fängt erst dann an zu arbeiten, wenn PHP bereits fertig ist.

Man kann also JavaScritp-Code mit PHP erzeugen, was dann den gewünschten Effekt erzielt. Deine Fragestellung bezieht sich allerdings auf das Problem, das bei Countern entsteht, wenn sie sich auf die Uhrzeit direkt beziehen. Sinnvoller wäre da in meinen Augen ein Bezug auf eine gewisse Zeitspanne, die noch abzuarbeiten ist (in Sekunden). Diese kann man dann runterzählen lassen. Allerdings gibt es hier immernoch ein Problem: Je nach Anwendungsfall kann es sein, dass die Verbindung vom Client zum Server einige Sekunden dauert und somit ein Verzug erzeugt wird, der die Berechnung im Sekundenbereich ungenau macht (JavaScript weiß ja nicht zu welchem Zeitpunkt genau die nSekunden noch gültig waren und eine Synchronisation zwischen Server und Client was die Zeit angeht ist - glaube ich zumindest - sehr schwer möglich. Wenn diese Abweichung nicht so relevant ist, dann mach es einfach. Bei Auktionen allerdings sollte man sicherstellen, dass die Zeit immer korrekt ist.

Counter-Scripte gibt es jedenfalls genügend fertige, denen man sicher statt einer Zeit auch einfach eine Anzahl Sekunden mitgeben kann. Ob diese dannn aber auch gleich einen Abgleich zwischen Server- und Client-Seite machen!?

Du kannst ja mal schauen, ob hier das Richtige für dich dabei ist: http://www.kostenlose-javascripts.de/javascripts/zae…

Hey, Mr. Nice Guy,

vielen Dank für deine nette und ausführliche Antwort!

Grundsätzlich: Ja. Allerdings gibt es keine direkte
Schnittstelle zwischen PHP und JavaScript. Das muss es aber
auch nicht, denn JavaScript fängt erst dann an zu arbeiten,
wenn PHP bereits fertig ist.

Gut zu wissen.

Deine Fragestellung bezieht sich
allerdings auf das Problem, das bei Countern entsteht, wenn
sie sich auf die Uhrzeit direkt beziehen. Sinnvoller wäre da
in meinen Augen ein Bezug auf eine gewisse Zeitspanne, die
noch abzuarbeiten ist (in Sekunden). Diese kann man dann
runterzählen lassen.

Wie meinst du das genau mit der Zeitspanne? Der Countdown muss sich doch an der Uhrzeit orientieren.

Allerdings gibt es hier immernoch ein
Problem: Je nach Anwendungsfall kann es sein, dass die
Verbindung vom Client zum Server einige Sekunden dauert und
somit ein Verzug erzeugt wird, der die Berechnung im
Sekundenbereich ungenau macht (JavaScript weiß ja nicht zu
welchem Zeitpunkt genau die nSekunden noch gültig waren und
eine Synchronisation zwischen Server und Client was die Zeit
angeht ist - glaube ich zumindest - sehr schwer möglich. Wenn
diese Abweichung nicht so relevant ist, dann mach es einfach.
Bei Auktionen allerdings sollte man sicherstellen, dass die
Zeit immer korrekt ist.

Die Abweichung ist für meinen Zweck nicht relevant, so lang es maximal nur ein paar Sekunden sind.

Du kannst ja mal schauen, ob hier das Richtige für dich dabei
ist:
http://www.kostenlose-javascripts.de/javascripts/zae…

Vielen Dank!

Liebe Grüße
Hugo

Hey, Mr. Nice Guy,

vielen Dank für deine nette und ausführliche Antwort!

Kein Problem

Deine Fragestellung bezieht sich
allerdings auf das Problem, das bei Countern entsteht, wenn
sie sich auf die Uhrzeit direkt beziehen. Sinnvoller wäre da
in meinen Augen ein Bezug auf eine gewisse Zeitspanne, die
noch abzuarbeiten ist (in Sekunden). Diese kann man dann
runterzählen lassen.

Wie meinst du das genau mit der Zeitspanne? Der Countdown muss
sich doch an der Uhrzeit orientieren.

Ich meinte damit, dass der Countdown sich zwar imemr auf die Uhrzeit beziehen muss, aber in Verbindung mit einer Sekundenangabe ist die Uhrzeit nur indirekt wichtig. Wenn du z.B. einen Server hast mit Zeitzone GMT und einen Client mit GMT+1, dann hast du zwei Möglichkeiten:

  1. Du kennst die Unterschiede zwischen Client- und Server-Zeit und berücksichtigst das bei dem Countdown
  2. Du kennst die Unterschiede nicht.

Ich gehe mal vom zweiten Fall aus, da dieser global dann für alle Zeitzonen funktioniert. Statt die Uhrzeit, auf die heruntergezählt werden soll, an den Client zu schicken, würde ich lieber auf dem Server von PHP berechnen lassen, wieviele Sekunden es noch bis zum Zeitpunkt X sind. Dem JavaScript übergibst du dann die Sekunden. Das JavaScript speichert beim Start die aktuelle Uhrzeit, zählt die Sekunden, die in PHP berechnet wurden, dazu und hat die Zeit, zu der heruntergezählt werden kann. Das ist vollkommen unabhängig, welche Zeitzone der Client ist, da man immer von der Client-Zeit die noch fälligen Sekunden hinzuaddiert und schon passt es.

Ich hoffe, dass ich mich so etwas deutlicher ausdrücken konnte. Das sind halt Überlegungen, die man anstellen muss, wenn man derartige Probleme lösen will. Wichtig dabei ist erstmal zu verstehen, welche Daten woher kommen und welche Scripte unter welchen Bedingungen laufen (PHP auf Server, JavaScript auf Client, etc.).

Allerdings gibt es hier immernoch ein
Problem: Je nach Anwendungsfall kann es sein, dass die
Verbindung vom Client zum Server einige Sekunden dauert und
somit ein Verzug erzeugt wird, der die Berechnung im
Sekundenbereich ungenau macht (JavaScript weiß ja nicht zu
welchem Zeitpunkt genau die nSekunden noch gültig waren und
eine Synchronisation zwischen Server und Client was die Zeit
angeht ist - glaube ich zumindest - sehr schwer möglich. Wenn
diese Abweichung nicht so relevant ist, dann mach es einfach.
Bei Auktionen allerdings sollte man sicherstellen, dass die
Zeit immer korrekt ist.

Die Abweichung ist für meinen Zweck nicht relevant, so lang es
maximal nur ein paar Sekunden sind.

Die Abweichung resultiert aus dem Zeitpunkt, zu dem die übrigen Sekunden in PHP berechnet wurden bis zu dem Punkt, an dem JavaScript anfängt zu arbeiten. Da der Transport vom Webserver zum Client durchaus mal ein paar Sekunden dauern kann (Je nach Anbindung von Server und Client, sowie Auslastung der Leitung, etc.), kommt hier natürlich ein Verzug zu Stande. Wenn ein paar Sekunden nicht relevant sind: Dann vergiss es einfach dir darüber Gedanken zu machen :wink:

Du kannst ja mal schauen, ob hier das Richtige für dich dabei
ist:
http://www.kostenlose-javascripts.de/javascripts/zae…

Vielen Dank!

Liebe Grüße
Hugo

Lieber Mr. Nice Guy,

vielen Dank für deine erneute Antwort!

Ich meinte damit, dass der Countdown sich zwar imemr auf die
Uhrzeit beziehen muss, aber in Verbindung mit einer
Sekundenangabe ist die Uhrzeit nur indirekt wichtig. Wenn du
z.B. einen Server hast mit Zeitzone GMT und einen Client mit
GMT+1, dann hast du zwei Möglichkeiten:

  1. Du kennst die Unterschiede zwischen Client- und Server-Zeit
    und berücksichtigst das bei dem Countdown
  2. Du kennst die Unterschiede nicht.

Ich gehe mal vom zweiten Fall aus, da dieser global dann für
alle Zeitzonen funktioniert. Statt die Uhrzeit, auf die
heruntergezählt werden soll, an den Client zu schicken, würde
ich lieber auf dem Server von PHP berechnen lassen, wieviele
Sekunden es noch bis zum Zeitpunkt X sind. Dem JavaScript
übergibst du dann die Sekunden.

Ja, genauso habe ich mir das vorgestellt. Die verbleibenden Sekunden werden mittels PHP auf dem Server ermittelt und anschließend an die JavaScript-Funktion übergeben. Sowohl das bisschen PHP als auch der JavaScript-Counter sollten kein Problem sein. Nur, wie kann ich die in der PHP-Funktion ermittelten Sekunden an die JavaScript-Funktion weiterreichen? Da hakt’s bei mir.

Das JavaScript speichert beim
Start die aktuelle Uhrzeit, zählt die Sekunden, die in PHP
berechnet wurden, dazu und hat die Zeit, zu der
heruntergezählt werden kann. Das ist vollkommen unabhängig,
welche Zeitzone der Client ist, da man immer von der
Client-Zeit die noch fälligen Sekunden hinzuaddiert und schon
passt es.

Das ist doch eigentlich gar nicht erforderlich. Ich möchte ja nicht den Zeitpunkt des Ereignisses, zu dem runtergezählt wird, ausgeben, sondern eben nur die Zeit bis dahin.

Ich hoffe, dass ich mich so etwas deutlicher ausdrücken
konnte. Das sind halt Überlegungen, die man anstellen muss,
wenn man derartige Probleme lösen will. Wichtig dabei ist
erstmal zu verstehen, welche Daten woher kommen und welche
Scripte unter welchen Bedingungen laufen (PHP auf Server,
JavaScript auf Client, etc.).

Ja, vielen Dank!

Die Abweichung resultiert aus dem Zeitpunkt, zu dem die
übrigen Sekunden in PHP berechnet wurden bis zu dem Punkt, an
dem JavaScript anfängt zu arbeiten. Da der Transport vom
Webserver zum Client durchaus mal ein paar Sekunden dauern
kann (Je nach Anbindung von Server und Client, sowie
Auslastung der Leitung, etc.), kommt hier natürlich ein Verzug
zu Stande. Wenn ein paar Sekunden nicht relevant sind: Dann
vergiss es einfach dir darüber Gedanken zu machen :wink:

Ok! :smile:

Ich muss sagen, das Klima hier im Forum ist wesentlich entspannter und dementsprechend viel angenehmer als in gewissen anderen Foren. Echt klasse! :smile:

Ich wünsche dir ein schönes Wochenende!

Liebe Grüße
Hugo

Hallo Hugo!

Lieber Mr. Nice Guy,

vielen Dank für deine erneute Antwort!

Da nicht für, wenn ich kann, teile ich mein Wissen gerne mit jenen, die es interessiert. Ich erwarte ja schließlich auch eine gute Antwort, wenn ich hier mal eine Frage stelle :smile:

Ich meinte damit, dass der Countdown sich zwar imemr auf die
Uhrzeit beziehen muss, aber in Verbindung mit einer
Sekundenangabe ist die Uhrzeit nur indirekt wichtig. Wenn du
z.B. einen Server hast mit Zeitzone GMT und einen Client mit
GMT+1, dann hast du zwei Möglichkeiten:

  1. Du kennst die Unterschiede zwischen Client- und Server-Zeit
    und berücksichtigst das bei dem Countdown
  2. Du kennst die Unterschiede nicht.

Ich gehe mal vom […]

Ja, genauso habe ich mir das vorgestellt. Die verbleibenden
Sekunden werden mittels PHP auf dem Server ermittelt und
anschließend an die JavaScript-Funktion übergeben. Sowohl das
bisschen PHP als auch der JavaScript-Counter sollten kein
Problem sein. Nur, wie kann ich die in der PHP-Funktion
ermittelten Sekunden an die JavaScript-Funktion weiterreichen?
Da hakt’s bei mir.

Hier kommt nochmal die Verarbeitung beider Sachen ins Spiel: Der User gibt am Client im Browser eine Adresse ein. Diese fragt die entsprechende Datei (bzw. bei PHP heißt es ja Script) ab und schickt sie - im Falle von PHP - durch den Interpreter/Parser. Dieser übersetzt den PHP-Code auf der Server-Seite in Maschinencode, der verarbeitet wird. Mittels Ausgabe über echo() oder nicht in PHP-Klammern stehenden Code (alles was außerhalb von <?php ?> steht) wird die Ausgabe zur Laufzeit erstellt und bei Abschluss an den Browser geschickt. Das sieht dann im Normalfall so aus, als wäre es eine ganz normale Datei mit dem zurückgelieferten Inhalt. Man bekommt auf der Client-Seite also nicht wirklich mit, was im PHP-Script verarbeitet wird, aber das ist erstmal nebensächlich. Jedenfalls ist an dieser Stelle wichtig, dass PHP fertig ist mit der Verarbeitung bevor die Seite an den Client geschickt wird. Nach dem Empfang der Datei wird diese dann im Browser verarbeitet und angezeigt. Zu diesem Zeitpunkt werden dann auch erst die Scripte innerhalb des HTML-Codes verarbeitet - so auch dein JavaScript.

Um nun aber deine Frage zu beantworten: JavaScript kann man auf verschiedene Weisen in HTML einbinden: Entweder als Script-Datei oder direkt zwischen -Tags. In diesem Fall wäre eine Verarbeitung in einem <script>-Tag die beste Wahl. Das PHP-Script muss also die Sekunden berechnen und dann einfach eine Ausgabe erzeugen, die in etwa so aussehen kann:

<?php
// Hier irgendwie die Sekunden berechnen und in eine Variable speichern
$integerSekunden = funktion_zur_berechnung_der_sekunden();
?>
<script type=„text/javascript“>
var sekunden = <?php echo $integerSekunden;?>;

Auf diese Weise erzeugst du eine Ausgabe, die z.B. so aussehen könnte (wenn du dir den Quellcode der Seite anschaust):

var sekunden = 12345;

Damit kannst du dann in JavaScript arbeiten.

Im obigen Beispiel kann man auch bei der Ausgabe von PHP auf die Zwischenspeicherung in der Variablen verzichten und direkt das Ergebnis der Funktion ausgeben lassen, das habe ich nur der Einfachheit halber mal mit Variable geschrieben. Es hängt ja auch ein bisschen davon ab, wie du die Sekunden berechnest.

Das JavaScript speichert beim
Start die aktuelle Uhrzeit, […]

Das ist doch eigentlich gar nicht erforderlich. Ich möchte ja
nicht den Zeitpunkt des Ereignisses, zu dem runtergezählt
wird, ausgeben, sondern eben nur die Zeit bis dahin.

Irgendetwas musst du ja als Basis nehmen. Du kannst natürlich auch mittels window.setTimeout() arbeiten und alle 1000 Millisekunden den Counter um 1 verringern lassen. Da die Ausführung aber auch von den zur Verfügung stehenden Ressourcen auf dem Client-Rechner abhängt kann es hier widerum zu einer Verzögerung kommen. Nimmst du hingegen die aktuelle Uhrzeit des Client-Systems als Grundlage und die errechneten Sekunden als Zeitaufschlag auf die gespeicherte Client-Zeit, ist es egal, ob es zu Verzögerungen im Scriptablauf kommt, da der Counter sich auf einen Zeitpunkt + festgelegte Sekunden bezieht und das mit der aktuellen Zeit vergleicht. Klingt jetzt ein bisschen kompliziert, aber ist in meinen Augen die beste Wahl.

Ich hoffe, dass ich mich so etwas deutlicher […]

Ja, vielen Dank!

Die Abweichung resultiert aus dem Zeitpunkt, […]

Ok! :smile:

Ich muss sagen, das Klima hier im Forum ist wesentlich
entspannter und dementsprechend viel angenehmer als in
gewissen anderen Foren. Echt klasse! :smile:

Ich wünsche dir ein schönes Wochenende!

Liebe Grüße
Hugo

Danke, das wünsche ich dir auch!

Und scheue dich nicht, noch weiter nachzufragen, wenn doch noch etwas unklar ist. Durch meine vielen Erfahrungen im Umgang mit Script-Sprachen neige ich manchmal dazu zu viel vorauszusetzen, weshalb meine Ausführungen dann nicht auf Anhieb verstanden werden. Das ist dann irgendwie eine Form der Betriebsblindheit gegen die man sich allerdings nicht so wirklich wehren kann…

LG
Lutz

Hallo Lutz,

Da nicht für, wenn ich kann, teile ich mein Wissen gerne mit
jenen, die es interessiert. Ich erwarte ja schließlich auch
eine gute Antwort, wenn ich hier mal eine Frage stelle :smile:

Hehe. Die Einstellung finde ich super!

Mittels
Ausgabe über echo() oder nicht in PHP-Klammern stehenden Code
(alles was außerhalb von <?php ?> steht) wird die Ausgabe zur
Laufzeit erstellt und bei Abschluss an den Browser geschickt.

Da habe ich wohl mal wieder viel zu kompliziert gedacht. Dabei ist die Lösung ja so einfach. :smile:

Um nun aber deine Frage zu beantworten: JavaScript kann man
auf verschiedene Weisen in HTML einbinden: Entweder als
Script-Datei oder direkt zwischen -Tags.

Eigentlich meinte das gar nicht, sondern genau das, was du mir weiter oben erklärt hast; nämlich, wie ich die in der PHP-Funktion ermittelten Sekunden an die JavaScript-Funktion weiterreiche. :smile:

In diesem
Fall wäre eine Verarbeitung in einem <script>-Tag die beste
Wahl.

Ja? Ist das besser, als das Skript in eine *.js-Datei auszulagern?

Das PHP-Script muss also die Sekunden berechnen und dann
einfach eine Ausgabe erzeugen, die in etwa so aussehen kann:

<?php
// Hier irgendwie die Sekunden berechnen und in eine Variable
speichern
$integerSekunden = funktion_zur_berechnung_der_sekunden();
?>
<script type=„text/javascript“>
var sekunden = <?php echo $integerSekunden;?>;

Auf diese Weise erzeugst du eine Ausgabe, die z.B. so aussehen
könnte (wenn du dir den Quellcode der Seite anschaust):

var sekunden = 12345;

Damit kannst du dann in JavaScript arbeiten.

Perfekt. Ich bin dir sooo dankbar! :smile:))

Im obigen Beispiel kann man auch bei der Ausgabe von PHP auf
die Zwischenspeicherung in der Variablen verzichten und direkt
das Ergebnis der Funktion ausgeben lassen, das habe ich nur
der Einfachheit halber mal mit Variable geschrieben.

Ok.

Es hängt
ja auch ein bisschen davon ab, wie du die Sekunden berechnest.

Meinst du, wenn die Berechnung sehr komplex ist, dass man das Ergebnis dann auf jeden Fall in einer Variable zwischenspeichern sollte? Es wird ja in meinem Fall nur der aktuelle Timestamp von einem in der Zukunft liegenden subtrahiert, das ist alles.

Irgendetwas musst du ja als Basis nehmen. Du kannst natürlich
auch mittels window.setTimeout() arbeiten und alle 1000
Millisekunden den Counter um 1 verringern lassen. Da die
Ausführung aber auch von den zur Verfügung stehenden
Ressourcen auf dem Client-Rechner abhängt kann es hier widerum
zu einer Verzögerung kommen. Nimmst du hingegen die aktuelle
Uhrzeit des Client-Systems als Grundlage und die errechneten
Sekunden als Zeitaufschlag auf die gespeicherte Client-Zeit,
ist es egal, ob es zu Verzögerungen im Scriptablauf kommt, da
der Counter sich auf einen Zeitpunkt + festgelegte Sekunden
bezieht und das mit der aktuellen Zeit vergleicht. Klingt
jetzt ein bisschen kompliziert, aber ist in meinen Augen die
beste Wahl.

In dem Fall hatte ich offensichtlich nicht weit genug gedacht. Du hast ja recht, die sekündliche Aktualisierung muss natürlich auch gesteuert werden. Das Problem hat man bei einem PHP-Counter ohne automatische Aktualisierung ja nicht. Vielleicht hatte ich es deshalb missachtet.

Danke, das wünsche ich dir auch!

Danke sehr! :smile:

Und scheue dich nicht, noch weiter nachzufragen, wenn doch
noch etwas unklar ist. Durch meine vielen Erfahrungen im
Umgang mit Script-Sprachen neige ich manchmal dazu zu viel
vorauszusetzen, weshalb meine Ausführungen dann nicht auf
Anhieb verstanden werden. Das ist dann irgendwie eine Form der
Betriebsblindheit gegen die man sich allerdings nicht so
wirklich wehren kann…

Das ist ganz lieb von dir. Und du erklärst sehr gut!

Liebe Grüße
Hugo

PS: Kann man eigentlich auch feststellen, ob beim Client JavaScript aktiviert ist oder nicht und anhand dessen entweder eine PHP- oder eine JavaScript-Variante ausführen?

PPS: Ich bekomme immer diese Fehlermeldung: „Cannot modify header information - headers already sent.“ :frowning:

Hallo Lutz,

Da nicht für, […]

Hehe. Die Einstellung finde ich super!

Mittels […]

Da habe ich wohl mal wieder viel zu kompliziert gedacht. Dabei
ist die Lösung ja so einfach. :smile:

Das ist kein Anfänger-Problem, keine Bange. Es hängt dann nur von der Erfahrung ab, wie schnell man dahinter kommt, dass es zu kompliziert gedacht war :smile:

Um nun aber deine Frage zu beantworten: […]

Eigentlich meinte das gar nicht, sondern genau das, was du mir
weiter oben erklärt hast; nämlich, wie ich die in der
PHP-Funktion ermittelten Sekunden an die JavaScript-Funktion
weiterreiche. :smile:

OK, da ich da nicht sicher war bin ich halt auf alles eingegangen.

In diesem
Fall wäre eine Verarbeitung in einem -Tag die beste
Wahl.

Ja? Ist das besser, als das Skript in eine *.js-Datei
auszulagern?

Hier habe ich mich vielleicht etwas falsch ausgedrückt. Die JavaScript-Berechnung würde ich sehr wohl in eine .js-Datei auslagern. Das Problem liegt einfach daran, dass die .js-Datei dann ein weiteres PHP-Script sein müsste und das Caching des Browsers hier Probleme bereiten könnte. Deshalb ist es einfacher für die Variablenbestimmung oder den Funktionsaufruf eine direkte Einbindung in HTML wie oben beschrieben zu wählen. Das Countdown-Script sollte dann möglichst wieder in eine eigene Datei ausgelagert sein, das spart Transfervolumen und macht die Seite dadurch etwas schneller.

Das PHP-Script muss also die Sekunden berechnen […]

Perfekt. Ich bin dir sooo dankbar! :smile:))

Gern geschehen.

Im obigen Beispiel kann man auch […]

Ok.

Es hängt
ja auch ein bisschen davon ab, wie du die Sekunden berechnest.

Meinst du, wenn die Berechnung sehr komplex ist, dass man das
Ergebnis dann auf jeden Fall in einer Variable
zwischenspeichern sollte? Es wird ja in meinem Fall nur der
aktuelle Timestamp von einem in der Zukunft liegenden
subtrahiert, das ist alles.

Auch hier habe ich mich sicher etwas blöd ausgedrückt, aber ja: Im grunde meinte ich es so wie du beschrieben hast. Je nachdem, wie die Berechnung aussieht ist es übersichtlicher über eine Variable zu arbeiten statt eine 12734 Zeichen lange Zeile für die direkte Ausgabe zu schreiben (um es mal auf die Spitze zu treiben). Man sollte immer eine gewisse Übersicht im Code wahren, damit der Code auch wartbar bleibt.

Irgendetwas musst du ja als Basis nehmen. […]

In dem Fall hatte ich offensichtlich nicht weit genug gedacht.
Du hast ja recht, die sekündliche Aktualisierung muss
natürlich auch gesteuert werden. Das Problem hat man bei einem
PHP-Counter ohne automatische Aktualisierung ja nicht.
Vielleicht hatte ich es deshalb missachtet.

Einen kleinen Hinweis noch: Du wirst ja trotz dieser Art der Berechnung um ein window.setTimeout() nicht herum kommen. Ich würde dann allerdings keine 1000 Millisekunden nehmen, da es dann etwas doof aussieht, sollte doch mal eine Verzögerung entstehen. Dann steht kurzeitig dein Counter still und auf ein Mal werden dann 2 Sekunden abgezogen. Deshalb würde ich bei der Berechnung dann irgendeinen Wert zwischen 100 und 250 Millisekunden empfehlen. Dann passiert zwar nicht bei jeder Berechnung etwas, aber für den Benutzer der Seite ist es dann nicht so auffällig, wenn doch mal eine Verzögerung entstehen sollte (die du ja nicht vorhersagen / verhindern kannst, da es am Client-Rechner liegt).

Danke, das wünsche ich dir auch!

Danke sehr! :smile:

Und scheue dich nicht, noch weiter nachzufragen, […]

Das ist ganz lieb von dir. Und du erklärst sehr gut!

Liebe Grüße
Hugo

Danke :smile:

Jein.

Das ist ein Thema für sich. Direkt geht das leider nicht in PHP. Man könnte höchstens einen Mechanismus einbauen, der per JavaScript in irgendeiner Form eine Nachricht an den Server senden, anhand dessen das PHP-Script erschließen kann, dass dieser Client JavaScript aktiviert hat.

Aber: Da du ja von einem Counätdown sprichst muss die Berechnung ja ohnehin in PHP erfolgen. Ich würde entsprechend neben der Initialisierung des JavaScripts auch die erste Ausgabe mnit PHP realisieren. Sprich: Die Seite sollte bereits so aussehen, als würde das JavaScript laufen - mit einer Ausgabe der noch verbleibenden Zeit. Wenn das JavaScript lauffähig ist, ändert sich die Zeit dann und wenn nicht, dann eben nicht. Somit ersparst du dir eine Menge Arbeit und hast die Funktionalität quasi-direkt implementiert.

Das ist ein PHP-Fehler. Wenn du z.B. eine Session starten möchtest (session_start()), wird in diesem Moment ein Header generiert, der an den Client gesendet werden soll, um den Cookie für die Session zu setzen. Hierbei mal ein kurzer Schwenk in den Bereich der Funktion von HTTP:

Wenn ein Client eine Anfrage an den Server schickt sieht die eigentlich so aus (als Rein-Text):

GET /infotext.html HTTP/1.1
Host: www.example.net

Damit ruft er vom Server example.net die Datei infotext.html über das HTTP-Protokoll der Version 1.1 ab.

Die Antwort sieht dann folgendermaßen aus (ein Beispiel; Variiert je nach Dateiinhalt usw.):

HTTP/1.1 200 OK
Server: Apache/1.3.29 (Unix) PHP/4.3.4
Content-Length: (Größe von infotext.html in Byte)
Content-Language: de (nach ISO 639 und ISO 3166)
Content-Type: text/html
Connection: close

(Inhalt von infotext.html)

Der Server antwortet über HTTP Version 1.1 mit dem HTTP-Code 200 - Das bedeutet, dass alles OK ist, die Seite gefunden wurde und im weiteren Verlauf übertragen wird. Es gibt hier auch noch andere Codes wie 403 (Not Found), 500 (Server-Error), usw. Dieser Code wird vom Browser interpretiert und entsprechend reagiert.
Es folgen Angaben zum Server. In diesem Fall läuft ein Apache-Server mit Version 1.2.39 mit PHP Version 4.3.4 auf dem Server.
Danach folgen Angaben zum Inhalt der abgefragten Datei (alle Content-Angaben) und Angaben zur Verbindung zum Server. Da werde ich jetzt nicht weiter drauf eingehen.

Dann kommt das eigentlich interessante: Es folgen 2 (!) Zeilenumbrüche und dann erst folgt der Text der Datei! An dieser Stelle beginnt das, was du siehst, wenn du dir den Quellcode im Browser anzeigen lässt. Alles Andere wird als sogenannter „Header“ wahrgenommen. Es ist im Grunde „nur“ normaler Text, der vor dem Inhalt übertragen wird.

Warum ist das nun wichtig? In PHP werden diverse Header automatisch erstellt und man muss sich eigentlich nicht selber darum kümmern (außer man will das auch wirklich und es hat einen Mehrwert für das Script - das ist aber schon die etwas höhere Schule). Sobald jedoch in PHP eine Ausgabe erfolgt, werden die Header abgeschlossen. Im Nachhinein kann dann nur über Tricks etwas an den Headern geändert werden. Grund hierfür: Das Script wird vom Server im Normalfall erst nach der Abarbeitung an den Client geschickt. Die Kommunikation zwischen PHP und Server arbeitet aber etwas anders. PHP fängt an die Daten an den Server zu senden, sobald die erste Ausgabe im Script erfolgt. Die zu diesem Zeitpunkt übertragenen Daten beinhalten die Header, die zwei Zeilenumbrüche und die Ausgabe, die gemacht wurde. Ab dann hat PHP keinen Einfluss mehr auf die Header - außer eben über Tricks. Deshalb ist es wichtig die Session und alle anderen Header-Operationen VOR der ersten Ausgabe zu machen.

Was ist nun alles eine „Ausgabe“? Grundsätzlich alles, was außerhalb von <?php ?> steht, als auch das, was über Ausgabefunktionen wie echo(), print(), etc. ausgegeben wird.

Wenn das Script also nicht mit

Hallo Lutz,

ich bedanke mich sehr für deine schnellen, umfangreichen, freundlichen, fundierten und hilfreichen Antworten. :smile:)

Das ist kein Anfänger-Problem, keine Bange. Es hängt dann nur
von der Erfahrung ab, wie schnell man dahinter kommt, dass es
zu kompliziert gedacht war :smile:

Danke! :smile:

OK, da ich da nicht sicher war bin ich halt auf alles
eingegangen.

Hat auch nicht geschadet, im Gegenteil. :smile:

Hier habe ich mich vielleicht etwas falsch ausgedrückt. Die
JavaScript-Berechnung würde ich sehr wohl in eine .js-Datei
auslagern. Das Problem liegt einfach daran, dass die .js-Datei
dann ein weiteres PHP-Script sein müsste und das Caching des
Browsers hier Probleme bereiten könnte. Deshalb ist es
einfacher für die Variablenbestimmung oder den Funktionsaufruf
eine direkte Einbindung in HTML wie oben beschrieben zu
wählen. Das Countdown-Script sollte dann möglichst wieder in
eine eigene Datei ausgelagert sein, das spart Transfervolumen
und macht die Seite dadurch etwas schneller.

Also so?

Bestimmung der Sekunden > .php-Datei
JavaScript-Funktion > .js-Datei
Aufruf der JavaScrpt-Funktion > .php-Datei

Wieso spart das eigentlich Transfervolumen? Eigentlich ist doch nur der Ort des Codes ein anderer und weil die .js-Datei noch eingebunden werden muss, braucht es sogar minimal mehr Code.

Auch hier habe ich mich sicher etwas blöd ausgedrückt, aber
ja: Im grunde meinte ich es so wie du beschrieben hast. Je
nachdem, wie die Berechnung aussieht ist es übersichtlicher
über eine Variable zu arbeiten statt eine 12734 Zeichen lange
Zeile für die direkte Ausgabe zu schreiben (um es mal auf die
Spitze zu treiben). Man sollte immer eine gewisse Übersicht im
Code wahren, damit der Code auch wartbar bleibt.

Alles klar. :smile:

Einen kleinen Hinweis noch: Du wirst ja trotz dieser Art der
Berechnung um ein window.setTimeout() nicht herum kommen. Ich
würde dann allerdings keine 1000 Millisekunden nehmen, da es
dann etwas doof aussieht, sollte doch mal eine Verzögerung
entstehen. Dann steht kurzeitig dein Counter still und auf ein
Mal werden dann 2 Sekunden abgezogen. Deshalb würde ich bei
der Berechnung dann irgendeinen Wert zwischen 100 und 250
Millisekunden empfehlen. Dann passiert zwar nicht bei jeder
Berechnung etwas, aber für den Benutzer der Seite ist es dann
nicht so auffällig, wenn doch mal eine Verzögerung entstehen
sollte (die du ja nicht vorhersagen / verhindern kannst, da es
am Client-Rechner liegt).

Oh, super. Solche Tipps sind Gold wert. Danke sehr!

Sollte ich dir langsam mit meiner Fragerei doch auf den Senkel gehen, dann sag es bitte. Ich möchte deine Hilfsbereitschaft auch nicht überstrapazieren.

Liebe Grüße
Hugo

Da hätte ich ja eigentlich auch selbst drauf kommen können. *g*

Das ist ein sehr guter Vorschlag, so werde ich versuchen es umzusetzen. Herzlichen Dank!

Auch an dieser Stelle noch mal herzlichen Dank für die umfangreichen Informationen. :smile:

Was ist nun alles eine „Ausgabe“? Grundsätzlich alles, was
außerhalb von <?php ?> steht, als auch das, was über
Ausgabefunktionen wie echo(), print(), etc. ausgegeben wird.

echo() und print() sind in diesem Fall JavaScript-Methoden, oder?

Wenn das Script also nicht mit

Hallo Hugo!

Nein, keine Sorge, du überstrapazierst garnichts. Wenn ich mal keine Zeit habe zu antworten, dann antworte ich auch nicht :wink:

Im Grunde ist ja alles zu diesem Beitrag gesagt, was gesagt werden musste. Ich gehe nurnoch auf die eine Frage ein, die sich hier befindet:

Wieso spart das eigentlich Transfervolumen? Eigentlich ist
doch nur der Ort des Codes ein anderer und weil die .js-Datei
noch eingebunden werden muss, braucht es sogar minimal mehr
Code.

Der Browser speichert alle statischen Inhalte einer Webseite standardmäßig im Cache. Die Dateien werden für eine gewisse Zeit im Cache behalten, damit man die Inhalte nicht bei jedem Aufruf erneut vom Server laden muss. Zu diesen statischen Inhalten gehören alle Dateien, die nicht zur Laufzeit dynamisch erstellt werden (in deinem Fall also alles außer .php). .js-Dateien gehören entsprechend auch zu den zwischengespeicherten Inhalten. Da man für die Einbindung eine relativ kurze Zeichenkette benötigt ist es meist sinnvoller Scripte die sich nicht ändern in eine Datei auszulagern. Je nach Länge des Scriptes wächst natürlich der Nutzenfaktor im Bereich Transfer-Volumen-Ersparnis. Wenn das Script extrem kurz ist kannst du allerdings recht haben, dass es eventuell sogar mehr verbraucht. Die Ersparnis erfolgt jedenfalls dadurch, dass die .js-Datei nicht bei jedem Seitenaufruf neu geladen werden muss und somit das Transfervolumen schrumpft im Vegleich zur Realisierung innerhalb des HTML-Codes.

Als Beispiel:

Statt:

function test ()
{
alert (‚Dies ist ein Test‘);
}

kannst du auch:

schreiben und die Funktion in script.js auslagern. Du sparst selbst in diesem kleinen Beispiel bereits ca. 37 Byte je Seitenaufruf (ca. deswegen, weil es davon abhängt, welche Zeilenumbruch-Variante genutzt wird, aber das sollte dich jetzt nicht belasten :smile:).

Ich denke, dass es eindrucksvoll zeigt, dass selbst kleine Scripte bereits Transfervolumen einsparen können. Bei Seiten mit extrem viel Traffic macht sich das noch stärker bemerkbar. Außerdem ist das Script in eine eigene Datei gekapselt und somit wartungsfreundlicher.

Ich hoffe, dass dir das ein wenig weiterhilft :smile:

Hi!

Nein. Ich beziehe mich hier ausschließlich auf PHP, nicht auf JavaScript! Das ist ganz wichtig, denn JavaScript wird ja erst auf dem Client-Rechner ausgeführt und da ist die Seite bereits erstellt worden (von PHP). Du darfst innerhalb des PHP-Scriptes keine Ausgaben vor den Funktionen haben, die Header-Informationen senden (dazu zählt unter Anderem session_start()). Ich weiß es ist etwas verwirrend, aber man muss wissen, wo man sich im JavaScript- und wo im PHP-Bereich befindet. Deshalb schrieb ich auch, dass es sich hierbei um ein Problem von PHP handelt.

Wenn du da noch Fragen zu hast, sag bescheid, dann versuche ich es noch etas genauer zu beschreiben :smile:

LG
Lutz

Hallo Lutz,

du machst deinem Nickname wirklich alle Ehre. :wink:

Nein, keine Sorge, du überstrapazierst garnichts. Wenn ich mal
keine Zeit habe zu antworten, dann antworte ich auch nicht :wink:

Dann ist gut.

Im Grunde ist ja alles zu diesem Beitrag gesagt, was gesagt
werden musste.

Das war also richtig?

> Bestimmung der Sekunden > .php-Datei
> JavaScript-Funktion > .js-Datei
> Aufruf der JavaScript-Funktion > .php-Datei

Der Browser speichert alle statischen Inhalte einer Webseite
standardmäßig im Cache. Die Dateien werden für eine gewisse
Zeit im Cache behalten, damit man die Inhalte nicht bei jedem
Aufruf erneut vom Server laden muss. Zu diesen statischen
Inhalten gehören alle Dateien, die nicht zur Laufzeit
dynamisch erstellt werden (in deinem Fall also alles außer
.php). .js-Dateien gehören entsprechend auch zu den
zwischengespeicherten Inhalten. Da man für die Einbindung eine
relativ kurze Zeichenkette benötigt ist es meist sinnvoller
Scripte die sich nicht ändern in eine Datei auszulagern. Je
nach Länge des Scriptes wächst natürlich der Nutzenfaktor im
Bereich Transfer-Volumen-Ersparnis. Wenn das Script extrem
kurz ist kannst du allerdings recht haben, dass es eventuell
sogar mehr verbraucht. Die Ersparnis erfolgt jedenfalls
dadurch, dass die .js-Datei nicht bei jedem Seitenaufruf neu
geladen werden muss und somit das Transfervolumen schrumpft im
Vegleich zur Realisierung innerhalb des HTML-Codes.

Als Beispiel:

Statt:

function test ()
{
alert (‚Dies ist ein Test‘);
}

kannst du auch:

schreiben und die Funktion in script.js auslagern. Du sparst
selbst in diesem kleinen Beispiel bereits ca. 37 Byte je
Seitenaufruf (ca. deswegen, weil es davon abhängt, welche
Zeilenumbruch-Variante genutzt wird, aber das sollte dich
jetzt nicht belasten :smile:).

Ein durch die Enter-Taste hervorgerufener Zeilenumbruch belegt ja 2 Bytes. Welche Alternative gibt’s denn dazu?

Ich denke, dass es eindrucksvoll zeigt, dass selbst kleine
Scripte bereits Transfervolumen einsparen können. Bei Seiten
mit extrem viel Traffic macht sich das noch stärker bemerkbar.
Außerdem ist das Script in eine eigene Datei gekapselt und
somit wartungsfreundlicher.

Ich hoffe, dass dir das ein wenig weiterhilft :smile:

Das hilft mir sogar sehr. Besten Dank!

Liebe Grüße
Hugo

Nein. Ich beziehe mich hier ausschließlich auf PHP, nicht auf
JavaScript!

Ach so. Die Klammern bei echo hatten mich etwas verwirrt. Denn das Sprach-Konstrukt, das - wie ich gerade hier http://php.net/manual/de/function.echo.php gelernt habe - nicht wirklich eine Funktion ist, wird ja ohne die Klammern verwendet, zumindest kenne ich es nur so.

Das ist ganz wichtig, denn JavaScript wird ja erst
auf dem Client-Rechner ausgeführt und da ist die Seite bereits
erstellt worden (von PHP). Du darfst innerhalb des
PHP-Scriptes keine Ausgaben vor den Funktionen haben, die
Header-Informationen senden (dazu zählt unter Anderem
session_start()). Ich weiß es ist etwas verwirrend, aber man
muss wissen, wo man sich im JavaScript- und wo im PHP-Bereich
befindet. Deshalb schrieb ich auch, dass es sich hierbei um
ein Problem von PHP handelt.

Wenn du da noch Fragen zu hast, sag bescheid, dann versuche
ich es noch etas genauer zu beschreiben :smile:

Um ehrlich zu sein überfordert mich das Thema noch ein wenig. Ich habe leider immer noch nicht richtig verstanden, wie ich meine PHP-Funktion und mein JavaScript nun so kombiniere, dass es funktioniert. :-/

Hallo Lutz,

du machst deinem Nickname wirklich alle Ehre. :wink:

Hey, ich habe einen Ruf zu verlieren :wink:

Nein, keine Sorge, du überstrapazierst garnichts. Wenn ich mal
keine Zeit habe zu antworten, dann antworte ich auch nicht :wink:

Dann ist gut.

Im Grunde ist ja alles zu diesem Beitrag gesagt, was gesagt
werden musste.

Das war also richtig?

> Bestimmung der Sekunden > .php-Datei
> JavaScript-Funktion > .js-Datei
> Aufruf der JavaScript-Funktion > .php-Datei

Ja, das ist soweit richtig, sonst hätte ich dazu noch etwas geschrieben :wink:

Der Browser speichert alle statischen Inhalte […]

Ein durch die Enter-Taste hervorgerufener Zeilenumbruch belegt
ja 2 Bytes. Welche Alternative gibt’s denn dazu?

Das ist nur zur Hälfte richtig. Diese Art des Zeilenumbruchs besteht unter Windows-Systemen. Unix arbeitet hingegen mit nur einem Byte als Zeilenumbruch, ebenso wie Mac. Wobei sich jedoch auch hier die Art des Umbruchs unterscheiden.

Weitere Informationen: http://de.wikipedia.org/wiki/Zeilenumbruch

Entsprechend kann die Ersparnis etwas variieren, aber das ist dann glaube ich wirklich Erbsenzählerei :smile:

LG
Lutz