Ben bir Amazon Web Services kovadan bir anda megabayt yüzlerce dosyaları ile ilgili olabilecek sınıfta basit bir indirme işlevi var. Tüm dosya anda belleğe yüklenen olamaz, bu yüzden bir dosya işaretçisi doğrudan akışa gerekir. Bu ben bu konu ile ele ettik ve ben birlikte gitmek gibi şeyleri topluyorum ilk kez olarak bu benim anlayış olduğunu.
Ben basit bir test iyi bir boyutu olduğunu gösterdi 4 KB dosya tampon dayanarak, bu ile sona erdi ettik:
$fs = fsockopen($host, 80, $errno, $errstr, 30);
if (!$fs) {
$this->writeDebugInfo("FAILED ", $errstr . '(' . $errno . ')');
} else {
$out = "GET $file HTTP/1.1\r\n";
$out .= "Host: $host\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fs, $out);
$fm = fopen ($temp_file_name, "w");
stream_set_timeout($fs, 30);
while(!feof($fs) && ($debug = fgets($fs)) != "\r\n" ); // ignore headers
while(!feof($fs)) {
$contents = fgets($fs, 4096);
fwrite($fm, $contents);
$info = stream_get_meta_data($fs);
if ($info['timed_out']) {
break;
}
}
fclose($fm);
fclose($fs);
if ($info['timed_out']) {
// Delete temp file if fails
unlink($temp_file_name);
$this->writeDebugInfo("FAILED - Connection timed out: ", $temp_file_name);
} else {
// Move temp file if succeeds
$media_file_name = str_replace('temp/', 'media/', $temp_file_name);
rename($temp_file_name, $media_file_name);
$this->writeDebugInfo("SUCCESS: ", $media_file_name);
}
}
Test iyi. Ancak ben fgets() ve feof() birlikte nasıl çalıştığını anlayarak değilim, ve o daha verimli bir yöntem olarak yığın halinde kodlama söz ediyor olduğunu söyleyerek biriyle içine bir konuşma var.
Kod genellikle Tamam mı, yoksa ben burada çok önemli bir şey eksik? Kodlama bana verecek chunked yararı nedir?