autoTemp Klasse

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • autoTemp Klasse

    Hi Zusammen,

    ich hab mir mal irgendwann eine autoTemp Klasse gebastelt. Da hab ich mir gedacht, dass Leute die das PHP-Grundwissen haben so etwas vielleicht benötigen. Unverbindlich.

    Der Zweck: Eine Datei kurzzeitig anlegen, um dort ein PHPScript auszuführen oder
    anderes.

    Der Code:

    Quellcode

    1. <?
    2. class TempFile {
    3. function create($ext){//Erstellt die Datei
    4. $tmpDate = date("y")+date("m")+date("w")+date("d")+date("h")+date("i")+date("s")+$_SERVER["REQUEST_TIME"]+microtime(); //Erstellt einen Zufallsnamen
    5. $filename = "tmp_".$tmpDate.".".$ext; //Erstellt einen Dateinamen
    6. touch($filename); //Erstellt den die Datei mit dem Dateinamen
    7. $_POST["glob_tmp"] = $filename; //Gibt den Dateinamen als POST frei. Damit der Dateiname für die anderen Methoden verfügbar ist
    8. $_POST["tmp_created"] = true; //...
    9. $_POST["tmp_date"] = $tmpDate; //...
    10. }
    11. function write($str,$mode="w"){//Schreibt in die Datei
    12. if($_POST["tmp_created"]){
    13. $tmp = fopen($_POST["glob_tmp"],$mode); //Öffnet die Datei mit dem Dateinamen und dem Modus der angegeben wurde
    14. fwrite($tmp,$str); //Schreibt in die Datei
    15. fclose($tmp); //Schließt die Datei
    16. }else{ //Falls die Methode "create" vorher nicht aufgerufen wurde
    17. #echo "No File Created!";
    18. # or
    19. #return "No File Created!";
    20. # or
    21. #return false;
    22. }
    23. }
    24. function filename(){ //Gibt den aktuellen Dateinamen zurück
    25. return $_POST["glob_tmp"];
    26. }
    27. function close(){ //Löscht die Datei wieder
    28. unlink($_POST["glob_tmp"]);
    29. }
    30. }
    31. ?>
    Alles anzeigen


    Die Verwenung:

    Quellcode

    1. <?
    2. $tmp_php = '<? echo "Funktioniert!"; ?>';
    3. $at = new TempFile();
    4. $at -> create("php"); //Erstellt eine Tempotäre Datei mit der Endung "php" (der "." muss nicht mitgeschrieben werden)<br />
    5. $at -> write($tmp_php); // Schreibt den Inhalt in die Datei
    6. include($at -> filename()); //Optional, würde/wird den Inhalt der Datei includieren und somit ausführen
    7. $at -> close(); //Löscht die Datei
    8. ?>



    Ich hoffe das hilft weiter.
  • Hi,
    mit php5 hast du übrigens noch weitere Möglichkeiten.

    Hier mal meine Überarbeitung:

    Quellcode

    1. <?php
    2. class TempFile {
    3. private $filename;
    4. /**
    5. * Konstruktor - Erstellt die Datei
    6. * @param ext Dateiendung - (der "." muss nicht mitgeschrieben werden)
    7. */
    8. function TempFile($ext) {
    9. $this->filename = "/var/www/test/tmp_".microtime().rand(0,1000).".".$ext; //Erstellt einen Dateinamen
    10. touch($this->filename); //Erstellt den die Datei mit dem Dateinamen
    11. }
    12. /**
    13. * Schreibt in die Datei
    14. * @param str Inhalt
    15. * @param mode (optional) Schreibmodus
    16. */
    17. function write($str, $mode="w") {
    18. $tmp = fopen($this->filename, $mode);//Öffnet die Datei mit dem Dateinamen und dem Modus der angegeben wurde
    19. fwrite($tmp, $str); //Schreibt in die Datei
    20. fclose($tmp); //Schließt die Datei
    21. }
    22. /**
    23. * Gibt den aktuellen Dateinamen zurück
    24. */
    25. function __toString() {
    26. return $this->filename;
    27. }
    28. /**
    29. * Löscht die Datei wieder
    30. */
    31. function __destruct() {
    32. unlink($this->filename);
    33. echo "<br />und wieder gelöscht<br />";
    34. }
    35. }
    36. ?>
    Alles anzeigen


    Folgendermaßen einzusetzen:

    Quellcode

    1. <?php
    2. $tmp_php = '<?php echo "Funktioniert!"; ?>';
    3. $at = new TempFile('php');
    4. $at->write($tmp_php); // Schreibt den Inhalt in die Datei
    5. echo $at;
    6. echo " wird nun eingebunden<br />"; //Variable ist ein String
    7. include ($at->__toString());
    8. ?>
    Alles anzeigen
  • Ah, super. Bin halt noch ein bissl im 4.4.4 Zeitalter...

    Nur ein paar Mängel hat dein Script.

    Nich jeder hat einen Linux Server und auch nicht jeder hat Rechte über seine "url" raus zu gehen (Siehe FunPic.de ). Deswegen hab ich es dabei gelassen es einfach in den aktuellen Ordner zu schreiben.

    Ich denke mal das es ein Schreibfehler ist, aber vor der "__destruct"-Funktion steht kein "public". Ich nehme an das ist eine Methode die aufgerufen wird wenn man das Script schließt?

    Das bei der Temp Datei, nur noch das microtime angewendet wird find ich nicht so toll, mit date und microtime addiert kriegt man schon etwas längeres hin.


    Wieso deklariert man die Variable als ($this->)$variable und spricht sie aber mit ($this->)variable an? Ist das so gewollt?
  • die Länge ist nicht das wichtigste ;)
    Ganz im Ernst. Du wirst kaum innerhalb einer Mikrosekunde 2 Dateien erstellen.
    Und wenn doch, dann sind die Werte, die du verwendet hast auch absolut gleich. Weil sie ja alle nur die Zeit wiederspiegeln:

    Quellcode

    1. date("y")+date("m")+date("w")+date("d")+date("h")+date("i")+date("s")+$_SERVER["REQUEST_TIME"]


    public könntest du überall davor schreiben oder einfach bei __toString weglassen. Schönheitheitsfehler mit der selben Bedeutung. Habs geändert.

    Mit $this->variablenname greifst du auf Variablennamen innerhalb der Klasse zu.
    Du missbrauchst dazu die Superglobale POST - das solltest du nicht tun ;)

    Mein Ziel ist es nicht einen externen Pfad zu nutzen: /var/www/....
    Problem war nämlich die __destruct Methode - da diese aus unerklärlichen Gründen das Verzeichnis verlässt. Wenn du also den Destruktor nicht verwenden willst, verstehe ich das. Ansonsten solltes du dir die Änderungen aneignen.
  • Jaja, bis auf das mit der Zeit bin ich 100% deiner Meinung. Aber die Zeit:

    Sicher ist Sicher. Ein Hirnie kommt und auf alles doppelt klickt. Dann kann es sein das das Script schneller fertig ist als der zum zweiten mal klick. PHP ist im Prinzip sehr sehr schnell nur der seitenaufbau von HTML ist das was machmal so lange dauert. Deswegen geh ich da immer auch Nummer sicher, auch wenn es unrealistisch ist, dass soetwas passieren sollte.