Probleme mit Dateien über 2 GB

Irgendwelche Probleme mit XAMPP für Linux? Dann ist hier genau der richtige Ort um nachzufragen.

Postby Nobbie » 13. October 2008 11:42

Ersetze im Script diese Zeile

Code: Select all
readfile('/folder1/datei2.iso');


durch diese Zeile

Code: Select all
system('cat /folder1/datei2.iso');


Allerdings möchte ich anmerken, dass ich dieses Verfahren für schlecht halte, weil es massiv an die Grenzen von PHP (und HTTP) stößt. Möglicherweise wirst Du nun an weitere Probleme bekommen (Timeout usw.), weil diese Art von Download von allen die schlechteste ist. Dieses Script läuft exakt so ohnehin nur unter Linux.

Am besten wäre ein Download via FTP, aber wenn es unbedingt via HTTP sein muss, dann würde ich wenigstens ohne aktives PHP den Download aktivieren, indem Du beispielsweise einen Link generierst, der auf die herunterzuladende Datei zielt, also ungefähr so:

Code: Select all
<a href="http://www.domainname.de/folder1/datei2.iso">Bitte hier rechts klicken und mit "Speichern unter..." abspeichern</a>
Nobbie
 
Posts: 8783
Joined: 09. March 2008 13:04

Postby glitzi85 » 13. October 2008 12:33

Hab das ganze jetzt mal auf meinem Backup-Server durchgespielt und da klappt es auch wunderbar. Auch nach einem Neustart. Die phpinfo war übrigens doch kein so geschickter Anhaltspunkt, die Ausgabe hat bei mir z.B. komplett gefehlt.

Eigentlich sollten die Flags nach Neustart NICHT gesetzt sein, die sollten nur während der aktuellen Session gelten!

Warum führst du die Befehle nicht so aus wie beschrieben? Probier es mal so:

Code: Select all
export PATH="/opt/lampp/bin:$PATH" CFLAGS="-O6 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/opt/lampp/include/libpng -I/opt/lampp/include/ncurses -I/opt/lampp/include -L/opt/lampp/lib" ./configure --prefix=/opt/lampp --with-apxs2=/opt/lampp/bin/apxs --with-config-file-path=/opt/lampp/etc --with-mysql=/opt/lampp --enable-inline-optimization --disable-debug --enable-bcmath --enable-calendar --enable-ctype --enable-dbase --enable-discard-path --enable-exif --enable-filepro --enable-force-cgi-redirect --enable-ftp --enable-gd-imgstrttf --enable-gd-native-ttf --with-ttf --enable-magic-quotes --enable-memory-limit --enable-shmop --enable-sigchild --enable-sysvsem --enable-sysvshm --enable-track-vars --enable-trans-sid --enable-wddx --enable-yp --with-ftp --with-gdbm=/opt/lampp --with-jpeg-dir=/opt/lampp --with-png-dir=/opt/lampp --with-tiff-dir=/opt/lampp --with-freetype-dir=/opt/lampp --without-xpm --with-zlib=yes --with-zlib-dir=/opt/lampp --with-openssl=/opt/lampp --with-expat-dir=/opt/lampp --enable-xslt --with-xslt-sablot=/opt/lampp --with-dom=/opt/lampp --with-ldap=/opt/lampp --with-ncurses=/opt/lampp --with-gd --with-imap-dir=/opt/lampp --with-imap-ssl --with-imap=/opt/lampp --with-gettext=/opt/lampp --with-mssql=/opt/lampp --with-mysql-sock=/opt/lampp/var/mysql/mysql.sock --with-mcrypt=/opt/lampp --with-mhash=/opt/lampp --enable-sockets --enable-mbstring=all --with-curl=/opt/lampp --enable-mbregex --enable-zend-multibyte --enable-exif --enable-pcntl --with-mime-magic --with-iconv && make && make install && /home/lampp/bin/php-version-cp


Wenn es so auch nicht klappt weiß ich auch nicht mehr weiter.

@Nobbie: Wenn das readfile nicht länger als die max_execution_time benötigt sollten doch eigentlich keine Probleme auftreten, oder?

mfg glitzi
User avatar
glitzi85
 
Posts: 1920
Joined: 05. March 2004 23:26
Location: Dahoim

Postby esfaueen » 13. October 2008 14:53

