readfile i ograniczenie przestrzeni

0

Witam, chciałem napisać taki niewielki skrypt, który w contencie będzie wyrzucał jakiś plik z katalogu tak, aby można go było pobrać przez przeglądarkę, krótko mowiąc takie coś:

$ran=rand_string(5);
$Fw=Files('./streamy');
$OpenFile=$Fw[rand( 0, count($Fw) - 1 )];
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.$ran.' ');
readfile('./streamy/'.$OpenFile);

z mniejszymi plikami wszystko działa ok., ale przy większych (150MB+) wywala błąd:

Fatal error</b>:  Allowed memory size of 134217728 bytes exhausted

czy da się jakoś cały plik rozłożyć na części, aby go dobrze przesłać? tak żeby części nie przekraczały dostępnej pamięci? albo jak po prostu zrobić przekierowanie na ten plik, bez konieczności "wypisywania" go przez skrypt php?
dziękuje za pomoc.

dodanie znacznika <code class="none"> - @furious programming

0

Czym jest to Files, co to za funkcja?

Ogólnie wrzuć większy kawałek kodu (i wiekszy kawałek kodu błędu, z numerem linii i wskazaniem która to), z readfile nie powinno być problemu.

0
<?php
function rand_string( $length ) {
	$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";	
	$str="";
	$size = strlen( $chars );
	for( $i = 0; $i < $length; $i++ ) {
		$str .= $chars[ rand( 0, $size - 1 ) ];
	}

	return $str;
}

function IsFile( $str ) {
if (strlen($str)<=2){return 0;}
$dot=false;
$aufdot=false;
for($i=0;$i<strlen($str);$i++)
{
if($dot==true){$aufdot=true;return true;}
$char = $str{$i};
if($char=='.'){$dot=true;}
}
return $aufdot;
}

function Files($d)
{
$dir=$d;
$files1 = scandir($dir);
$array=array();
foreach ($files1 as &$value) {
if (IsFile($value)==true){
array_push($array,$value);
}}
return $array;
}

function Stream($f,$rh,$Hunks,$st)
{
while (ob_get_level()) {ob_end_clean();}
if (file_exists($f)) {
$size=filesize($f);
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.$rh.' ');
header('Content-Length: '.$size);
for($i=0;$i<$size;$i++)
{
if ($st>0){usleep($st);}
$Cur=$i*$Hunks;
$hunk=$Hunks;
if (($Cur+$hunk)>$size){$hunk=$size-$Cur;}
$section = file_get_contents($f, NULL, NULL, $Cur, $hunk);
echo $section;
}
}
return true;
}

$ran=rand_string(5);
$Fw=Files('./streamy');
if (count($Fw)<=0){exit(1);}
$OpenFile=$Fw[rand( 0, count($Fw) - 1 )];
$TrueFile='./streamy/'.$OpenFile;
Stream($TrueFile,$ran,4096,100);


//echo './streamy/'.$OpenFile;
?>  

cały ogólnie poprawiony skrypt, zamieniłem readline na file get_contents i dawkowanie powolne, ale kolejny problem to taki, że po pobraniu 50-100MB pobieranie zostaje przerwane, jakieś pomysły jak temu zaradzić?
A Files to po prostu funkcja zwracająca w tablicy nazwy wszystkich plików w katalogu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1