readfile() langsam?

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

  • readfile() langsam?

    Hallo,

    Ich lese mittels readfile() Bilder für eine Datenbank ein ein und gebe sie mit hilfe von einer show.php aus. Leider scheint diese Varient sehr langsam in der auslieferung zu sein. Local auf meinem PC klappt es ohne problem und ist auch sehr schnell. Online ist es aber sehr langsam. Alles andere habe ich schon ausgeschloss jemand eine idee wie ich das ganze beschleunigen kann oder wo ich noch suchen kann?

    PHP-Code:
    // Auslesen des $file aus der Mysql DB anhand der ID

    header("Content-type: image/jpeg");                
    readfile($file); 
    ich habe auch schon in der manuel in den user comments geschaut und ein beispiel mit fopen() und fread() gebastelt aber das brachte mich auch nicht weiter, machte es nicht schneller.

    MFG und danke für euere mühe.

  • #2
    Was ist langsam? Debugge mal etwas und führe Zeitmessungen durch. Ist die Datenbank der Flaschenhals? Das Dateisystem? Die Auslieferung an den Client?

    Kommentar


    • #3
      Zitat von Edlly Beitrag anzeigen
      Hallo,

      Ich lese mittels readfile() Bilder für eine Datenbank ein ein ...
      Warum tust du das?
      file_get_contents() wäre sicher besser geeignet, um Daten aus einer Datei einzulesen.
      Und Bilder haben in Datenbanken eigentlich auch nichts zu suchen ...

      ... und gebe sie mit hilfe von einer show.php aus. Leider scheint diese Varient sehr langsam in der auslieferung zu sein. Local auf meinem PC klappt es ohne problem und ist auch sehr schnell. Online ist es aber sehr langsam. Alles andere habe ich schon ausgeschloss jemand eine idee wie ich das ganze beschleunigen kann oder wo ich noch suchen kann?

      PHP-Code:
      // Auslesen des $file aus der Mysql DB anhand der ID

      header("Content-type: image/jpeg");                
      readfile($file); 
      *hüstel*
      Ich sehe in deinem Quellcode-Stückchen, weder einen Datenbankzugriff noch irgendwelche IDs ...
      Du schreibst lediglich den Inhalt einer Datei in die Standardausgabe.
      Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

      Kommentar


      • #4
        Alles andere habe ich schon ausgeschloss j
        Das ist natürlich eine gute Idee...


        Also:
        Verwendest du Sessions?
        Dann spielt dir wohl das Sessionlocking einen Streich.
        Wir werden alle sterben

        Kommentar


        • #5
          Zitat von fireweasel Beitrag anzeigen
          Warum tust du das?
          file_get_contents() wäre sicher besser geeignet, um Daten aus einer Datei einzulesen.
          Und Bilder haben in Datenbanken eigentlich auch nichts zu suchen ...
          Nein die liegen nicht in einer Datenbank sondern Lokal.

          Zitat von fireweasel Beitrag anzeigen
          *hüstel*
          Ich sehe in deinem Quellcode-Stückchen, weder einen Datenbankzugriff noch irgendwelche IDs ...
          Du schreibst lediglich den Inhalt einer Datei in die Standardausgabe.
          Ja genau das mache ich!

          Zitat von combie Beitrag anzeigen
          Das ist natürlich eine gute Idee...


          Also:
          Verwendest du Sessions?
          Dann spielt dir wohl das Sessionlocking einen Streich.
          Hmm das was ich dazu gefunden habe klinkt einleuchtent. Da ich in der show.php also der Anzeigedatei prüfe ob der User das recht hat sie das Bild anzuschauen und dazu einen Session nutze. Also würde mich vieleicht http://de2.php.net/manual/de/functio...rite-close.php weiter bringen. Ich werde das mal testen. Aber das eklärt mir immer noch nicht warum es Öokal ohne probleme geklappt hat, gibt es vieleicht eine einstellung die sag wieviele sesseions ein nutzer gleichzeitig öffnen darfo der in der Art?
          Zuletzt geändert von Edlly; 19.05.2009, 15:56.

          Kommentar


          • #6
            Lokal hat du Requestzeiten von einigen wenigen mSekunden.
            Bei einem Externen Server kannst du bei jedem Request/Bild von 200-300 mSekunden Wasserkopf ausgehen.


            Grob geschätzt extern:
            250 mS fürs HTTP+Apache
            400 mS Für die Bilddaten (500KB unter DSL1024)

            Das macht bei 10 Bildern 6,5 Sekunden.

            ---------------
            Grob geschätzt lokal:
            3 mS fürs HTTP+Apache
            2 mS Für die Bilddaten (500KB)

            Das macht bei 10 Bildern 0,05 Sekunden.
            Wir werden alle sterben

            Kommentar


            • #7
              Nee sorry ich hab mich flasch ausgedrück, mit lokalem Server meinte ich einen Apache der über meine Ip, mittels Dyndns von Extern auch zu erreichen ist. Also nicht nicht über Lan oder gar Localhost.

              Aber ich habe das Problem jetzt eingerenz es liegt wirklich an der Session. Wenn ich die ganzen Sessions auskommentiere dann dauert es nur Sekunden bis alles geladen ist nicht 1-2 minuten.
              Leider weiß ich nicht so recht wie ich das problem lösen soll. Ich zeige mal meine bisheriegen versuche ich hab den Session aufruf auf die stelle begenzt wo es auch wirklich gebraucht wird:

              PHP-Code:
              function Rechte() {
                  
              // Wird in einer Datei als Array definiert
                  
              global $config;

                  
              // Einziger Session Start
                  
              session_start();

                 
              $sql_query_login "SELECT `user_klasse` FROM `".$config['mysql_pre_db']."user`
                           WHERE
                             `user_sessionid` = '"
              .session_id()."' ";
                  
              // Ende der Session
                 
              session_write_close();

                 
              $result mysql_query($sql);
                 
                 if(
              mysql_num_rows($result) == 1){
                    
                    
              $row mysql_fetch_array($result);
                    return 
              $row['user_klasse'];
                   }else{
                    
                    return 
              "0"; }

              Und hier der Code vom Bildaufruf:

              PHP-Code:
              function ShowPicId($pic_id$size="0")
                        {
              // Wird in einer Datei als Array definiert
                  
              global $config;
                  (int)
              $pic_id;
                  (int)
              $size;
                      
              // auslesen des bildes auf der DB
                      
                      
              $sql_bild "SELECT 
                                     `thumb_name`, 
                                     `normal_name`, 
                                     `redu_name`, 
                                     `kat_id`, 
                                     `type`
                                  FROM 
                                     `"
              .$config['mysql_pre_db']."bilder`
                                   WHERE
                                   `id` = '"
              .(int)$pic_id."'
                                   LIMIT 1"
              ;        
                  
                      
              $result_bild mysql_query($sql_bild) or die(mysql_error());

                      if( 
              mysql_num_rows($result_bild) == "1") {
                      
                          
              $row_bild mysql_fetch_array($result_bild);
                          
              // Rechte Prüfen
                                     // KatRechte gibt die benötigte Rechtestufe zurück
                          
              if(Rechte() >= KatRecht($row_bild['kat_id'])){
                           
                          
              // grösse zuweisen
                          
              if($size == 0) {
                          
                          
              $bild_name $row_bild['thumb_name'];    
                          
                          }elseif(
              $size == 1) {
                              
              $bild_name $row_bild['redu_name'];
                          
                          }elseif(
              $size == 2) {
                          
                          
              $bild_name $row_bild['normal_name']; }
                      
                          
              // Bild auslesen und header setzten
                          
              if(file_exists($config['doc_root'].$config['picupload_path'].$bild_name)){
                              
                          
              $header "Content-type: ".$row_bild['type'];
                              
              header($header);
                              
              readfile($config['doc_root'].$config['picupload_path'].$bild_name);
                          
                          }else{
                           echo 
              $config['doc_root'].$config['picupload_path'].$bild_name;            
                              
              header("Content-type: image/jpg");
                              
              readfile($config['doc_root']."pics/cms/no_pic.jpg"); }
                      
                      }else{
                          
                          
              header("Content-type: image/jpg");
                          
              readfile($config['doc_root']."pics/cms/no_pic_right.jpg"); }
                          
                      }else{
                          
              header("Content-type: image/jpg");
                          
              readfile($config['doc_root']."pics/cms/no_pic.jpg"); }
                      } 

              Kommentar


              • #8
                mit lokalem Server meinte ich einen Apache der über meine Ip, mittels Dyndns von Extern auch zu erreichen ist. Also nicht nicht über Lan oder gar Localhost.
                Dein Router macht einen "Kurzschluß".
                Es geht also nur übers LAN

                Du kannst evtl. sogar ganz auf session_start() verzichten.
                (obwohl ich das Verfahren "SID in DB" für schlecht halte)


                PHP-Code:
                function Rechte() {
                    
                // Wird in einer Datei als Array definiert
                    
                global $config;

                    
                // Einziger Session Start
                   // session_start();
                $sid $_COOKIE[session_name()];
                   
                $sql_query_login "SELECT `user_klasse` FROM `".$config['mysql_pre_db']."user`
                             WHERE
                               `user_sessionid` = '"
                .$sid."' ";
                    
                // Ende der Session
                   //session_write_close();

                   
                $result mysql_query($sql);
                   
                   if(
                mysql_num_rows($result) == 1){
                      
                      
                $row mysql_fetch_array($result);
                      return 
                $row['user_klasse'];
                     }else{
                      
                      return 
                "0"; }

                Wir werden alle sterben

                Kommentar


                • #9
                  Zitat von combie Beitrag anzeigen
                  Du kannst evtl. sogar ganz auf session_start() verzichten.
                  (obwohl ich das Verfahren "SID in DB" für schlecht halte)
                  Vielen dank, das hat erstmal abhilfe geschaffen!

                  Aber wieso soll session ID in DB schlecht sein? Wie kann man das sonst machen? besser machen?

                  Kommentar


                  • #10
                    Schlecht ist es, weil die SID als Kriterium verwendet wird.
                    session_regenerate_id() darf nicht mehr verwendet werden
                    Auch wird das Risiko versehendlicher Sessionübernahmen erhöht.

                    Aber eine andere Methode, um einen vergleichbaren "speed" zu erzeugen, fällt mir nicht ein.
                    Zuletzt geändert von combie; 19.05.2009, 20:33.
                    Wir werden alle sterben

                    Kommentar


                    • #11
                      Wieso darf session_regenerate_id() nicht mehr verwendet werden? Wenn man den Session Save Handler sauber schreibt, ist das kein Problem.
                      Wieso steigt das Risiko versehentlicher Sessionübernahmen? Die SID dient auch dem dateibasierten Default Session Handler als Kriterium ... um die richtige Datei zu öffnen.

                      Kommentar


                      • #12
                        Wieso darf session_regenerate_id() nicht mehr verwendet werden? Wenn man den Session Save Handler sauber schreibt, ist das kein Problem.
                        1. Was bekommt denn der Save-Handler vom Regenerate mit? Nix!
                        2. der Session-Handler soll in der DB rumpfuschen? Warum?
                        Wenn sich die SID ändert, ist der DB Eintrag hinfällig/falsch.
                        (ausnahme: punkt 2)

                        Wieso steigt das Risiko versehentlicher Sessionübernahmen? Die SID dient auch dem dateibasierten Default Session Handler als Kriterium ... um die richtige Datei zu öffnen.
                        Die SID bleibt so wie es der TE macht auf Ewig(bis zum nächsten Login) an den User gebunden. Je mehr SIDs in der DB stehen und umso länger sie dort sind, desto größer ist die Gefahr der zufälligen doppel Vergabe.
                        Die Session Müllabfuhr hat keine Chance das zu entfernen.

                        Zusätzlich:
                        1. Nicht jedes System läßt einen eigenen Handler installieren.
                        2. die Wenigsten Leute sind in der Lage einen korrekt funktionierenden Handler zu schreiben.


                        Wie es gedacht ist, und wie es auch gemacht werden sollte:
                        1. Die SID ist Teil der Sessionverwaltung und sollte auch nur von ihr verwendet werden. Nur so verfällt sie rückstandslos.
                        2. Man speichere die User_ID in $_SESSION. Daran, und nur daran ist der User wieder zu erkennen.
                        Meinen Vorschlag an den TE betrachte ich als "dirty Hack".
                        Sicherheit vs. Speed, das muß jeder für sich entscheiden. Aber glücklich JA sagen, kann ich dazu nicht.
                        Zuletzt geändert von combie; 20.05.2009, 10:28.
                        Wir werden alle sterben

                        Kommentar


                        • #13
                          Zitat von combie Beitrag anzeigen
                          1. Was bekommt denn der Save-Handler vom Regenerate mit? Nix!
                          "Wer nicht fragt, bleibt dumm ..."

                          Aber der Save-Handler kann ja fragen - session_id()
                          http://www.php.net/manual/en/functio...e-id.php#83842
                          I don't believe in rebirth. Actually, I never did in my whole lives.

                          Kommentar


                          • #14
                            Und dann?
                            Dann soll der Handler ein DB Update machen?
                            Beim GC Lauf auch?

                            Wenn ein anderes Script in die Quere kommt, bleiben u.U. DB Einträge "hängen".

                            Fixer wirds davon nicht.
                            Und überhaupt, wo sind die Vorteile?
                            Zuletzt geändert von combie; 20.05.2009, 16:36.
                            Wir werden alle sterben

                            Kommentar


                            • #15
                              Zitat von combie Beitrag anzeigen
                              Und überhaupt, wo sind die Vorteile?
                              Hab nicht behauptet, dass ich darin generell welche sehen würde.
                              I don't believe in rebirth. Actually, I never did in my whole lives.

                              Kommentar

                              Lädt...
                              X