Vielen Dank glitzi85 für Deine Hilfe & auch an alle anderen Vielen Dank!

Wiederum kommen nur weisse Seiten .... Hm, könntest Du mir evtl. mal deine httpd.conf und php.ini oder so zukommen lassen, so langsam denke ich, dass es nicht am neu kompilieren liegt.

edit:

hier nochmals meine bisher verwendeten versionen:

SLES 10 SP2
XAMPP 1.6.7
XAMPP-DEVEL 1.6.7
PHP 4.4.9

edit2:

Nobbie wrote:Ersetze im Script diese Zeile

Code: Select all
readfile('/folder1/datei2.iso');


durch diese Zeile

Code: Select all
system('cat /folder1/datei2.iso');



Dachte das funktionert ..... bricht aber jeden Download ab .... (Einmal bei 1 GB, einmal bei 300 MB) ....

MfG
esfaueen
 
Posts: 22
Joined: 08. September 2008 15:22

Postby Nobbie » 13. October 2008 15:38

esfaueen wrote:Dachte das funktionert ..... bricht aber jeden Download ab .... (Einmal bei 1 GB, einmal bei 300 MB) ....


Weil es an die nächste Grenze stößt (max_execution_time?). D.h. im Klartext, selbst WENN Du es mit readfile() und large file support compiliert bekommst - es würde genauso abbrechen.

Kannst ja die max_execution_time auf 0 stellen, dann gibt es gar keine Beschränkung in der Laufzeit. Aber "schön" ist die Lösung nicht.
Nobbie
 
Posts: 8783
Joined: 09. March 2008 13:04

Postby esfaueen » 13. October 2008 15:56

Nobbie wrote:
esfaueen wrote:Dachte das funktionert ..... bricht aber jeden Download ab .... (Einmal bei 1 GB, einmal bei 300 MB) ....


Weil es an die nächste Grenze stößt (max_execution_time?). D.h. im Klartext, selbst WENN Du es mit readfile() und large file support compiliert bekommst - es würde genauso abbrechen.

Kannst ja die max_execution_time auf 0 stellen, dann gibt es gar keine Beschränkung in der Laufzeit. Aber "schön" ist die Lösung nicht.


Naja , wenn ich den Wert auf 0 setze, so bricht er dennoch ab ...
esfaueen
 
Posts: 22
Joined: 08. September 2008 15:22

Postby Nobbie » 13. October 2008 16:44

.. was bedeutet, dass er an eine weitere Beschränkung stößt (welche auch immer es ist).

Nun wird Dir wahrscheinlich klar, wieso ich diese "Lösung" schlecht finde. PHP und HTTP sind nicht für solche gigantischen Downloads geeignet (auch wenn es bisweilen klappen mag).

Wenn Du wengstens PHP aus dem Spiel läßt und den Tipp mit dem Link in die Tat umsetzt, das sollte eigentlich funktionieren.
Nobbie
 
Posts: 8783
Joined: 09. March 2008 13:04

Postby glitzi85 » 13. October 2008 20:18

Also bei mir läuft der Download ohne Probleme durch. Hätte mich auch gewundert wenn nicht. Hier die Parameter:

Linux VPS mit 512MB garantiertem RAM
Debian 4.0
Apache/2.2.9
PHP 5.2.6
glibc 2.3.6

kompiliert ohne besondere Angaben (außer den besprochenen CFLAGS).

Apache und PHP laufen auf den Standard-Configs, hier die relevanten Teile der php.ini:

Code: Select all
engine = On
zend.ze1_compatibility_mode = Off
short_open_tag = On
asp_tags = Off
precision    =  12
y2k_compliance = On
output_buffering = Off
zlib.output_compression = Off
implicit_flush = Off
unserialize_callback_func=
serialize_precision = 100
allow_call_time_pass_reference = On
safe_mode = Off
safe_mode_gid = Off
safe_mode_include_dir =
safe_mode_exec_dir =
safe_mode_allowed_env_vars = PHP_
safe_mode_protected_env_vars = LD_LIBRARY_PATH
disable_functions =
disable_classes =
expose_php = On
max_execution_time = 30
max_input_time = 60
memory_limit = 128M
error_reporting  =  E_ALL & ~E_NOTICE
display_errors = On
display_startup_errors = Off
log_errors = Off
log_errors_max_len = 1024
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
track_errors = Off
variables_order = "EGPCS"
register_globals = Off
register_long_arrays = On
register_argc_argv = On
auto_globals_jit = On
post_max_size = 8M
magic_quotes_gpc = On
magic_quotes_runtime = Off
magic_quotes_sybase = Off
auto_prepend_file =
auto_append_file =
default_mimetype = "text/html"
doc_root =
user_dir =
extension_dir = "./"
enable_dl = On
file_uploads = On
upload_max_filesize = 2M
allow_url_fopen = On
allow_url_include = Off
default_socket_timeout = 60
define_syslog_variables  = Off


