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 02-03-2011, 11:06
Errraddicator
 Registrierter Benutzer
Links : Onlinestatus : Errraddicator ist offline
Registriert seit: Dec 2005
Beiträge: 9
Errraddicator ist zur Zeit noch ein unbeschriebenes Blatt
Standard readfile / readfile_chunked Problem

Hallo Leute!

Ich habe ein kurioses Problem.
Ich leite Dateien via readfile bzw. readfile_chunked an den Benutzer weiter.
Das funktioniert auch an sich einwandfrei und auch rattenschnell, aber ab ca. genau 20 MB klappt das nicht mehr, und der Internet Explorer bricht nach ein paar Sekunden ab.

Ich erhalte keinerlei Fehlermeldungen, der Browser hört einfach auf und quittiert mit einer Internet Explorer Eigenen Fehlerseite.
Auch in den beteiligten Log-Dateien steht keinerlei Fehler, Warnung oder Hinweis.

Meine Maximum Execution und Input Time liegen jeweils bei 480 Sekunden.
Mein Memory Limit bei 512 MB.
Des weiteren tritt das Problem nicht nur bei readfile, sondern auch bei readfile_chunked auf, dort ändert sich nichts.
Als Webserver benutze ich einen Apache 2.

Mir gehen aktuell die Ideen aus, zumal alles was ich im Netz finden konnte, wahlweise mit readfile_chunked funktioniert hat, oder das Problem offen stehen geblieben ist.

Hat vielleicht wer eine Idee?


Danke im Voraus

Patrick
Mit Zitat antworten
  #2 (permalink)  
Alt 02-03-2011, 11:23
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

Sendest du Header, die nicht zum Payload passen, z.B. Content-Length <=20MB und dann >20MB Daten?
Zeig mal den Code!
Mit Zitat antworten
  #3 (permalink)  
Alt 02-03-2011, 11:24
Quetschi
 PHP Expert
Links : Onlinestatus : Quetschi ist offline
Registriert seit: Dec 2004
Beiträge: 3.134
Quetschi wird schon bald berühmt werden
Standard

Hast du schonmal ein Tool zum mitlesen der http-header benutzt? Evtl. findet sich da ein Hinweis.

Was ist readfile_chunked? Kann die Funktion im PHP-Manual nicht finden - auch kein Hinweis auf eine ähnlich benamte Funktion im Manual unter PHP: readfile - Manual

EDIT:
Ok - wahrscheinlich das aus den User Contributed Notes.

Tippe wie onemorenerd auch auf ein Problem mit den Headern.
__________________
Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
Schön - etwas Geschichte kann ja nicht schaden.
Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

Geändert von Quetschi (02-03-2011 um 11:30 Uhr)
Mit Zitat antworten
  #4 (permalink)  
Alt 02-03-2011, 11:57
Errraddicator
 Registrierter Benutzer
Links : Onlinestatus : Errraddicator ist offline
Registriert seit: Dec 2005
Beiträge: 9
Errraddicator ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Also das hier ist der entsprechende Quellcode was den Download betrifft.

PHP-Code:
        // download the file
        
header('Content-Type: application/octet-stream');
        
header('Content-Disposition: attachment; filename=abc.zip');
        
header('Content-Length: ' $size);
        
readfile_chunked($target); 
Ich habe wie gesagt schon readfile, sowie readfile_chunked probiert. Beides das gleiche Ergebnis.

Auch habe ich die Länge komplett weggelassen, kein Erfolg.
Bei der 20 MB Datei beträgt die Länge z.B. ~21.000.000 Bytes, ist also korrekt.

Als Content-Type habe ich auch zusätzlich schon force-download probiert, ebenfalls kein Erfolg.

Das seltsame ist für mich, dass der Browser bereits nach max. 2, 3 Sekunden weiß, dass er nix zu tun hat und mit "Die Webseite kann nicht angezeigt werden." antwortet...
Mit Zitat antworten
  #5 (permalink)  
Alt 02-03-2011, 12:02
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.576
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Verwendest du HTTPS?

Woher kommt $size?
Mit Zitat antworten
  #6 (permalink)  
Alt 02-03-2011, 12:05
Quetschi
 PHP Expert
Links : Onlinestatus : Quetschi ist offline
Registriert seit: Dec 2004
Beiträge: 3.134
Quetschi wird schon bald berühmt werden
Standard

