Klaus: Template-Cache am besten speichern

Hallo,
nachdem das hier wieder ein Forum ist, kann ich ja wieder posten ;)

Und zwar geht es darum, wie man am besten die Cache Dateien einer Template-Engine speichert.
Diese Cache-Dateien sollen in einem extra Ordner gespeichert werden, und falls die Datei veraltet ist, also wenn die Template Datei neuer als die Cache datei ist, soll sie durch die neue Version ersetzt werden.

Dazu sind mit 2. Varianten eingefallen, der Ordner der Cache Dateien bekommt jeweils die Schreibrechte CHMOD 777 oder 775.

=== 1 ===
Also falls die Datei bereits vorhanden ist, soll der Script per CHMOD die Rechte der vorhandenen Datei ändern (auf 777), falls diese Datei noch Schreibgeschützt ist.
Danach wird per fopen("datei","w") + fwrite(); die Datei geöffnet und die neue Version gespeichert.

=== 2 ===
Per unlink(); lösche ich die alte Cache Datei zuerst, und erstelle dann per fopen(); + fwirte(); die neue Datei.

Dieses Speichern soll möglichst sehr kompatibel sein, sprich, es soll auf verschiedenen System sowie verschiedenen PHP-Versionen und Konfigurationen laufen.

Welches ist eurer Meinung nach die besser Lösung, und gibt es evt. eine bessere Lösung?
Bekommt man evt. bei bestimmten System etc. Probleme?

