problem mit eigener classe.

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • problem mit eigener classe.

    in eigener classe mache ich im destructor serialisieren von einer lokaler Variable und speichere das in eine datei und kontrolliere sogar ob die datei wirklich gespeichert ist.
    im konstruktor kontrolliere ich ob diese datei mit serialisierem Inhalt da ist, und im fall, dass die datei existiert unserialisiere der inhalt und speichere es in lokale Variable.
    Mein Problem liegt aber daran, dass der konstruktor die Datei nie findet,(auch bei 2-tem reload von dem script) obwohl im destruktor sie generiert und für testzwecke mit file_get_contents ausgelesen wurde.
    Die Datei muss doch bei dem zweitem aufruf von dem Object, wenn ich reload mache schon da sein
    was dabei komisch ist, dass ich die datei mit explorer auch nicht finden kann
    vielleich habe ich einfach problem an betrieb System?
    Aber ich will besser hoffen, dass ich ein logisches problem habe.
    System Windows XP, xamp mit php 5.1.4

    der script:
    PHP-Code:
    error_reporting(E_ALL);
    class 
    Configuration{
     private 
    $file='./serialconfig.php';
     private 
    $werte;
     public function 
    __construct()
     {
       
    $this->werte=array();
       if(
    file_exists($this->file)) //<-muss doch bei 2-tem aufruf da sein, schau destruktor.
       
    {
        
    $s=file_get_contents($this->file);
        
    $this->werte=unserialize(base64_decode($s));
       }else echo 
    __LINE__.")file $this->file nicht gefunden<br />";//<-das bekomme ich ständig
     
    }
     public function 
    getAll(){return $this->werte;}
     public function 
    __isset($var){return isset($this->werte[$var]);}
     public function 
    __set($was,$wert){ $this->werte[$was]=$wert;}
     public function 
    __get($was){return $this->werte[$was];}
     public function 
    __unset($var)
     {
       if(isset(
    $this->werte[$var]))unset($this->werte[$var]);
     }
     public function 
    __destruct()
     { 
       echo 
    "<br /> start von destruct <br />"
       
    $s=base64_encode(serialize($this->werte));
       
    //echo $s;
       
    file_put_contents($this->file,$s);
       if(
    file_exists($this->file))//hier habe ich extra zur kontrolle geprüft ob die datei geschrieben wurde
       
    echo "<br />".__LINE__.")file $this->file existiert, Inhalt:".file_get_contents($this->file);
       echo 
    "<br />".__LINE__.")ende von destruct";   
     }
    }

    //Test 
    $con =new Configuration();//hier bekomme ich ständig meldung, dass die datei nicht existiert
    $con->wartung='hallo';
    echo 
    $con->wartung;
    //und hier kommt der destructor mit der bestätigung, dass die datei existiert. 
    die ausgabe auch bei mehrfachem reload (sogar mit verschiedenen get-parameter)
    --------------------------------
    58)file ./serialconfig.php nicht gefunden
    hallo
    start von destruct

    75)file ./serialconfig.php existiert, Inhalt:YToxOntzOjc6IndhcnR1bmciO3M6NToiaGFsbG8iO30=
    76)ende von destruct
    ----------------------
    ich kann komische weise kein Grund finden, warum die datei im constructor nie gefunden wird und warum sie nicht auf der festplate zu finden ist, obwohl ich sie im destructor extra mit file_get_contents auslese.
    Slava
    bituniverse.com

  • #2
    ich kann ehrlich gesagt auch keinen Fehler finden...

    was passiert denn, wenn du im selben script (ohne reload) zwei instanzen hintereinander erzeugst und zerstörst?

    ungefähr so:

    PHP-Code:
    //Test 
    $con =new Configuration();//hier bekomme ich ständig meldung, dass die datei nicht existiert
    $con->wartung='hallo';
    echo 
    $con->wartung;

    unset(
    $con); //altes con sollte hier zerstört werden

    $con2=new Configuration(); //wird hier die datei gefunden?? 

    bin jetzt etwas ratlos...

    greetzm high
    Good programming is 40% experience, 20% skill, 20% RTFM, 15% caffeine, and 5% attention to detail.
    When everything else fails, manipulate the data...
    Beschriftungen / Großformatdruck / Werbemittel

    Kommentar


    • #3
      Wenn das alles in einem Scriptdurchlauf passiert, hilft dir:
      http://de.php.net/manual/de/function.clearstatcache.php

      *edit*
      Dein Pfad wird nicht stimmen, so gehts:
      PHP-Code:
      class Configuration{
       private 
      $file='';
       private 
      $werte;
       public function 
      __construct()
       {
         
      $this->file dirname(__FILE__).'/serialconfig.php';
         echo  
      '<br>xc'.$this->file.'xc<br>'// testcode
         
      $this->werte=array();
         if(
      file_exists($this->file)) //<-muss doch bei 2-tem aufruf da sein, schau destruktor.
         
      {
          
      $s=file_get_contents($this->file);
          
      $this->werte=unserialize(base64_decode($s));
         }else echo 
      __LINE__.")file $this->file nicht gefunden<br />";//<-das bekomme ich ständig
       
      }

      // gekürzt

      Aber, warum das bei dir nicht funktioiert, ist mir auch noch nicht klar..
      Zuletzt geändert von combie; 25.08.2007, 23:04.
      Wir werden alle sterben

      Kommentar


      • #4
        Re: problem mit eigener classe.

        Original geschrieben von Slava vielleich habe ich einfach problem an betrieb System?
        Aber ich will besser hoffen, dass ich ein logisches problem habe.
        nur so als feedback, dein script funktioniert bei mir, die datei wird also angelegt.
        hoffe, dass es dir erstmal weiterhilft - also am script liegt es nicht.
        habe momentan aber auch keine idee, an welcher systemeinstellung es liegen könnte

        Kommentar


        • #5
          Hi @highrise
          Tatsächlich hat es bei 2-ter instanze hingehaut und der konstruktor hat keine meldung, dass die Datei nicht existiert.
          nach dem ich kontrolliert habe, ob die datei im ordner ist (klingt jetzt wie eine fobie), habe ich sie auch entdeckt.

          @combie
          nach dem du mir clearstatcache() empfohlen hast, habe ich sofort verstanden, das das der richtiger weg ist, und habe diese funktion direkt im destrucktor und im construktor eingebaut.
          Jetzt wundere ich mich aber , dass es nicht funktioniert hat.

          ich habe sogar nach dem 10-em reload eine geraucht und auf dem Balkon geschimpft, jetzt sehe ich das Datei immer noch nicht da ist.

          @3DMax
          Danke.
          ich werde jetzt einfach system noch mal hohfahren, vielleicht geht es wieder.

          ich gehe noch eine rauchen
          Zuletzt geändert von Slava; 25.08.2007, 23:11.
          Slava
          bituniverse.com

          Kommentar


          • #6
            getcwd() liefert die Antwort!
            Der Destruktor läuft schon im Apache Umfeld.
            Zumindest bei mir, mod_php

            *edit*
            clearstatcache war ein (zu)Schnellschuß von mir...
            Zuletzt geändert von combie; 25.08.2007, 23:21.
            Wir werden alle sterben

            Kommentar


            • #7
              Original geschrieben von combie
              Der Destruktor läuft schon im Apache Umfeld.
              Zumindest bei mir, mod_php
              läuft denn bei dir das script?
              php läuft bei mir als cgi.

              @slava - rauch' nicht soviel

              Kommentar


              • #8
                Tatsächlich ist aktuele pfad bei destructor im apache!!!!
                wenn ich der absoluter pfad zur datei schreibe, dann funktioniert es sofort bei dem 2-tem reload.
                Was für mich aber rätsel ist, Warum klappt es mit relativem Pfad, wenn ich einfach die 2-te Instanze erzeige?
                Das ist nicht normal!
                Slava
                bituniverse.com

                Kommentar


                • #9
                  In Slavas Version nicht!
                  Nach dem Umbau im Konstruktor:
                  $this->file = dirname(__FILE__).'/serialconfig.php';
                  Auch bei mir...

                  getcwd() sagt bei mir:
                  Im Konstruktor H:\Programme\xampp\htdocs\fragmente
                  Im Destruktor H:\Programme\xampp\apache
                  Wir werden alle sterben

                  Kommentar


                  • #10
                    Original geschrieben von combie
                    [B]In Slavas Version nicht!
                    das ist ja interessant.
                    und wenn du jetzt im php-script explizit (bzw. implizit) den destructor aufrufst?
                    $con=null sollte eigentlich ausreichen.

                    Kommentar


                    • #11
                      Tatsächlich ist aktuele pfad bei destructor im apache!!!!
                      wenn ich der absoluter pfad zur datei schreibe, dann funktioniert es sofort bei dem 2-tem reload.
                      Was für mich aber rätsel ist, Warum klappt es mit relativem Pfad, wenn ich einfach die 2-te Instanze erzeige?
                      Das ist nicht normal!
                      Das funktioniert, da das aktuelle Verzeichnis (getcwd) beim Zerstören des ersten Objektes noch im Verzeichnis des Skriptes ist, die Abarbeitung wurde schließlich noch nicht beendet! Hast du nur ein Objekt und du zerstörst dieses nicht explizit, wird es erst beim Aufräumen von PHP zerstört, das aktuelle Verzeichnis ist also im Apache-Verzeichnis.

                      Kommentar


                      • #12
                        Ok! ich kann es nachvollziehen, dass destruktor irgendwo in apache landet.
                        Jetzt verstehe ich andere sache nicht.
                        wenn ich nach dem
                        $con =new Configuration();
                        echo $con->wartung;

                        einfach
                        echo dirname(__FILE__);
                        mache, dann zeigt er mir wieder der pfad von /apache!
                        soll das heisen, dass nach dem der destructor gelaufen ist, wird der aktueler ordner grundsätzlich weiter in /apache laufen?

                        In jedem fall habe ich in docu nichts darüber gelesen.
                        Und man muss schon zugeben, dass so ein Verhalten nicht unbedingt freundlich ist.
                        Zuletzt geändert von Slava; 25.08.2007, 23:51.
                        Slava
                        bituniverse.com

                        Kommentar


                        • #13
                          Original geschrieben von 3DMax
                          das ist ja interessant.
                          und wenn du jetzt im php-script explizit (bzw. implizit) den destructor aufrufst?
                          $con=null sollte eigentlich ausreichen.
                          Dann ist es wie erwartet:
                          H:\Programme\xampp\htdocs\fragmente
                          Wir werden alle sterben

                          Kommentar


                          • #14
                            Original geschrieben von combie
                            Dann ist es wie erwartet:
                            H:\Programme\xampp\htdocs\fragmente
                            danke, man lernt halt nie aus.

                            Kommentar


                            • #15
                              Und man muss schon zugeben, dass so ein Verhalten nicht unbedingt freundlich ist.
                              Evtl, ist das ein Fall für einen Bugreport..
                              Wir werden alle sterben

                              Kommentar

                              Lädt...
                              X