Intereting Posts
Загрузка изображения на сервер с несколькими параметрами Как добавить 1 месяц на дату без пропусков, т.е. февраль Как защитить паролем zip в php? Не удалось установить сеанс в php Заставить php передавать SID в URL-адресе – даже если файлы cookie принимаются в браузере jquery post данные в php-скрипт и немедленно отображать его в том же файле сценария php Кросс-платформенный Google OAuth Signin: несоответствие redirect_uri Я хочу, чтобы загрузчик файлов AJAX, например, загружал файл Gmail с индикатором выполнения в PHP Stripe – получить идентификатор клиента по электронной почте из формы Зачем вызывать mb_convert_encoding для дезинфекции текста? Получить список локализованных месяцев Создайте новый массив, используя значения из значений многомерного массива Хранимая процедура MySQL вызвала «команды не синхронизированы» Отправить JSON из Flash в PHP как иметь 64-битное целое число на PHP?

Скрипт для работы с файлами PHP: ненадежные загрузки?

Это сообщение началось как вопрос на ServerFault ( https://serverfault.com/questions/131156/user-receiving-partial-downloads ), но я решил, что наш скрипт php был виновником. Поэтому я выпускаю обновленный вопрос о том, что я считаю фактической проблемой.

Я использую php-скрипт для проверки разрешений, а затем служит для загрузки файла для загрузки моего веб-сайта. В большинстве случаев это работает, но в последнее время у одного пользователя возникают проблемы с большими загрузками. Он получает ~ 80% загрузок для файлов размером> 100 МБ. Кроме того, все загрузки с этого скрипта не сообщают о размере файла. Кроме того, тесты показали, что один и тот же пользователь МОЖЕТ надежно загрузить каждый из файлов с отказами, если ему задана прямая ссылка (в этот момент сообщается о размере файла).

Вот соответствующий фрагмент кода, который мы используем для обслуживания файла:

header("Content-type:$contenttype"); $len = filesize($filename); header("Content-Length: $len"); header("Content-Disposition: attachment; filename=".$title.".".$ext); readfile($filename); 

Обратите внимание, что $ contenttype, $ filename, $ title и $ ext настроены правильно, прежде чем мы перейдем сюда. Они были трижды проверены. Ни одна из них не является проблемой. Кроме того, $ len предоставляет правильный размер файла.

Изучая эту проблему, я столкнулся с этим сообщением: заголовок Content-Length всегда равен нулю

Кажется, что я сталкиваюсь с той же проблемой. Когда я использую скрипт, я получаю закодированную кодировку в файле, а размер контента не задан. Я предполагаю, что что-то не так с большими загрузками, что привело его к тому, чтобы получить фрагмент нулевой длины до конца файла.

Вот как выглядят заголовки для прямого запроса:

 http://www.grinderschool.com/videos/zfff5061b65ae00e8b21/KillsAids021.wmv GET /videos/zfff5061b65ae00e8b21/KillsAids021.wmv HTTP/1.1 Host: www.grinderschool.com User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.NET CLR 3.5.30729) Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 115 Connection: keep-alive Referer: http://www.grinderschool.com/phpBB3/viewtopic.php?f=14&p=29468 Cookie: style_cookie=printonly; phpbb3_7c544_u=2; phpbb3_7c544_k=44b832912e5f887d; phpbb3_7c544_sid=e8852df42e08cc1b2250300c2897f78f; __utma=174624884.2719561324781918700.1251850714.1270986325.1270989003.575; __utmz=174624884.1264524375.411.12.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=low%20stakes%20poker%20videos; phpbb3_cmviy_k=; phpbb3_cmviy_u=2; phpbb3_cmviy_sid=d8df5c0943863004ca40ef9c392d371d; __utmb=174624884.4.10.1270989003; __utmc=174624884 Pragma: no-cache Cache-Control: no-cache HTTP/1.1 200 OK Date: Sun, 11 Apr 2010 12:57:41 GMT Server: Apache/2.2.14 (Unix) mod_ssl/2.2.14 OpenSSL/0.9.8l DAV/2 mod_auth_passthrough/2.1 FrontPage/5.0.2.2635 Last-Modified: Sun, 04 Apr 2010 12:51:06 GMT Etag: "eb42d6-7d9b843-48368aa6dc280" Accept-Ranges: bytes Content-Length: 131708995 Keep-Alive: timeout=10, max=30 Connection: Keep-Alive Content-Type: video/x-ms-wmv 

И вот как они выглядят для запроса, на который ответил мой сценарий:

 http://www.grinderschool.com/download_video_test.php?t=KillsAids021&format=wmv GET /download_video_test.php?t=KillsAids021&format=wmv HTTP/1.1 Host: www.grinderschool.com User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.NET CLR 3.5.30729) Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 115 Connection: keep-alive Cookie: style_cookie=printonly; phpbb3_7c544_u=2; phpbb3_7c544_k=44b832912e5f887d; phpbb3_7c544_sid=e8852df42e08cc1b2250300c2897f78f; __utma=174624884.2719561324781918700.1251850714.1270986325.1270989003.575; __utmz=174624884.1264524375.411.12.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=low%20stakes%20poker%20videos; phpbb3_cmviy_k=; phpbb3_cmviy_u=2; phpbb3_cmviy_sid=d8df5c0943863004ca40ef9c392d371d; __utmb=174624884.4.10.1270989003; __utmc=174624884 HTTP/1.1 200 OK Date: Sun, 11 Apr 2010 12:58:02 GMT Server: Apache/2.2.14 (Unix) mod_ssl/2.2.14 OpenSSL/0.9.8l DAV/2 mod_auth_passthrough/2.1 FrontPage/5.0.2.2635 X-Powered-By: PHP/5.2.11 Content-Disposition: attachment; filename=KillsAids021.wmv Vary: Accept-Encoding Content-Encoding: gzip Keep-Alive: timeout=10, max=30 Connection: Keep-Alive Transfer-Encoding: chunked Content-Type: video/x-ms-wmv 

Итак, вопрос в том, что … что я могу сделать для правильной загрузки загрузок из скрипта? Опять же, для 99% пользователей он работает так же, как есть (хотя мне сейчас досадно, что не сообщается о размерах файлов и, следовательно, не может быть рассчитана никакая временная оценка о загрузке).

Solutions Collecting From Web of "Скрипт для работы с файлами PHP: ненадежные загрузки?"

Это ваше сжатие GZIP. Когда вы указываете длину содержимого, но включаете компрессию, все это всхлипывает. Это случилось со мной несколько раз: попробуйте отключить его в своем скрипте.

Как правило, вы включаете его:

 ob_start("ob_gzhandler"); 

… так просто прокомментируйте эту строку. Если это не в вашем коде, есть вероятность, что в вашем файле php.ini есть какой-либо параметр или ваш apache.conf / conf.d.

Надеюсь это поможет!

 Content-Encoding: gzip 

Хм. Предположительно, это делает zlib.output_compression PHP. (Не похож на mod_deflate от Apache.)

Попробуйте отключить его и посмотреть, не заставляет ли он кодировать кодировку. Вы не хотите сжимать загрузку файла типа WMV, который уже сильно сжат.

Однако закодированное кодирование объясняет только отсутствие отчета о размере. Загрузка должна по-прежнему работать. Возможно ли, что вас атакует таймаут (например, set_time_limit PHP или Time Time )?

Если это сценарий, попробуйте ли вы использовать заменяющую функцию для функции readfile (), которая читает и выводит бит за раз? Причиной этого может быть то, что предел памяти достигнут где-то, и он терпит неудачу.

С http://php.net/manual/en/function.readfile.php :

 function readfile_chunked ($filename) { $chunksize = 1*(1024*1024); // how many bytes per chunk $buffer = ''; $handle = fopen($filename, 'rb'); if ($handle === false) { return false; } while (!feof($handle)) { $buffer = fread($handle, $chunksize); print $buffer; } return fclose($handle); } 

Кроме того, попробуйте очистить выход так часто, как вы можете.