Seite 2 von 2

Verfasst: Fr 21.Sep, 2007 13:12
von oxpus
Schau doch mal in die Indianer-Konfig, ob da was "ersichtlich" ist.
Ich weiß, die ist alles andere als einfach zu lesen, aber ich wüsste selber jetzt nicht, an was es liegen könnte.
Meine Tests waren bislang jedenfalls nicht fehlerbehaftet, ich konnte immer Dateien bei mir herunterladen, die auch das PHP-Limit überstiegen...

Verfasst: Di 02.Okt, 2007 19:45
von Dungeonwatcher
Hi großer Meister! 8)

Nimm's mir bitte nicht übel das ich weiter nerve. :roll:

Nachdem ich nun über Tage das große Netz der Netze durchstöbert habe, bin ich mal wieder der Meinung das es definitiv nicht am Apache liegt. Schau dir bitte mal folgende Seite an, auf der mein Problem beschrieben steht:

http://www.tutorials.de/forum/php/28682 ... dfile.html

Wenn ich das dort geschriebene richtig verstehe, dann ist das "Übel" wohl die Funktion "readfile_chunked".

Bye

Verfasst: Mi 03.Okt, 2007 14:01
von oxpus
Und wenn Du nun diese Funktion verwendest?

Code: Alles auswählen

// Fuktion readfile_chunked();
function readfile_chunked($filename) {
  $chunksize = 1*(1024*1024); // how many bytes per chunk
  $buffer = '';
  $handle = fopen($filename, 'rb');
  if ($handle === false) {
    return false;
  }
  while (!feof($handle)) {
    $buffer = fread($handle, $chunksize);
    print $buffer;
    ob_flush();
    flush();
  }
  return fclose($handle);
}
Funktioniert es dann?

Verfasst: Mi 03.Okt, 2007 16:42
von Dungeonwatcher
Hi! 8)

Damit hatte ich schon experimentiert, mit teilweisem Erfolg. Allerdings bin ich auch nicht sicher wie dies dann wirklich auszusehen hat:

Code: Alles auswählen

	function readfile_chunked($filename, $retbytes = true)
	{
		$chunksize = 1048576;
		$buffer = '';
		$cnt =0;
		$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 $status;
	}
Ich habe es aktuell so umgeschrieben:

Code: Alles auswählen

	function readfile_chunked($filename, $retbytes = true)
	{
		$chunksize = 1*(1024*1024);
		$buffer = '';
		$cnt =0;
		$handle = fopen($filename, 'rb');

		if ($handle === false)
		{
			return false;
		}

		while (!feof($handle))
		{
			$buffer = fread($handle, $chunksize);
			print $buffer;
			ob_flush();
			flush();
			if ($retbytes)
			{
				$cnt += strlen($buffer);
			}
		}

		$status = fclose($handle);

		if ($retbytes && $status)
		{
			return $cnt;
		}

		return $status;
	}
Damit wird bei der neuen DL Methode jetzt schon mal die Datei nicht mehr kplt. in den Speicher geladen, sondern direkt von der Platte gestreamt, egal wie groß sie ist. Dateien größer "memory_limit" (aktuell 32M) können problemlos dl werden. Allerdings ist das Ergebnis weiterhin eine defekte Datei. Wenn ich mir die Dateien anschaue, dann ist die originale Datei immer kleiner als die Runtergeladene.

Bei der alten DL Methode wird weiterhin alles in den Speicher geladen.

Verfasst: Mi 03.Okt, 2007 17:08
von oxpus
Dachte ich mir, daß das so nicht geht, da die Ausgabepuffer im Browser als eigene Blöcke angesehen werden und als Ganzes dann defekte Ergebnisse liefern.
Denn: Jeder Block hat einen Header und ggf. auch Footer und das ist gerade bei geteilten grossen Dateien nicht das gelbe vom Ei.
Ich habe daher weiterhin vor, den Zugriff auf die Datei direkt laufen zu lassen, analog externer Downloads.
Wird dann eine weitere Option als DL Methode.

Ich muss dazu nur mal wieder Zeit finden...

Verfasst: Mi 03.Okt, 2007 17:25
von Dungeonwatcher
Sorry, aber ich könnte ko* und das ganze DL Gedöhns in den Orkus kippen. :cry:

Was ist an meinem System so anders, das hier weder die alte noch die neue DL Methode sauber funktioniert? Warum wird selbst bei der alten Methode die ganze Datei in den Speicher geladen bis er platzt? :cry:

Du schreibst immer "den Zugriff auf die Datei direkt laufen zu lassen". Darunter verstehe ich (sicher wieder falsch) was anderes, nämlich einen direkten Link. Den sehe ich aber nirgends. :roll:

Verfasst: Mi 03.Okt, 2007 19:11
von oxpus
Man, ich muss das doch erst noch programmieren 8)

