ERLEDIGT
NEIN
NEIN
ANTWORTEN
4
4
ZUGRIFFE
1494
1494
EMPFEHLEN
-
Guten Tag,
ich habe mir ein Script geschrieben, bei dem der Dateidownload nicht über den direkten
Link der datei läuft, sondern ich setze den header und gebe den Inhalt der Datei mittels
"echo" aus. Erst hatte ich es so probiert:
Das hatte allerdings den Nachteil, dass die zum download bereitgestellte DateiPHP-Code:if ( file_exists( 'blabla.ext' ) === true ) {
echo @file_get_contents( 'blabla.ext' );
}
vollständig in den Arbeitsspeicher geladen wurde. Dazu habe ich auch schon abhilfe
geschaffen, indem ich immer nur eine kleinere menge auf einmal aus der Datei lese.
Mit dieser Lösung gibt es nur noch ein Problem, welches ich nicht lösen konnte.PHP-Code:if ( file_exists( './usr/' . $File ) === true ) {
$FileHandle = @fopen( './usr/' . $File, 'r' );
if ( $FileHandle ) {
header( 'Content-Type: application/octet-stream' );
header( 'Content-Length: ' . ( filesize( './usr/' . $File ) ) );
header( 'Content-Disposition: attachment; filename="' . $fileSplit[ count( $fileSplit ) - 1 ] . '"' );
header( 'Content-Transfer-Encoding: binary' );
while ( true ) {
$Buffer = '';
$Byte = null;
for ( $i = 0;$i < 131072;++ $i ) {
$Byte = @fgetc( $FileHandle );
if ( $Byte === false ) {
break;
}
$Buffer .= $Byte;
}
echo $Buffer;
if ( $Byte === false || connection_aborted() !== 0 ) {
break;
}
sleep( 1 );
}
} else {
$Logger->Log( 'Download.php: Unavaiable file(./usr/' . $File . ')! User: ' . $_SESSION[ 'authed_usr' ] );
echo '<font size="4">File not avaiable!</font>';
}
} else {
$Logger->Log( 'Download.php: Unavaiable file(./usr/' . $File . ')! User: ' . $_SESSION[ 'authed_usr' ] );
echo '<font size="4">File not avaiable!</font>';
}
Die Schleife, die den $Buffer füllt,
, Konsumiert zuviel CPU-Zeit, sprich die auslastungPHP-Code:for ( $i = 0;$i < 131072;++ $i ) {
ist bei schon nur einem Benutzer beispielsweise bei 10%.
Dann habe ich versucht usleep zu benutzen:
usleep aber scheint immer gleich lahm zu sein und ich habe nur eine downloadratePHP-Code:usleep( 1000 ); // 1 ms
von nichteinmal einem KByte. Wie auf php.net beschrieben, soll usleep seit PHP 5.0.0
auch auf windows systemem richtig funktionieren. Installiert habe ich Apache 2.2.8 mit
PHP 5.2.5. Nach dem was ich ausprobiert habe scheint usleep doch nicht zu
funktionieren(WinXP Pro x64). Gibt es eine andere möglichkeit die Scriptausführung
zu drosseln, sodas die Downloads sogut wie keine performance klauen?
Best wishes
FBIagentGeändert von FBIagent (08.04.08 um 20:53 Uhr)
Don't blame people for bugs. Work together to make things better. No
finger pointing! Not ever! A good rule is to Never Assume An Attack.
If you find yourself getting angry, assume it's a misunderstanding, not an
attack.
-
08.04.08 21:33 #2
- Registriert seit
- Dec 2007
- Ort
- Bremen
- Beiträge
- 3.418
Hi,
Hast Du es einfach mal mit:PHP-Code:if ( file_exists( 'blabla.ext' ) === true ) {
echo @file_get_contents( 'blabla.ext' );
}
probiert?PHP-Code:readfile('blabla.ext');
LG
-
Wird da denn nicht auch alles in den Arbeitsspeicher geladen?
Ich möchte schon bei meinem Zweiten Ansatz bleiben, da ich so auch die Downloadrate
pro Benutzer drosseln kann und das Script beenden wenn connection_aborted() wärend ich
die Datei sende. Das Script soll sowohl für kleine als auch große Dateien gut performen(ich
gehe jetzt mal davon aus das readfile auch seine Zeit braucht bei einer 500MByte Datei).
Gibts keine alternative zu usleep() auf Windows?
Best wishes
FBIagentGeändert von FBIagent (08.04.08 um 21:46 Uhr)
Don't blame people for bugs. Work together to make things better. No
finger pointing! Not ever! A good rule is to Never Assume An Attack.
If you find yourself getting angry, assume it's a misunderstanding, not an
attack.
-
08.04.08 21:56 #4
- Registriert seit
- Dec 2007
- Ort
- Bremen
- Beiträge
- 3.418
Hi,
Doch, stimmt.Wird da denn nicht auch alles in den Arbeitsspeicher geladen?
Wenn Dein Problem nur die for-Schleife ist:
Dass das lahm ist, wenn Du die Datei zeichenweise liest, ist eigentlich klar. Versuch's doch mal blockweise mit fread.
Ich glaube, in den User Contributed Notes zu readfile hatten auch einige Routinen mit fread gepostet.
LG
-
Lese doch bitte noch einmal genau was ich geschrieben habe...
Die "for" schleife, so wie sie da oben steht, performt sehr gut.
Das einzigste Problem was ich hier habe ist, dass "usleep" nicht zu
funktionieren scheint wie erwartet. Die Schleife läuft perfekt, nur das
ich 10% CPU auslastung pro Benutzer habe, wenn ich keine
Wartefunktion einbaue, die die Schleife bremst.
Ich wusste garnicht, dass da in den User Comments Beispiele für nen Datei Download sind.
Naja ändert aber auch wieder nichts daran, dass fread mir die 10% COU auslastung nicht erspart.
Gibt es eine andere Wartefunktion die ich anstatt "usleep" benutzen kann?
Klar sleep aber die kann ich ja nicht benutzen, muss schon mindestens runter auf Millisekunden.
Best wishes
FBIagentGeändert von FBIagent (08.04.08 um 22:58 Uhr)
Don't blame people for bugs. Work together to make things better. No
finger pointing! Not ever! A good rule is to Never Assume An Attack.
If you find yourself getting angry, assume it's a misunderstanding, not an
attack.
Ähnliche Themen
-
Richtige Syntax bei Operatorüberladung, wann sind "friend", "const", "&" nötig?
Von mrs_schokokeks im Forum C/C++Antworten: 4Letzter Beitrag: 25.08.10, 19:13 -
$_SERVER[DOCUMENT_ROOT] ';"; echo "blubber";exit;
Von enne im Forum vB-TestforumAntworten: 0Letzter Beitrag: 23.07.09, 11:58 -
Eingabe in der timeline: "time*100" - bei Effekt "turbulentes Versetzen"-"Evolution"
Von MTMonline im Forum Videoschnitt, Videotechnik & -produktionAntworten: 2Letzter Beitrag: 25.04.08, 09:49 -
Finder methods + JBoss + Was expecting one of: "CONCAT" "SUBSTRING" ... "(" ... <STRI
Von cengizhdde im Forum Enterprise Java (JEE, J2EE, Spring & Co.)Antworten: 6Letzter Beitrag: 27.05.05, 15:29 -
Datei-Eigenschaften: "erstellt:","Geändert am", "Letzter Zugriff:"
Von KILLSMAKER im Forum C/C++Antworten: 2Letzter Beitrag: 19.05.05, 19:51





Zitieren
Login






[PHP] [Codeschnipsel] ImageColor aus HTML-Farbcodierung erstellen