[solved] filedownload per php geht nicht

Apache, Lighttpd, nginx, Cherokee
Post Reply
djcrackman
Posts: 207
Joined: 2005-06-02 11:58
Contact:
 

[solved] filedownload per php geht nicht

Post by djcrackman »

Guten Morgen!

Hab folgendes Problem: Musste vor ca 3 Wochen einen unserer internen FileServer von Fedora auf Gentoo umstellen. Auf dem FS läuft ein PHP-Script welches ein Download-Archiv zur Verfügung stellt. Die files die darüber geladen werden sollen, sind zwischen 0.5 und 400MB gro�?. Vor der Umstellung lief alles problemlos.

Seit der Umstellung funktionieren die Downloads nicht mehr. Jedes herunter geladene file ist exakt 2.000.000 Bytes gro�?. Au�?er es ist kleiner als der angegebene Wert, dann funktioniert dies ganz normal.

Langsam aber sicher bin ich am verzweifeln: es liegt definitiv an PHP, denn der normale Download aus einem Apache DirectoryListing funktioniert.

Hier mal das Script (es hat jedoch zuvor einwandfrei funktioniert und es funktioniert auch auf anderen Server ohne Probleme):

Code: Select all

<?php

$filename = 'xyz.exe';
$realname = basename($plan);

header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename="$realname"");
header("Content-type: application/force_download");
header("Content-Transfer-Encoding: binary");
header("Content-length: " . filesize($filename) );

readfile($filename);
exit;
?>
PHP habe ich mit folgendem Kommando kompiliert:

Code: Select all

'./configure' 
'--prefix=/opt/php_5.0.4/' 
'--with-apxs=/opt/apache_1.3.33/bin/apxs' 
'--disable-cgi' 
'--with-libxml-dir=/opt/libxml2_2.6.19/' 
'--with-openssl=/opt/openssl_0.9.8/' 
'--with-zlib=/opt/zlib_1.2.2/' 
'--enable-bcmath' 
'--enable-calendar' 
'--with-curl=/opt/curl_7.14.0' 
'--with-curlwrappers' 
'--enable-ftp' 
'--enable-mbstring' 
'--with-mysql=/opt/mysql-max_4.1.12/' 
'--with-mysqli=/opt/mysql-max_4.1.12/bin/mysql_config' 
'--enable-memory-limit' 
'--without-pear'
Und jetzt noch die (meiner Meinung nach) relevanten Settings, die den Download beeinflussen könnten:

Code: Select all

max_execution_time = 5000
max_input_time     = 5000
memory_limit       = 256M
register_globals   = Off
safe_mode          = Off
Laufen tut das Ganze auf folgendem System:

Code: Select all

Linux version 2.6.11-hardened-r14 (root@livecd) (gcc version 3.3.5-20050130 (Gentoo 3.3.5.20050130-r1, ssp-3.3.5.20050130-1, pie-8.7.7.1)) #3 SMP Mon Jul 4 16:55:26 GMT 2005
Irgendjemand eine Idee wo ich noch suchen könnten? Danke im Voraus


mit freundlichen Grü�?en

Jürgen Jaritsch
Last edited by djcrackman on 2006-04-09 14:54, edited 1 time in total.
djcrackman
Posts: 207
Joined: 2005-06-02 11:58
Contact:
 

Re: [solved] filedownload per php geht nicht

Post by djcrackman »

Sehr witzig *hmpf*:

Ich habe jetzt testweiße mal PHP 4.4.0 mit dem gleichen Kommando (Pfade angepasst) kompiliert und siehe da: der Download funktioniert wunderbar.

Das heißt ich werde jetzt mal die phpinfo's vergleichen, vielleicht ist da wo der Hund begraben.


mit freundlichen Grüßen

Jürgen Jaritsch
djcrackman
Posts: 207
Joined: 2005-06-02 11:58
Contact:
 

Re: [solved] filedownload per php geht nicht

Post by djcrackman »

So, ich kanns im Moment nicht ganz glauben, aber es ist so:

Mit PHP 5.1.0_beta3 funktioniert es ohne Probleme. Wieso auch immer. Ein Neukompelieren von 5.0.4 brachte auch keinen Erfolg. Jetzt hab ich mal die Beta eingespielt, damit das Teil funktioniert, aber vielleicht hat ja doch jemand einen Lösungsansatz für mich.

