Şu anda ikili dosyaları yığın halinde downloads / yüklenenler (daha büyük dosyalar izin vermelisiniz) izin dış SOAP web hizmetlerini kullanıyorum. Ben bir son kullanıcı bir benim PHP uygulaması ile tarayıcı üzerinden dosya indirmek için izin vermeniz gerekir. Küçük dosyaları hizmet iyi çalışıyor, ama 25MB + dosyaları web sunucusu bellek çalışmasına neden.
Ben doğal PHP Soap Client (yok MTOM desteği) kullanarak, ve bir form göndererek indir talep ediyorum. Web sunucusu tarayıcınıza şey çıktılamak önce tüm dosyayı indirmeye çalışıyor gibi şu anda görünüyor (örneğin "Download" istemi tüm dosya PHP ile süreç olmuştur sonrasına kadar görünmüyor).
Benim yöntem böyle bir şey (bu dağınık ise üzgünüm, ben bir süre için bu sorunun uzakta hack oldum) görünüyor.
public function download()
{
$file_info_from_ws ... //Assume setup from $_REQUEST params
//Don't know if these are needed
gc_enable();
set_time_limit(0);
@apache_setenv('no-gzip', 1);
@ini_set('zlib.output_compression', 0);
//File Info
$filesize = $file_info_from_ws->get_filesize();
$fileid = $file_info_from_ws->get_id();
$filename = $file_info_from_ws->get_name();
$offset = 0;
$chunksize = (1024 * 1024);
//Clear any previous data
ob_clean();
ob_start();
//Output headers
header('Content-Type: application/octet-stream');
header('Content-Length: ' . $filesize);
header('Content-Transfer-Encoding: binary');
header('Content-Disposition: attachment; filename="' . $filename . '"');
header('Accept-Ranges: bytes');
while($offset < $filesize)
{
$chunk = $this->dl_service()->download_chunked_file($fileid, $offset, $chunksize);
if($chunk)
{
//Immediately echo out the stream
$chunk->render();
$offset += $chunksize;
unset($chunk); //Shouldn't this trigger GC?
ob_flush();
}
}
ob_end_flush();
}
So my main question is: What is the best way to output large binary chunks from external resources (Webservices, DB, etc.) through PHP to the end user? Preferably without killing memory/CPU too much.
Also I'm curious about the following:
Why wouldn't the Download prompt pop-up after the first output?
Why is memory not freed after each loop in the about method?