2011-01-04 13 views
5

Co jest zaletą, a różnica między:Jaka jest korzyść z fragmentów "echo", podczas gdy plik jest urywany?

komunikat 1:

header("Content-type: image/jpeg"); 
header('Expires: ' . date('r',time() + 864000)); 
header("Pragma: public"); 
header("Cache-Control: public"); 
header("Content-Length: " . strlen($contents)); 
$splitString = str_split($contents, 1024); 
foreach($splitString as $chunk) 
echo $chunk; 

komunikat 2:

header("Content-type: image/jpeg"); 
header('Expires: ' . date('r',time() + 864000)); 
header("Pragma: public"); 
header("Cache-Control: public"); 
header("Content-Length: " . strlen($contents)); 
echo $contents; 
+0

Jest to omawiane tutaj również: http://stackoverflow.com/questions/4425227/forced-downloading-large-file-with-php –

Odpowiedz

3

Ze względu na sposób buforowania pakietów TCP/IP używanie numeru echo do wysyłania dużych ciągów do klienta może spowodować poważne pogorszenie wydajności. Czasami może dodać nawet sekundę do czasu przetwarzania skryptu. Dzieje się tak nawet wtedy, gdy używane jest buforowanie wyjściowe.

Jeśli potrzebujesz echo dużego ciągu, podziel najpierw na mniejsze kawałki, a następnie echo każdej porcji. Tak, przy zastosowaniu metody 1, aby podzielić ciąg lub korzystając substr aby je rozdzielić i wysyłanie do klienta wykonuje szybciej duże plików niż metody 2.

+1

całkiem pewne, że PHP/Apache są w stanie obsłużyć to bez pomocy programistów PHP. .. – sbeam

+1

@ Bebeam, osobiście przetestowałem to i znalazłem to lepiej. Może niektóre konfiguracje serwera WWW i PHP mogą robić to automagicznie, ale jeśli nie wiesz, który serwer ma być używany (IIS, Apache, Lighthttpd, itp.), Lepiej zoptymalizować własny skrypt. – shamittomar

+0

wow. każdy serwer WWW jest w stanie obsłużyć konstrukcję pakietów TCP bez twojej pomocy, te rzeczy nie są napisane przez idiotów, którzy nie wiedzą o TCP/IP (nawet IIS). Jakikolwiek benchmark, który zrobiłeś, był jakoś wadliwy. Jest to bezużyteczna mikrooptymalizacja, która nie robi nawet nic oprócz pomieszania kodu. – sbeam

0

komunikat 1 dodaje niepotrzebne obciążenie i zaciemniania.

0

w pierwszej wypowiedzi zawartość dzieli się na 1024 bajty, a jedna porcja ma zawartość 1024 bajtów, aw drugiej instrukcji określa długość całej treści, a następnie echo tego, ale w pierwszym podziale w kawałku, a następnie echo przy pomocy każdego z nich. jeden po drugim.

0

Jeśli $contents jest bardzo duża, można powtórzyć go w kawałkach do powstrzymać całą sprawę od razu.

Powiązane problemy