und das dazugehörige Script:

Code: Select all
<?php
$filesize = exec('stat -c %s '.escapeshellarg('/opt/apache/htdocs/test.iso'));
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"test.iso\"");
header("Pragma: public");
header("Content-Length:".$filesize);
header("Content-Transfer-Encoding: binary");
header("Cache-Control: maxage=1");
readfile('/opt/apache/htdocs/test.iso');
?>


Die Datei ist 2.1GB groß.

Die max_execution_time sollte auch kein Problem darstellen, da die max_execution_time nicht auf Stream-Operationen oder System-Calls greift.

mfg glitzi
User avatar
glitzi85
 
Posts: 1920
Joined: 05. March 2004 23:26
Location: Dahoim

Postby esfaueen » 14. October 2008 10:28

Hm, oke ..... also du hast garkein XAMPP vorinstalliert?

Kann es sein dass die php Files nicht mehr richtig geparsed werden durch das neuinstallieren von php?! Da ja nurnoch weisse Seiten auftauchen ....
esfaueen
 
Posts: 22
Joined: 08. September 2008 15:22

Postby glitzi85 » 14. October 2008 12:27

Nein, ich hab kein XAMPP installiert. Hab ich auch gar nicht dran gedacht.

Werd ich heut auch mal machen wenn ich dazu komm und schauen ob es da Probleme gibt.

mfg glitzi
User avatar
glitzi85
 
Posts: 1920
Joined: 05. March 2004 23:26
Location: Dahoim

Postby Nobbie » 14. October 2008 13:15

glitzi85 wrote:Werd ich heut auch mal machen wenn ich dazu komm und schauen ob es da Probleme gibt.


Nein, das liegt nicht an Xampp, ich habe auch Xampp 1.6.6 installiert (Ubuntu Linux) und da läuft es lokal auch einwandfrei.

Aber der Download dauert selbst bei localhost(!) ziemlich lange und bei vielen Webhostern (beispielsweise 1&1) bricht ein solches Script einfach ab - ohne Fehlermeldung, ohne die Möglichkeit, die Ursache zu ermitteln. Selbst wenn max_execution_time nicht überschritten wird.

Das Problem tritt bereits bei größeren Exports via phpmyadmin auf, und ein solcher gigantischer Download eines DVD-ISOs geht überhaupt nicht durch. Das hilft auch überhaupt nichts, wenn man es privat auf dem localhost ans Laufen bekommt. Selbst bei manchen vServern klappt es nicht.

Ich kann nur gebetsmühlenhaft wiederholen: diese PHP-Lösung ist ungeeignet. Mit einem einfachen Link wäre es schon unproblematischer, wenn man unbedingt HTTP verwenden will.
Nobbie
 
Posts: 8783
Joined: 09. March 2008 13:04

Postby esfaueen » 14. October 2008 13:37

Ja, ich versteh Dich schon, nur ist dies nicht möglich, da man nicht über einen direkten Link zum Download darf ;) so, dass nicht authorisierte Personen "keine" Chance haben, an die Files zu kommen. Ansonsten hätte ich's schon längst mit Rechtsklick Speichern unter erledigt :)

glitzi85 wrote:Nein, ich hab kein XAMPP installiert. Hab ich auch gar nicht dran gedacht.

Werd ich heut auch mal machen wenn ich dazu komm und schauen ob es da Probleme gibt.

mfg glitzi


oke vielen Dank :)
esfaueen
 
Posts: 22
Joined: 08. September 2008 15:22

Postby Nobbie » 14. October 2008 14:05

