• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[PHP] php in javascript variable refreshen

napoleonmm83

New member
Ich möchte in einer Variablen eine Ordner überwachen und lasse dazu den php code ausführen.
Wie kann ich php regel mässig refreshen. Um den Wert der sich ändern kann weiter zu verarbeiten.



Code:
var dynamic = [<?php 
header('Refresh: 3; ');

		$directory = "images/";
$filecount = 0;
$files = glob($directory . "*");
if ($files){
 $filecount = count($files);
}
		  print $filecount;
		?>];
 
Denk an die Trennung zwischen Client und Server. Man kann nicht von PHP aus eine Seite im Browser refreshen ausser bei Websockets vielleicht. Das muss der Client/Browser von sich aus tun. Das bedeutet, du musst ihm sagen, er soll rhythmisch einen Request machen. Und den kannst du in PHP so verarbeiten, dass du das Verarbeitungsergebnis zurück lieferst. Ich weiss jetzt nur nicht, wo ich anfangen soll, wie deinen Kenntnisse sind. Dein gezeigter Code ist leider noch meilenweit entfernt vom gewünschten Ziel. Allein mit header('Refresh: 3; '); wird das nicht funktionieren, auch wenn ich nicht weiss, was bei PHP da im Einzelnen hinter steckt.
 
Das geht nur mit AJAX. Einmal abgeschickt, kannst du mit PHP nichts mehr nachträglich an der Webseite ändern: web development - What are the difference between server-side and client-side programming? - Programmers Stack Exchange

Man kann nicht von PHP aus eine Seite im Browser refreshen
Doch, indem man wie der TE einen Refresh-Header mitschickt.

Allein mit header('Refresh: 3; '); wird das nicht funktionieren
Doch, würde es sogar (da bei jedem erneuten Aufruf der Webseite die Variable aktualisiert ist), allerdings nicht wie gewünscht (da die komplette Seite neu geladen wird). Außerdem wird in der jetzigen Form der Fehler Warning: Cannot modify header information - headers already sent by (output started at file:line)in file on line X angezeigt werden.
Beachten Sie, dass Sie die Funktion header() aufrufen müssen, bevor Sie irgendeine andere Art von Ausgabe (seien es normale HTML-Tags, Leerzeilen in einer Datei oder von PHP) zum Client schicken.
PHP: header - Manual
 
Julian: Genau schauen, was ich geschrieben habe: Nicht PHP macht das Refresh sondern der Browser! Geht um die Initiative/den Request. Die kann ohne Websockets nicht PHP ergreifen.
 
Danke du hast mich auf den richtigen weg gebracht. Hast du bitte noch einen Tip wie ich die php ausgabe an eine Javascript Variable übergeben kann.

Mein Versuch hat bis jetzt nicht funktioniert.

Code:
<script src="jquery-1.4.1.min.js" type="text/javascript"></script>
<script type="text/javascript">
     $(document).ready(function() {
       $("#refresh").load("count.php");
       var refreshId = setInterval(function() {
          $("#refresh").load('count.php?');
       }, 1000);
    });
	
var count = <?php echo $filecount;?>
	
function refresharray()
{ 
		{
if (count < images.length)
{ location.reload(false);}

	}	

}
setInterval(refresharray, 2000);	
	
</script>
 
Du musst das strukturell ganz anders aufbauen. Das PHP muss die rhythmischen Requests beantworten und am Ende ein Ende-Signal senden. Ausserdem würde ich nicht immer unabhängig vom Ergebnis Requests rein pumpen (das bringt Browser gern zum Einfrieren) sondern nur bei Erfolg mit window.setTimeout() einen neuen Request starten, solange bis das Ende-Signal kommt. in jQuery würde ich dafür .ajax() verwenden. Hier haben wir das behandelt: http://forum.jswelt.de/javascript/54677-wiederholender-ajax-request-jquery.html
 
Aber das ist Wortspalterei :beaten:
Nein, es geht mir nicht um die Wortspalterei. Die Initiative macht beim Refresh Header der Browser, nicht der Server. Also HTML bzw. JS und nicht PHP. Der Unterschied ist mir wichtig, damit man Client-/Server versteht. Es ist nämlich ein Unterschied ob man Code für PHP oder für JS schreibt ;)
Oder ist hier was anderes gemeint?
Ich spreche von <meta http-equiv="refresh".....>
 
Nein, es geht mir nicht um die Wortspalterei. Die Initiative macht beim Refresh Header der Browser, nicht der Server. Also HTML bzw. JS und nicht PHP.
Die Initiative stößt auf jeden Fall der Server an - durch das Mitsenden des Headers HTTP/1.x 200 OK ... Refresh: 3. Aber ich glaube, wir reden da aneinander vorbei... :confused-new:
 
Ich habe für mich eine Lösung gefunden die Funktioniert und für mich als javascript rookie nachvollziehbar ist.

Als erste wird das php geladen das in einem Ordner die Dateien zählt und als Zahl in einem div landet.

Danach lade ich die Zahl aus dem div in eine variable und vergleiche mit einer anderen variable ob die Zahlen unterschiedlich sind.
Wenn ein Unterschied festgestellt wurde wird die Seite neu geladen.

Ist sicher nicht perfekt. Verbesserungsvorschläge sind gerne willkommen

Code:
$(document).ready(function() {
       $("#refresh").load("count.php");
       var refreshId = setInterval(function() {
          $("#refresh").load('count.php?');
       }, 10000);
    });

function refresharray(){  
    
	var dynamic = document.getElementById("refresh").innerHTML;
		{
if (dynamic != images.length)
{ location.reload(false);}
}	
}
setInterval(refresharray, 300000);
 