Ich wiederhole mich - Header beobachten - da dürfte der Hund begraben liegen.
__________________
Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
Schön - etwas Geschichte kann ja nicht schaden.
Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!
Mit Zitat antworten
  #7 (permalink)  
Alt 02-03-2011, 12:09
Errraddicator
 Registrierter Benutzer
Links : Onlinestatus : Errraddicator ist offline
Registriert seit: Dec 2005
Beiträge: 9
Errraddicator ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ja, ich verwende HTTPS.
Spielt das dabei eine Rolle?

$size kommt hier her
PHP-Code:
$size filesize($target); 
$target ist der Pfad zur Datei.
Mit Zitat antworten
  #8 (permalink)  
Alt 02-03-2011, 12:13
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.576
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Errraddicator Beitrag anzeigen
Ja, ich verwende HTTPS.
Spielt das dabei eine Rolle?
Ja, eine sehr große. Der IE führt sich auf wie eine Diva, wenn es um HTTPS geht. Der braucht immer ganz spezielle Header. Google hilft weiter.
Mit Zitat antworten
  #9 (permalink)  
Alt 02-03-2011, 12:16
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

Die Funktion readfile_chunked aus den User Comments auf PHP: readfile - Manual gibt, so wie du sie aufrufst, ein Array zurück. Würdest du das wie einen String ausgeben, wäre das Ergebnis nur "Array". Doch du gibst es gar nicht aus! Anders als readfile() schreibt readfile_chunked() nämlich nicht direkt in den Ausgabepuffer.

Übrigens ist diese Funktion ziemlicher Mist. Wenn man als zweiten Parameter "string" übergibt, erhält man nur die letzte Zeile. Wenn man irgendwas außer "array" und "string" übergibt, erhält man eine Warnung und NULL. $buffer wird überhaupt nicht verwendet.
Merke: Nicht alles in den UC ist gut!

Machs doch erstmal mit readfile(). Wenn das funktioniert, kannst du ja versuchen, chunked transfer umzusetzen - falls du es überhaupt brauchst.

Edit: Jetzt sehe ich erst, dass es weiter unten in den UC eine weitere Version von readfile_chunked gibt, die auf den ersten Blick besser aussieht. Auch nicht das Gelbe vom Ei, aber sollte wenigstens funktionieren.

Geändert von onemorenerd (02-03-2011 um 12:22 Uhr)
Mit Zitat antworten
  #10 (permalink)  
Alt 02-03-2011, 12:39
Quetschi
 PHP Expert
Links : Onlinestatus : Quetschi ist offline
Registriert seit: Dec 2004
Beiträge: 3.134
Quetschi wird schon bald berühmt werden
Standard

Hab mich auch grad kirre gemacht was die Funktion überhaupt bringen soll

Bin auch der Meinung, dass erstmal readfile benutzt werden sollte um das zum laufen zu bringen - chunked-Transfer kann man sich dann im Anschluss ansehen. Und das hat ja auch nicht damit zu tun, ob man die Datei nur häppchenweise in PHP ausliest. Es muss dann ja vor jedem Chunk noch die Information in der Ausgabe bereitgestellt werden, wie lang das jeweilige Stückchen ist.
__________________
Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
Schön - etwas Geschichte kann ja nicht schaden.
Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!
Mit Zitat antworten
  #11 (permalink)  
Alt 02-03-2011, 12:46
Errraddicator
 Registrierter Benutzer
Links : Onlinestatus : Errraddicator ist offline
Registriert seit: Dec 2005
Beiträge: 9
Errraddicator ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ne ne, also die readfile_chunked funktion funzt schon einwandfrei, aber eben (genauso wie readfile!) nur bis zu der Grenze von ca. 20 MB.

Des Weiteren habe ich die Funktion etwas gekürzt (was Ihr nich wissen konntet, aber eigentlich auch nix zur Sache tut, da ich ja geschrieben habe, dass sie per se einwandfrei funktioniert *G*)

PHP-Code:
  function readfile_chunked($filename)
  { 
    
$chunksize 256 1024// how many bytes per chunk 
    
    
$handle fopen($filename'rb'); 
    if(
$handle !== false)
    {
      while(!
feof($handle) )
      { 
        
$buffer fread($handle$chunksize); 
        echo 
$buffer
        
ob_flush(); 
        
flush();
      }
      
      
fclose($handle);
    }
  } 