Grüße
Klaus

  1. Hallo,
    nachdem das hier wieder ein Forum ist, kann ich ja wieder posten ;)

    hihi,

    Dieses Speichern soll möglichst sehr kompatibel sein, sprich, es soll auf verschiedenen System sowie verschiedenen PHP-Versionen und Konfigurationen laufen.

    Dann nutzt DU am besten nur Funktionen die schon seit PHP-4.1.x bestehen. Das sollte fürs Gröbste ausreichen.

    Bekommt man evt. bei bestimmten System etc. Probleme?

    Nö, wieso? (Das System sollte natürlich schon über einen lauffähigen PHP-Interpreter verfügen, ;-))

    Gruß,
    Schnulli

    PS: Achja, ich finde die 2. Methode besser. Wenn die Cachedatei aktuell ist, soll die genutzt werden, und wenn nicht, dann 'ne neue schreiben. (also mit fopen('datei','w') und fwrite(...) dann ist die alte ja gelöscht und die neue geschrieben, alles in einem Schritt.)

  2. Hallo Klaus,

    === 1 ===
    Also falls die Datei bereits vorhanden ist, soll der Script per CHMOD die Rechte der vorhandenen Datei ändern (auf 777), falls diese Datei noch Schreibgeschützt ist.
    Danach wird per fopen("datei","w") + fwrite(); die Datei geöffnet und die neue Version gespeichert.

    Hier musst du bedenken, dass chmod() unter Umständen fehlschlägt, weil dem Apache-Prozess die Cache-Datei aus irgendeinem Grund nicht gehören könnte.

    === 2 ===
    Per unlink(); lösche ich die alte Cache Datei zuerst, und erstelle dann per fopen(); + fwirte(); die neue Datei.

    Hier hast du das Problem einer Race Condition. Was passiert, wenn ein anderer Prozess auf die Cache-Datei zugreifen will, nachdem sie gelöscht wurde? Mit file_exists() oder is_file() wirst du hier nicht viel ausrichten können, da ja kurz nach der Abfrage die Datei gelöscht worden sein könnte.

    Methode 1 ist vielleicht die bessere, wenn du das chmod() weglässt und evtl. auch mit flock() arbeitest.

    Viele Grüße
      Patrick Canterino

    --
    "Niemand hat die Absicht, eine Mauer zu errichten." (Walter Ulbricht, kurz vor dem Mauerbau)
  3. Hallo,
    ich hab da mal was gebastelt, wie findet ihr das?

    if(!file_exists($dateiname))
       {
       $userdatei = @fopen($dateiname,"w");
       $schreiben = @fwrite($userdatei, $dateiInhalt);
       @fclose($userdatei);
       }
    else
       {
       //Schreibrechte geben
       if(!is_writeable($dateiname))
          {
          $chmod = @chmod($dateiname,0777);
          }

    //Schreibrechte mög.
       if(is_writeable($dateiname))
          {
          $userdatei = @fopen($dateiname,"w");
          $schreiben = @fwrite($userdatei, $dateiInhalt);
          @fclose($userdatei);
          }
       else
          {
          $unlink = @unlink($dateiname);
          $userdatei = @fopen($dateiname,"w");
          $schreiben = @fwrite($userdatei, $dateiInhalt);
          @fclose($userdatei);
          }

    } //else: !file_exists($dateiname)

    if($schreiben == false)
       {
       //Fehlermeldung
       }

    Sollte ich die Schreibrechte auf 777 lassen, oder nach erfolgreicher Durchführung die Rechte auf 644 zurück setzen (sofern sie vorher geändert wurden), damit nicht jeder im System die Datei verändern kann, sondern nur das PHP Modul?
    Oder ist das egal, denn bei 644 können ja alle Anwender am PC die Datei auslesen.

    @Patrick: Das mit dem flock() habe ich noch nicht ganz Verstanden, und wo in dem Script müsste ich das einfügen?

    Grüße
    Klaus

    1. Hallo Klaus,

      ich hab da mal was gebastelt, wie findet ihr das?

      Wie ich schon sagte, ich finde das mit unlink() und chmod() nicht so gut.
      Außerdem solltest du dafür sorgen, dass geprüft wird, ob die Dateien korrekt geöffnet wurden.

      Sollte ich die Schreibrechte auf 777 lassen, oder nach erfolgreicher Durchführung die Rechte auf 644 zurück setzen (sofern sie vorher geändert wurden), damit nicht jeder im System die Datei verändern kann, sondern nur das PHP Modul?
      Oder ist das egal, denn bei 644 können ja alle Anwender am PC die Datei auslesen.

      s.o. Außerdem reicht 666 für deine Zwecke aus.

      @Patrick: Das mit dem flock() habe ich noch nicht ganz Verstanden, und wo in dem Script müsste ich das einfügen?

      Damit meinte ich, dass du noch dem Öffnen einer Datei diese mit flock() sperren solltest, damit sie nicht von einem anderen Prozess überschrieben wird.

      Viele Grüße
        Patrick Canterino

      --
      "Es gibt nur eines, was teurer ist als eine Frau - nämlich eine Ex-Frau." (Jack Nicholson)
    2. Moin!

        
      
      >    if(!is_writeable($dateiname))  
      >       {  
      >       $chmod = @chmod($dateiname,0777);  
      >       }  
      
      

      Nur der Dateibesitzer (und natürlich root) kann an den Dateirechten herumändern. Wenn diese Datei nicht dem User gehört, der als Apache-PHP-Prozess auf sie zugreift, dann wird chmod fehlschlagen. Oder anders ausgedrückt: Eine Datei, die nicht dem Apachen gehört und die mit x44, x11 oder gar nur x00 versehen ist, ist nicht beschreibbar und deren Dateirechte sind auch nicht änderbar.

      Sollte ich die Schreibrechte auf 777 lassen, oder nach erfolgreicher Durchführung die Rechte auf 644 zurück setzen (sofern sie vorher geändert wurden), damit nicht jeder im System die Datei verändern kann, sondern nur das PHP Modul?

      Es ist idiotisch, bei einer Datei die Schreibrechte temporär auf "alle dürfen alles" zu setzen und dann zu argumentieren, aus Sicherheitsgründen sollten die Rechte hinterher wieder zurückgesetzt werden.

      Wenn Apache Eigentümer der Datei ist, dann reicht 600 als Dateirecht aus, weil immer nur wieder der Apache auf diese Cache-Datei zugreifen wird. Und zwar die gesamte Zeit der Dateiexistenz lang.

      Oder ist das egal, denn bei 644 können ja alle Anwender am PC die Datei auslesen.

      Wenn das dein Wunsch ist, dann nimm gerne auch 644. Zum Löschen einer Datei sind die Dateirechte ja sowieso unerheblich, dafür sind die Schreibrechte des Verzeichnisses relevant, in dem die Datei steht.

      • Sven Rautenberg