Was du zeigst kenne ich nicht. Wie genau läuft das ab?
Vom Server wird beispielsweise der Header
Code:
HTTP/1.1 301 Moved Permanently
Date: Wed, 01 Oct 2014 06:00:00 GMT
Server: Apache/2.2.29 (Unix) PHP/5.5.16
Location: http://example.com/redirect
Connection: keep-alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=utf-8
gesendet. Dieser bewirkt einen Redirect. Genauso kann man aber auch bspw. einen Refresh-Header mitsenden, der eigentlich genau dasselbe wie ein Redirect auf die selbe Seite nach einer festgelegten Zeit ist.
Der Refresh-Header gehört zwar - wenn man es ganz genau nimmt - nicht zum Standard, ist jedoch de facto Standard.
 
Ja, ok, dann ist die Funktionsweise die selbe wie bei meinem META Tag Beispiel. Der Webserver veranlasst den Client zu einem Reload der selben Seite. Also doch clientinitialisiert.
Daher nochmal zur Deutlichkeit: Nur bei Websockets kann der Server die Initiative Richtung Client machen, sonst nicht! Weder mit PHP noch mit Perl noch mit sonst was. Ein Webserver kann nur auf Requests antworten, er kann nicht selbst zu einem Client verbinden. Das kann nur ein Websocket Server.
Und das ist auch keine Wortklauberei sondern wichtig zu verstehen, wie die Kommunikaton funktioniert und wie man sie vor allen Dingen auch absichert, Stichwort Firewall, Router etc.

Deshalb finde ich ja PHP für Anfänger so ungeeignet. Das klare eindeutige Request-/Response-Verständnis wird total verwaschen.
 
Daher nochmal zur Deutlichkeit: Nur bei Websockets kann der Server die Initiative Richtung Client machen, sonst nicht!
Also Initiative bedeutet für mich
Der Webserver veranlasst den Client zu einem Reload


Ja, ok, dann ist die Funktionsweise die selbe wie bei meinem META Tag Beispiel.
Im Grunde dasselbe, ja.


Ein Webserver kann nur auf Requests antworten, er kann nicht selbst zu einem Client verbinden. Das kann nur ein Websocket Server.
Habe ich auch nie bestritten...


Deshalb finde ich ja PHP für Anfänger so ungeeignet. Das klare eindeutige Request-/Response-Verständnis wird total verwaschen.
Das widerum verstehe ich gar nicht - klar, jeder hat da seine persönlichen Präferenzen, aber was an PHP sollte im Gegensatz zu anderen Serversprachen wie Perl das "Request-/Response-Verständnis verwaschen"? :confused:


- - - Aktualisiert - - -
OK, ich glaube, ich weiß jetzt, an welchem Punkt wir aneinander vorbeireden: :rolleyes:
halten wir mal fest: man kann serverseitig einen Refresh durchführen (meine Aussage), allerdings nicht im Nachhinein. Man muss den Header dafür beim Absenden mitschicken und kann, einmal abgeschickt, nichts mehr nachträglich ändern (hab ich nicht explizit erwähnt, meintest du aber vermutlich mit deiner Aussage?). Ist es das, was du gemeint hast?
 
Nein, was ich meine ist das ganz popelige einfache Request-Response-Prinzip. Auf einen Request folgt ein Response, fertig. Und auch in diesem Beispiel fängt immer alles mit einem allerersten Request des Client an. Dann schickt der Server sein Response und dabei die Anweisung mit (egal ob über Header oder Meta Tag), gleich wieder ein Request zu senden ohne Zutun des Users. Das meine ich. Und eine Initiative ist für mich immer ein Request, niemals ein Response, weil ein Response immer eine Reaktion auf eine Initiative/Anfrage ist. Und wir sehen gerade hier im Forum immer wieder Leute, die alles durcheinander werfen und so Sachen sagen wie "wie kann ich mit PHP die Variable in JS ändern".
Das ist deshalb verwaschen, weil in PHP nach meinem Empfinden je nach Machart keine klare syntaktische Trennung zwischen Request und Response existiert. In PHP fehlt stellenweise das Gefühl dafür, dass es sich um ein Serverscript handelt. Denn man kann einfach drauf los HTML und JS schreiben. Und wenn man Lust hat kann man mittendrin einfach mal nebenbei ein wenig Servercode einwerfen. Das Ganze am liebsten so schön gemischt wie hier im Thread, dass das Auge es beim Draufschauen auch nicht immer auf Anhieb erkennt, wo was aufhört und anfängt. Das wirkt auf einen Anfänger anfänglich einfach (geringe Einstiegshürden daher sehr grosse Verbreitung) aber in den Foren wie unserem sieht man, wie schnell das dann an seine Grenzen stößt, wenn nämlich kein klares Bild von einem Request-Response-Prinzip mehr besteht.
 
Das kann nur ein Websocket Server.
Nein - auch ein Websocket Server kann ohne Anfrage vom Client keine Verbindung aufbauen. Beim Websocket bleibt die Verbindung nur die ganze Zeit offen und deswegen kann der Server zu jeder Zeit Daten an den Client schicken.

keine klare syntaktische Trennung zwischen Request und Response existiert
Gibt es eigentlich schon. Alles was innerhalb der <?php ?> steht wird auf dem Server ausgeführt und der Rest wird als Plaintext an den Client geschickt.
Wie man das zusammenbaut ist natürlich Stilsache und da gibt es gute und schlechte.
 
Zurück
Oben