LINUX.ORG.RU
решено ФорумAdmin

обрывается скачивание файла с моего сервера

 , ,


0

1

есть сервер FreeBSD domain 8.4-STABLE FreeBSD 8.4-STABLE #0 r149M: Mon Jun 10 08:43:20 UTC 2013 root@freebsd8-amd64-build.ispsystem.net:/root/src/sys/amd64/compile/DEBUG amd64

на нем апач

Server version: Apache/2.2.27 (FreeBSD)
Server built: Apr 24 2014 11:05:48
Server's Module Magic Number: 20051115:33
Server loaded: APR 1.4.8, APR-Util 1.5.2
Compiled using: APR 1.4.8, APR-Util 1.5.2
Architecture: 64-bit
Server MPM: Prefork
threaded: no
forked: yes (variable process count)


и пхп

PHP 5.5.11 (cgi-fcgi) (built: Apr 24 2014 14:25:30)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2014, by Zend Technologies


Есть zip-архив 80 мб и простой пхп-файл, который выдает этот архив на скачивание, посредством чтения readfile($file)


После начала скачивания любым браузером, закачка обрывается на середине.
Если скорость небольшая (например через прокси), то скачивает 700-900 кб
Если хорошая - успевает вытянуть до 15 мб

Все опыты на виртуалке, но проверял и вне неё. Там, внезапно, один раз файл скачался полностью, но при повторе снова оборвался на 15 мб

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

Из чего делаю вывод что проблема в апаче/пхп.

В error_log апача ничего нет.
nginx на сервере нет.
Модули апача - http://pastebin.com/xLsLWGRY
пробовал отключать только дефлейт

Пробовал менять множество директив, как апача, так и пхп.
В чем ещё может быть дело?
Как отследить на сервере, что происходит с пхп и апачем?

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

простой пхп-файл, который выдает этот архив на скачивание, посредством чтения readfile($file)

А что, нельзя его статикой отдавать?

Вангую, что истекает допустимое соединения.

no-such-file ★★★★★ ()
Последнее исправление: no-such-file (всего исправлений: 1)

Может не успевает выполниться за определенное время? http://php.net/manual/en/info.configuration.php#ini.max-execution-time

А вообще отдавать файлы при помощи PHP это плохо, посмотри может можно использовать XSendfile http://wiki.nginx.org/XSendfile http://habrahabr.ru/post/151795/

Black_Roland ★★★★ ()
Последнее исправление: Black_Roland (всего исправлений: 1)
Ответ на: комментарий от Frost

поставил в начале скрипта

error_reporting(7);
ini_set('post_max_size', 1024);
ini_set('upload_max_filesize', 1024);
ini_set('memory_limit', '1024M');
ini_set('max_execution_time', 1024);

не помогает
в логах апача и пхп - ничего

sergey-novikov ★★★ ()
Ответ на: комментарий от Frost

Решено

Большое спасибо за это «попробуй поставь по 80M то есть свыше 60»
Но почему больше именно 60?

Поставил везде 80, получил ошибку:

<b>Fatal error</b>: Allowed memory size of 83886080 bytes exhausted (tried to allocate 88199168 bytes) in <b>/home/data/www/download/test.php</b> on line <b>13</b><br />

По ней нагуглил: https://bugs.php.net/bug.php?id=61636

И там функция:

function readlargefile($fullfile) {
	$fp = fopen($fullfile, 'rb');
	
	if ($fp) {
		while (!feof($fp)) {
			print(fread($fp, 2097152));
		}
	
		fclose($fp);
	}
}

Вставил её в скрипт и он стал работать нормально. Ох уж этот пхп..

sergey-novikov ★★★ ()
Последнее исправление: sergey-novikov (всего исправлений: 1)
Ответ на: комментарий от sergey-novikov

Так ты мог в настройках сервера это менять, точнее в самом php.ini, зачем ты в скрипт то полез это вставлять. Кто знает какой скрипт тебе ещё голову будет морочить?

Frost ★★★ ()
Последнее исправление: Frost (всего исправлений: 1)
Ответ на: комментарий от sergey-novikov

вместо этого 2097152 впендюрь туда filesize($fullfile) и он автоматом будет считать буфер. И пхп тут не при чём, откуда это число там взялось?

Frost ★★★ ()
Последнее исправление: Frost (всего исправлений: 1)

Да, дело в пхп. Либо у него истекает таймаут на выполнение (в случае fastcgi их даже несколько - в апаче и в php.ini), либо скрипту не хватает памяти чтобы считать весь файл.

Komintern ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.