php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 18-05-2009, 21:10
Edlly
 Registrierter Benutzer
Links : Onlinestatus : Edlly ist offline
Registriert seit: Apr 2004
Beiträge: 59
Edlly ist zur Zeit noch ein unbeschriebenes Blatt
Standard 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.
Mit Zitat antworten
  #2 (permalink)  
Alt 18-05-2009, 21:39
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Was ist langsam? Debugge mal etwas und führe Zeitmessungen durch. Ist die Datenbank der Flaschenhals? Das Dateisystem? Die Auslieferung an den Client?
Mit Zitat antworten
  #3 (permalink)  
Alt 19-05-2009, 00:17
Benutzerbild von fireweasel fireweasel
 Registrierter Benutzer
Links : Onlinestatus : fireweasel ist offline
Registriert seit: Sep 2008
Ort: At home
Beiträge: 851
fireweasel wird schon bald berühmt werdenfireweasel wird schon bald berühmt werden
fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken
Standard

Zitat:
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 ...

Zitat:
... 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.
Mit Zitat antworten
  #4 (permalink)  
Alt 19-05-2009, 12:03
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

Zitat:
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
Mit Zitat antworten
  #5 (permalink)  
Alt 19-05-2009, 16:48
Edlly
 Registrierter Benutzer
Links : Onlinestatus : Edlly ist offline
Registriert seit: Apr 2004
Beiträge: 59
Edlly ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
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:
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:
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?

Geändert von Edlly (19-05-2009 um 16:56 Uhr)
Mit Zitat antworten
  #6 (permalink)  
Alt 19-05-2009, 17:25
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

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
Mit Zitat antworten
  #7 (permalink)  
Alt 19-05-2009, 17:35
Edlly
 Registrierter Benutzer
Links : Onlinestatus : Edlly ist offline
Registriert seit: Apr 2004
Beiträge: 59
Edlly ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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"); }
        } 
Mit Zitat antworten
  #8 (permalink)  
Alt 19-05-2009, 18:04
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

Zitat:
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
Mit Zitat antworten
  #9 (permalink)  
Alt 19-05-2009, 21:05
Edlly
 Registrierter Benutzer
Links : Onlinestatus : Edlly ist offline
Registriert seit: Apr 2004
Beiträge: 59
Edlly ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
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?
Mit Zitat antworten
  #10 (permalink)  
Alt 19-05-2009, 21:24
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

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.
__________________
Wir werden alle sterben

Geändert von combie (19-05-2009 um 21:33 Uhr)
Mit Zitat antworten
  #11 (permalink)  
Alt 20-05-2009, 10:44
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

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.
Mit Zitat antworten
  #12 (permalink)  
Alt 20-05-2009, 10:54
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

Zitat:
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)

Zitat:
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.
__________________
Wir werden alle sterben

Geändert von combie (20-05-2009 um 11:28 Uhr)
Mit Zitat antworten
  #13 (permalink)  
Alt 20-05-2009, 17:20
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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.
Mit Zitat antworten
  #14 (permalink)  
Alt 20-05-2009, 17:33
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

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?
__________________
Wir werden alle sterben

Geändert von combie (20-05-2009 um 17:36 Uhr)
Mit Zitat antworten
  #15 (permalink)  
Alt 20-05-2009, 17:38
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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.
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
readfile() vs. header() mars_3-142 PHP Developer Forum 1 14-01-2006 15:19
readfile mit Firefox vs. IE philippCH PHP Developer Forum 8 31-03-2005 16:09
readfile() xManUx PHP Developer Forum 26 18-08-2004 05:03
WMV Video - readfile fusiba PHP Developer Forum 3 29-05-2003 20:34
problem mit readfile() Trashar PHP Developer Forum 2 02-04-2002 18:20

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

ADSMAN V3 - Werbe-Manager ansehen ADSMAN V3 - Werbe-Manager

ADSMAN V3 - mehr als nur ein Bannermanager! Banner, Textanzeigen und PagePeel Manager! Mit ADSMAN PRO haben Sie die Marketinglösung für eine effektive und effiziente Werbeschaltung mit messbaren Ergebnissen. Unterstützt werden Bannerformate in beliebi

25.10.2018 virtualsystem | Kategorie: PHP/ Bannerverwaltung
PHP News und Artikel Script V2

News schreiben, verwalten, veröffentlichen. Dies ist jetzt mit dem neuen PHP News & Artikel System von virtualsystem.de noch einfacher. Die integrierte Multi-User-Funktion und der WYSIWYG-Editor (MS-Office ähnliche Bedienung) ermöglichen...

25.10.2018 virtualsystem | Kategorie: PHP/ News
Top-Side Guestbook

Gästebuch auf Textbasis (kein MySQL nötig) mit Smilies, Ip Sperre (Zeit selbst einstellbar), Spamschutz, Captcha (Code-Eingabe), BB-Code, Hitcounter, Löschfunktion, Editierfunktion, Kommentarfunktion, Kürzung langer Wörter, Seiten- bzw. Blätterfunktion, V

22.10.2018 webmaster10 | Kategorie: PHP/ Gaestebuch
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 00:35 Uhr.