Verfasst: Mi 03.Okt, 2007 20:07
von Dungeonwatcher
:) schon klar. Trotzdem muss es doch an irgendetwas in meinem System liegen, denn scheinbar bin ich ja der Einzige mit diesem Problem. Ich habe mittlerweile in diversen Foren und nun auch in einer NG (de.comm.software.webserver) nachgefragt. Als Antwort gab es entweder einen Hinweis auf "PHP Fehler" in der DL Funktion oder Schweigen. Doch es hat doch vor der Umstellung auf den Apache auch bestens funktioniert. :cry:

Verfasst: Mi 03.Okt, 2007 20:10
von oxpus
Sagen wir mal so:
Ich kenne keinen, der solch riesige Downloads mit PHP verwaltet.
Von daher scheinst Du der einzigste mit diesem Problem zu sein.
Aber dennoch will ich den MOD ja erweitern, damit auch dieses wieder funktioniert.

Verfasst: Mi 03.Okt, 2007 20:25
von Dungeonwatcher
oxpus hat geschrieben:...solch riesige Downloads...
Naja, ein DL von Dateien mit 1GB und mehr ist doch mittlerweile "Erdnuss"... :roll:
Die Zeiten von Diskette, CD oder DVD als Mittler von Dateien ist halt ziemlich vorbei. :wink:

Verfasst: Mi 03.Okt, 2007 20:36
von oxpus
Möööööhp.
Klar sind die Datenträger heutzutage um einiges grösser, als sie noch vor 5-10 Jahren waren, aber dennoch sind Dateigrössen von 1GB und mehr immer noch extrem groß!

Verfasst: Fr 05.Okt, 2007 21:17
von oxpus
Gute Nachrichten:
Auf OXPUS.de läuft der MOD nun schon mit der neuen DL Methode.
D. h. neu ist sie nicht, es wurde jediglich die Möglichkeit geschaffen, den Direktlink zum Download zu aktivieren, wenn die Datei grösser ist, als das Memory-Limit von PHP.
Damit wird zwar jede Statistik mitgeführt, der Download läuft dann aber per HTTP-Protokoll und nicht mehr über PHP und somit fehlerhaft.

Da ich jetzt noch das Berechtigungssystem etwas erweitern will, was ich hoffentlich morgen schaffe, werde ich den MOD dann veröffentlichen und Du solltest endlich wieder Deine "Monsterdownloads" fehlerfrei herunterladen können.

Ich werde Dir dazu den MOD dann zum Testen geben und wenn alles glatt läuft, also Du dann keine Fehler hast, den MOD der Öffentlichkeit freigeben.
Sofern das okay ist...

Verfasst: Sa 06.Okt, 2007 10:54
von oxpus
So, das Paket ist zu Dir raus.
Sofern Du Zeit hast, teste es aus und poste das Ergebnis hier.
Ich bin gespannt, ob nun wirklich alles läuft.
Bei meinen Tests war dem so...

Verfasst: Sa 06.Okt, 2007 16:35
von Dungeonwatcher
oxpus hat geschrieben:So, das Paket ist zu Dir raus.
Cooooool, es kam gerade an. <riesig freu> :)
Sofern Du Zeit hast, teste es aus und poste das Ergebnis hier.
Sowie die neue Schrankwand steht (spätestens morgen vormittag geht es los. )
Ich bin gespannt, ob nun wirklich alles läuft.
Und ich erst.
Bei meinen Tests war dem so...
Das hat nichts zu sagen. In meiner 4ma bzw. Behörde "zerlege" ich auchandauern deren eingesetzte Programme, nur weil ich sie ausreize... Was bei den Koll. funktioniert tut es bei mir oft nicht mehr. :wink:

Verfasst: So 07.Okt, 2007 13:08
von Dungeonwatcher
Hi! 8)
oxpus hat geschrieben:Sofern Du Zeit hast, teste es aus und poste das Ergebnis hier.
Das updaten war wie gewohnt einfach. :)

Es gibt hier keinen Unterschied zu vorher. Egal ob ich "Direkt" dazu schalte oder nicht. :?

Verfasst: So 07.Okt, 2007 14:42
von oxpus
Dann MUSS es ein Problem mit dem Apache geben.
Es wird mit der neuen "direkt"-Methode ein Link direkt auf die Datei erzeugt, ohne, daß PHP dann noch etwas damit zu tun hat...

Und ab genau hier bin ich nun ideenlos!

Verfasst: So 07.Okt, 2007 17:45
von Dungeonwatcher
Hi! 8)
oxpus hat geschrieben:Dann MUSS es ein Problem mit dem Apache geben.
Genau das befürchtete ich die ganze Zeit. :?

Ich hoffe die nächsten Tage gibt es das Update auf XAMPP 1.6.4 mit dem aktuellen Apache...

Verfasst: So 07.Okt, 2007 19:01
von oxpus
Dann werden wir weiter sehen.
Ich werden die neue Version jetzt jedenfalls veröffentlichen, damit jeder was davon hat.
Auch gerade wegen der neu hinzugekommenen Rechteverwaltung.