File auf dem Webserver 2000 zeigt falschen Inhalt einer Variable an

  • Hey Leute,

    ich habe ein Skript, welches eine Datei erstellt und eine variable deklariert. Dieses Skript läuft alle 2min.

    PHP
    1. $var_string = var_export(date('H:i:s'), true);
    2. $var = "<?php\n\$time = $var_string;\n?>";
    3. file_put_contents('log_time.php', $var);

    Dann habe ich ein zweites Skript was mir einfach nur den Wert der Variable ausgibt.

    Jetzt ist das Phänomen aufgetreten, das ich wenn ich das File mit der variable, also log_time.php, manuel über den Browser oder FTP aufrufe einen anderer Wert drin steht habe als mir das zweite Skript ausgibt. Das Skript gibt mir quasi die aktuelle Uhrzeit aus. In dem File selber steht aber immer der Gleiche Wert.

    Das gleiche habe ich repliziert mit einem anderen Skript. Die ausgangsvariable sieht so aus.

    Code
    1. $content = false;

    Wenn ich das Skript jetzt ausführe und das File damit überschreibt und

    Code
    1. $content = true;

    setze, dann gibt ein echo true zurück.


    4242.png

    Aber wenn ich das file öffne(ftp) steht im File


    Code
    1. $content = false;

    Hat einer eine Idee wieso das der Fall ist. Ich wollte für 2 variablen keine DB-Verbindung aufmachen.

    Das Skript wird über geplante Aufgaben ausgeführt.

  • Ich habe auch schon probiert ein neues FIle hochzuladen. Z.B in meinem fall match.php mit

    Code
    1. $content = false;

    Dieses File gab es schon mal mit dem gleichen Namen und ein Skript hat oder sollte das überschreiben und hat $Content auf true gesetzt.

    Dann habe ich ein ganz neues scriptfile hochgeladen test.php mit

    PHP
    1. <?php
    2. include_once ("match.php");
    3. echo $content;

    zurück bekomme ich 1; Ausführen tue ich das Skript über geplante Aufgaben. Vielleicht wird das über geplante Aufgaben alles gelogged?

  • Was du inhaltlich tust, würde man vermutlich nicht so lösen wie du es machst, aber dennoch:

    Der Ausführungspfad per CLI vs. per www-daemon ist vermutlich unterschiedlich.

    Das heißt es gibt in echt zwei log_time.php. An eine davon kommst du vermutlich nichtmal ran (die, die per CLI existiert).


    Verwende für deine Dateien, die du schreibst und aus denen du liest, absolute Pfade. Aktuell lädst du einfach per Dateinamen und das nimmt die Datei, die relativ zum Ausführungsort liegt (nicht gesehen von der ausgeführten Datei, sondern vom Prozess).

    Der übliche Weg dafür ist __DIR__ als Pfadpräfix zu nutzen, das den Ort der aktuellen Datei angibt.
    Also: file_put_contents(__DIR__ . '/willBeIncluded.php', $fileContent);

    Und: include(__DIR__ . '/willBeIncluded.php');


    Vorausgesetzt die Dateien in denen geschrieben und geladen wird befinden sich im selben Verzeichnis.

  • Alles klar. Werde ich mal versuchen mit den absolute Pfaden.

    Quote

    Was du inhaltlich tust, würde man vermutlich nicht so lösen wie du es machst, aber dennoch:

    Ich will ja quasi nur sicher gehen das mein Skript noch läuft. Ich könnte natürlich in eine DB schreiben oder ein log File anlegen. Andere Möglichkeiten fallen mir gerade nicht ein. An was für eine Möglichkeit hättest du den gedacht? Da ich quasi nur ein Eintrag vom letzen Skript Durchgang brauche, dachte ich, dafür eine DB aufzusetzen wäre zu viel.

  • Ich will ja quasi nur sicher gehen das mein Skript noch läuft. Ich könnte natürlich in eine DB schreiben oder ein log File anlegen. [...]

    Genau, dafür müsstest du keinen PHP-Code in einer Datei "erzeugen", der irgendwie eine Variable setzt. Ein file_put_contents(__DIR__ . '/lastRun.date.txt', date('Y-m-d H:i:s')); würde ja ausreichen. Die .txt Datei kann ja auch einfach public im Webspace liegen. Hat halt ein 'Gschmäckle einen PHP-String selber zusammen zu basteln und dann in einer Datei abzulegen. Das ist quasi wie eval() und das ist böse - wie der Name schon sagt.


    Am üblichsten wäre wohl den Output des Scripts in eine Datei zu pipen. Dann muss das Script nichts von irgendeiner Datei wissen.

    Also das PHP-Script, das etwas tut, erzeugt einen Output via echo / sieht ungefähr so aus:

    PHP: myScript.php
    1. <?php
    2. printf('[%s] Starting batch run', date('Y-m-d H:i:s'));
    3. // Hier passiert was.
    4. // Zum Beispiel ein Import
    5. // Heavy logic
    6. printf('[%s] Run completed', date('Y-m-d H:i:s'));

    Und in der Aufgabenverwaltung macht man sowas:

    php myScript.php > log.txt (oder >> wenn immer angehangen werden soll)

    So sehen bei mir zumindest auch oft cronjobs auf dem Server aus. Besser auch hier mit absoluten Pfaden (weiß nicht wie die im Webhosting aussehen)

  • Zuallermindest würde ich mal versuchen, die Datei mit der Variable nicht als PHP-Datei zu erzeugen und somit auch nicht per include einzubinden. Sollte zwar nach dem was ich mir angeschaut habe eigentlich nicht passieren, aber ich kann mir schon vorstellen, dass die Datei sonst eventuell aus einem Cache genommen wird.