Aber wie gesagt is das ja eigentlich auch völlig latte, weil ich mit readfile 1:1 das gleiche Verhalten bekomme.

Ich vermute mal, das Problem wird hier wirklich der IE in Kombination mit dem HTTPS sein.
Muss ich mal schauen, ob ich hierzu einen Anhaltspunkt finde.

Geändert von Errraddicator (02-03-2011 um 12:48 Uhr)
Mit Zitat antworten
  #12 (permalink)  
Alt 02-03-2011, 16:23
Errraddicator
 Registrierter Benutzer
Links : Onlinestatus : Errraddicator ist offline
Registriert seit: Dec 2005
Beiträge: 9
Errraddicator ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Also ich konnte das Problem noch weiter einschränken.
Das Problem tritt NUR bei .zip Dateien auf.

Wenn ich z.B. über die gleiche Methodik eine 40 MB PDF-Datei downloaden möchte klappt das einwandfrei. Habe ich (wie in meinem Fall) eine 20 MB .zip-Datei, so kommt die Fehlermeldung / bricht der Internet Explorer ab.

Selbst wenn ich die Endung wegnehme kommt dieser Fehler, da er anscheinend nicht nach der Endung geht, sondern den Inhalt auf Dateityp überprüft.

Umgehen kann ich das Problem also z.B., wenn ich vor dem Dateiinhalt noch eine "0" z.B. ausgebe. Dann bietet er mir die Datei zwar nicht zum Download an, weil er sie nicht mehr als .zip erkennt, sondern schreibt mir den Inhalt ganz blöd in das Browserfenster, aber immerhin die vollen 20 MB.

Irgendwie bin ich gerade überfragt, wie ich das in den Griff kriegen soll
Mit Zitat antworten
  #13 (permalink)  
Alt 02-03-2011, 16:25
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.576
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Errraddicator Beitrag anzeigen
Umgehen kann ich das Problem also z.B., wenn ich vor dem Dateiinhalt noch eine "0" z.B. ausgebe. Dann bietet er mir die Datei zwar nicht zum Download an, weil er sie nicht mehr als .zip erkennt, sondern schreibt mir den Inhalt ganz blöd in das Browserfenster, aber immerhin die vollen 20 MB.
Dann stimmt was mit den Headern nicht. Hast du dir die Header jetzt eigentlich schon angeschaut?
Mit Zitat antworten
  #14 (permalink)  
Alt 02-03-2011, 16:29
Errraddicator
 Registrierter Benutzer
Links : Onlinestatus : Errraddicator ist offline
Registriert seit: Dec 2005
Beiträge: 9
Errraddicator ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Angeschaut schon, aber da stand jetzt für mich nix sinnvolles drin.
Wonach soll ich dort denn ausschau halten?

Und wenn der Header generell falsch ist, warum funktioniert es dann mit 40 MB PDF Dateien, 20 MB TXT-Daten und 18 MB zip-Daten, aber nicht mit > 20 MB zip Daten?
Da will sich mir die Systematik nicht so recht erschließen, wenn ich ehrlich bin.
Mit Zitat antworten
  #15 (permalink)  
Alt 02-03-2011, 17:10
Errraddicator
 Registrierter Benutzer
Links : Onlinestatus : Errraddicator ist offline
Registriert seit: Dec 2005
Beiträge: 9
Errraddicator ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Das Problem konnte ich zwar immer noch nicht lokalisieren, aber ich habe zumindest eine Umgehung geschaffen, indem ich die Datei nun verlinke und nicht per readfile ausgebe.

Das funktioniert seltsamerweise.
Nun muss der Benutzer halt einmal mehr klicken... Nicht ideal, aber besser wie nur Teildaten zu erhalten allemal.
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
Problem mit Readfile hilfebedürftig PHP Developer Forum 13 07-12-2006 19:32
readfile() vs. header() mars_3-142 PHP Developer Forum 1 14-01-2006 14:19
readfile() xManUx PHP Developer Forum 26 18-08-2004 04:03
Problem bei readfile() und EXE Cuthbert PHP Developer Forum 2 09-07-2004 12:46
problem mit readfile() Trashar PHP Developer Forum 2 02-04-2002 17: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

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 10:33 Uhr.