esfaueen wrote:Ja, ich versteh Dich schon, nur ist dies nicht möglich, da man nicht über einen direkten Link zum Download darf ;) so, dass nicht authorisierte Personen "keine" Chance haben, an die Files zu kommen. Ansonsten hätte ich's schon längst mit Rechtsklick Speichern unter erledigt :)


Das ist aber eine ganz einfache Geschichte, wo es wirklich viele einfache Lösungsansätze gibt, um das zu realisieren.

Am schlichtesten wäre es, einen temporären Dateinamen zu generieren, den natürlich dann nur der Berechtigte kennt (bzw. im Link mitgeteilt bekommt).

Oder Du stellst die Datei in ein temporäres Verzeichnis, welches nach 24 Stunden o.ä. gelöscht wird, und dieses Verzeichnis ist mit einem Passwortschutz versehen, dieses Passwort wird dem Berechtigten mitgeteilt.

Oder Du stellst es in ein statisches Verzeichnis mit Verzeichnisschutz, der aber temporär angepasst wird. Wiederum bekommt nur der Berechtigte das Passwort mitgeteilt.

Oder Du baust eine eigene kleine Login-Lösung (mit Sessions o.ä.) und nur nach einloggen wird der Download freigegeben.

Oder oder oder - es ist wirklich nichts besonders schwieriges und so machen es eigentlich alle großen Portale mit kostenpflichtigen Inhalten.
Nobbie
 
Posts: 8783
Joined: 09. March 2008 13:04

Postby esfaueen » 15. October 2008 08:28

Der Download soll halt möglichst einfach handzuhaben sein. Sodass der User eigentlich nurnoch einen Link anklickt und der Download beginnt.

Ohne gross noch ein Passwort einzugeben, o.ä.

Naja wenn Du gerade eine konkrete Lösung parat hast, vllt mit einem Beispiel, so kannst Du mir diese aber gerne mitteilen :)

MfG
esfaueen
 
Posts: 22
Joined: 08. September 2008 15:22

Postby Nobbie » 15. October 2008 10:49

esfaueen wrote:Der Download soll halt möglichst einfach handzuhaben sein. Sodass der User eigentlich nurnoch einen Link anklickt und der Download beginnt.


Dann böte sich die erste Lösung an.

esfaueen wrote:Naja wenn Du gerade eine konkrete Lösung parat hast, vllt mit einem Beispiel, so kannst Du mir diese aber gerne mitteilen :)


Klar, ich zitiere es einfach nochmal:

Am schlichtesten wäre es, einen temporären Dateinamen zu generieren, den natürlich dann nur der Berechtigte kennt (bzw. im Link mitgeteilt bekommt).


Der Link sieht also ungefähr so aus:

Code: Select all
<a href="http://www.domainname.de/folder/tmp019abc.iso">Bitte hier rechts klicken und mit "Speichern unter ..." unter dem gewünschten Namen abspeichern</a>


Den Namen "tmp019abc.iso" hast Du vorher "erfunden" (mit tempnam() o.ä.) und die Datei wird dann nach spätestens 24 Stunden beispielsweise wieder gelöscht.

Diesen Link kennt nur der gerade angemeldete Anwender und er hat also einen Tag Zeit, die Datei herunterzuladen.
Nobbie
 
Posts: 8783
Joined: 09. March 2008 13:04

Postby esfaueen » 22. October 2008 11:16

Hm, oke vielen Dank an alle die mir geholfen haben, habs irgendwie trotzdem nicht gebacken gekriegt mit den CFLAGS ....

habs nun anders gelöst .... ich hab ein tmp Verzeichnis erstellt, in welchem temp Ordner erstellt werden (bestehend aus 16 Zahlen). Das gewünschte File wird nun in das generierte Verzeichnis verlinkt und der Download Link ist verfügbar. Ein Cronjob, welcher alle 5 Minuten läuft sorgt nun dafür, dass alle tmp Verzeichnisse, welche älter als 90 Minuten bestehen gelöscht werden. So ist ein Download 90 Minuten aktiv, und es besteht keine Gefahr, dass zuwenig Speicherplatz verfügbar ist, da die Files nur verlinkt werden.

Also Vielen Dank nochmals an glitzi85 und Noobie! Ich weiss das zu schätzen.

MfG
esfaueen
 
Posts: 22
Joined: 08. September 2008 15:22

Previous

Return to XAMPP für Linux

Who is online

Users browsing this forum: No registered users and 3 guests