PHP предложил загрузку прервана после X числа КБ каждый раз - PullRequest
2 голосов
/ 26 июня 2011

Я написал код, который предлагает посетителям скачать CSV-файл размером 1,1M. Если кто-то посещает этот скрипт, загрузка прерывается на 30-40 КБ (как показано ниже в выводе wget), в то время как если он загружает его по прямой ссылке, такой как http://domain.com/events.csv, он работает просто отлично. Я считаю, что это как-то связано со значениями конфигурации php на сервере, но я играл почти со всеми значениями [релевантными и не релевантными], такими как

  • post_max_size [до 90M]
  • max_file_upload [до 90M]
  • max_execution_time [0 и до 600]
  • max_input_time [0 и до 600]
  • memory_limit [до 1024M]

Ниже содержится мой код:

 <?php

$realpath="/home/user/public_html/events.csv";
$size = intval(sprintf("%u", filesize($realpath)));

@ini_set('zlib.output_compression', 0);
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");;
header("Content-Disposition: attachment;filename=events.xls"); 
header("Content-Transfer-Encoding: binary ");
header("Pragma: public");
header('Cache-Control: no-store, no-cache, must-revalidate'); 
header('Cache-Control: pre-check=0, post-check=0, max-age=0');
header ("Pragma: no-cache");
header("Expires: 0");
header("Content-Description: File Transfer");
header("Content-Type: text/csv");
header("Content-Length: ". $size);

// also tried with having a flush(); here
// also tried with file_get_contents();
//also tried with wrapping the file_get_contents() or readfile() call inside ob_start() and ob_flush()+ob_clean()
readfile($realpath);
exit;

?>

Вот вывод wget

wget "http://domain.com/test.php"
--2011-06-26 19:47:55--  http://domain.com/test.php
Resolving domain.com... 69.117.110.115
Connecting to domain.com|69.117.110.115|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1139844 (1.1M) [text/csv]
Saving to: `test.php'

 3% [===>                                                                                                                            ] 36,373      --.-K/s   in 11s     

2011-06-26 19:48:11 (3.29 KB/s) - Connection closed at byte 36373. Retrying.

--2011-06-26 19:48:12--  (try: 2)  http://domain.com/test.php
Connecting to domain.com|69.117.110.115|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1139844 (1.1M) [text/csv]
Saving to: `test.php'

 3% [===>                                                                                                                            ] 40,469      --.-K/s   in 11s     

2011-06-26 19:48:24 (3.66 KB/s) - Connection closed at byte 40469. Retrying.

Если я удаляю header (), необходимый для загрузки, и просто отображаю содержимое, то Chrome показывает, что test.php был около 1,09M плюс еще несколько запросов, добавляет до 1,1M [даже в этом случае wget of test .php показывает то же поведение, что и выше], в то время как Firefox Firebug показывает, что запрос был между 140K-300K [все еще не отображает все содержимое.

1 Ответ

0 голосов
/ 26 июня 2011

Проверьте http://www.php.net/manual/en/function.readfile.php и найдите: большой. Скопируйте и вставьте код:)

...