mit freundlichen Grüßen

Jürgen Jaritsch
maku
Posts: 58
Joined: 2003-03-26 15:14
Location: Köln
 

Re: [solved] filedownload per php geht nicht

Post by maku »

Hi,

ich habe nahezu genau das gleiche Problem, allerdings:

Ich habe zwei Rechner geupdated (SuSE9.1) von php4.X auf 5.0.4. Beide identisch kompiliert (apache,mysql, php, pgsql, mod_ssl ...) und auch die php.ini ist identisch. Nur ist der eine ein Dual und der andere ein single-Prozessor System. Nun ja, das Kuriose ist, dass auf dem single System alle Downloads (nicht uploads!) auf knapp 2MB kastriert werden. Auf dem Dual Rechner funktionieren alle Downloads wunderbar; egal wieviel größer als 2MB die Dateien sind. Wie gesagt - identische Konfiguration ...

Von daher wäre ich ebenfalls sehr an einer Lösung interessiert!
Oder macht es Sinn die 5.1.x Berta zu nehmen ...?

Danke und Gruß,

Mark
djcrackman
Posts: 207
Joined: 2005-06-02 11:58
Contact:
 

Re: [solved] filedownload per php geht nicht

Post by djcrackman »

Wir haben die Beta bei uns intern getestet und sind zu folgendem Ergebnis gekommen:

- file-Streams funktionieren (files ~2.6GB)
- Array-Management funktioniert
- mySQL und pgSQL funktionieren
- Sessions funktionieren
- Webbased fileuploads funktionieren

Ich denke mal alles relevante sollte ohne Probleme werkeln. Wenn du etwas spezielles hast, dann kann ich es ja gerne für dich testen ;). Aber wie gesagt: Probier es mal mit der Beta, würde mich interessieren, ob bei dir das Problem ebenfalls verschwindet.

mit freundlichen Grüßen // best regards

Jürgen Jaritsch
djcrackman
Posts: 207
Joined: 2005-06-02 11:58
Contact:
 

Re: [solved] filedownload per php geht nicht

Post by djcrackman »

*seufz* Leider besteht das Problem in PHP 5.0.4 nach wie vor - ein Datei-stream lässt exakt 2MB durch und das wars. Ein PHP-Update ist auf diesem System leider nicht möglich. Die Bug-List auf php.net hat mir dies bezüglich nichts ausgespuckt - irgendjemand eine Idee?

edit:

Da war ich voreilig, tut mir leid *seufz*:

http://bugs.php.net/bug.php?id=32816&edit=1
hornox
Posts: 139
Joined: 2005-09-22 23:09
 

Re: [solved] filedownload per php geht nicht

Post by hornox »

Es gibt auch Workarounds (wenn man keine CVS Version verwenden will):
http://www.php.net/manual/de/function.readfile.php
flobee at gmail dot com
06-May-2005 11:17
regarding php5:
i found out that there is already a disscussion @php-dev about readfile() and fpassthru() where only exactly 2 MB will be delivered.

so you may use this on php5 to get lager files

Code: Select all

<?php
function readfile_chunked($filename,$retbytes=true) {
   $chunksize = 1*(1024*1024); // how many bytes per chunk
   $buffer = '';
   $cnt =0;
   // $handle = fopen($filename, 'rb');
   $handle = fopen($filename, 'rb');
   if ($handle === false) {
       return false;
   }
   while (!feof($handle)) {
       $buffer = fread($handle, $chunksize);
       echo $buffer;
       if ($retbytes) {
           $cnt += strlen($buffer);
       }
   }
       $status = fclose($handle);
   if ($retbytes && $status) {
       return $cnt; // return num. bytes delivered like readfile() does.
   } 
   return $status;

} 
?>
djcrackman
Posts: 207
Joined: 2005-06-02 11:58
Contact:
 

Re: [solved] filedownload per php geht nicht

Post by djcrackman »

Äh - auf die Idee im Manual nach einem Workarround zu suchen bin ich nicht gekommen *lacht*. Herzlichen Dank, das erspart mir das Update auf 5.1.2.
Post Reply