Докачка и производительность

hohoho

Новичок
Докачка и производительность

Здравствуйте, существует вот такой вот код:
PHP:
function Download($file,$name)
{
        if (!file_exists($file))
        {

                header ("HTTP/1.0 404 Not Found");
                exit;
        }

        $fsize = filesize($file);
        $ftime = date("D, d M Y H:i:s T", filemtime($file));
        $fd = @fopen($file, "rb");

        if (!$fd)
        {
                header ("HTTP/1.0 403 Forbidden");
                exit;
        }

        if ($HTTP_SERVER_VARS["HTTP_RANGE"])
        {
                $range = $HTTP_SERVER_VARS["HTTP_RANGE"];
                $range = str_replace("bytes=", "", $range);
                $range = str_replace("-", "", $range);
                if ($range) {fseek($fd, $range);}
        }

         if ($range)
        {
                header("HTTP/1.1 206 Partial Content");
        }
        else
        {
                header("HTTP/1.1 200 OK");
        }
        header("Content-Disposition: attachment; filename=".$name);
        header("Last-Modified: $ftime");
        header("Accept-Ranges: bytes");
        header("Content-Length: ".($fsize-$range));
        if ($range)
        {
                header("Content-Range: bytes $range-".($fsize -1)."/".$fsize);
        }
        header("Content-Type: application/downloads");

         while(!feof($fd))
        {
                $content = fread($fd, 4096);
                print($content);
        }
};
download('null', 'Slipknot - Vermilion.mpeg');
Вот, но дело в том, что если через него качать объёмный какой-либо фаил, то при наличии нескольких подключений, апач у меня лично вырубается от нехватки памяти. Да и вообще по производительности это очень накладно, но очень нужно.
Что посоветуете что бы оптимизировать код?
Да, ещё по каким-то причинам со скрипта ни чего не принимает эксплорер, регет всё без проблем сохраняет!
 

Nimous

Guest
по каким-то причинам со скрипта ни чего не принимает эксплорер
Скорее всего проблема с заголовками.

А ты не хочешь отдавать файл напрямую?
 

hohoho

Новичок
Да раньше так и делал, но сейчас поставили задание что бы прям ну полностью исключить прямой доступ... причём размер варьируется от 0.3 до 120 mb
 

SiMM

Новичок
Вообще-то код неправильный.
[m]language.variables.predefined#language.variables.superglobals[/m]
[m]language.variables.scope[/m]
 

hohoho

Новичок
Ну блин, и чё в нём неправильного? ну уж как умеем так и пишем.

Вот собственно скажи, к чему эти линки????????????
 

si

Administrator
Да раньше так и делал, но сейчас поставили задание что бы прям ну полностью исключить прямой доступ... причём размер варьируется от 0.3 до 120 mb
с какой целью ?
 

SiMM

Новичок
> ну уж как умеем так и пишем.
Как умеем - так и слизываем. Голову вообще не применяем.

> Вот собственно скажи, к чему эти линки????????????
К тому что RANGE у тебя вообще никогда не будет работать. Кроме того, нет смысла выдавать контент до конца, если клиент запросил диапазон от и до.
+ для уменьшения потребления памяти можно попробовать снизить скорость отдачи контента ([m]sleep[/m]/[m]usleep[/m]), и/или попробовать следить за [m]memory_get_usage[/m]

> регет всё без проблем сохраняет!
И делает это в один поток, верно? Собственно в нём же можно посмотреть все входящие заголовки.
 

Steamroller

Новичок
Вот, но дело в том, что если через него качать объёмный какой-либо фаил, то при наличии нескольких подключений, апач у меня лично вырубается от нехватки памяти. Да и вообще по производительности это очень накладно, но очень нужно.
Что посоветуете что бы оптимизировать код?
А код ни при чем - у тебя на каждое подключение выходит что жирный процесс Апача висит и ничего полезного кроме отдачи статики не делает.
Тут надо ставить nginx перед Апачем, а в скрипте выдавать ему заголовок X-Accel-Redirect, чтобы память не расходовалась. Ranges он умеет.
 

leonid_p

Новичок
Автор оригинала: hohoho
Да раньше так и делал, но сейчас поставили задание что бы прям ну полностью исключить прямой доступ... причём размер варьируется от 0.3 до 120 mb
Это можно сделать и отдавая файлы апачем.. mod_rewrite рулит! ;)
 

hohoho

Новичок
>И делает это в один поток, верно? Собственно в нём же можно посмотреть все входящие заголовки.
Нет, он кочает и в пять и в 10, я специально смотрел, и заголовки я через него тоже смотрел.
Через тот же самый регет я пробовал и понизить скорость - всё равно то же самое.
 

SiMM

Новичок
> Нет, он кочает и в пять и в 10
Не верю.
PHP:
error_reporting(E_ALL);
ini_set('display_errors','On');
function foo(){
  var_dump($HTTP_SERVER_VARS);
}
foo();
> Через тот же самый регет я пробовал и понизить скорость - всё равно то же самое.
Менять надо не скорость скачки, а скорость отдачи.
 

hohoho

Новичок
Тут надо ставить nginx перед Апачем, а в скрипте выдавать ему заголовок X-Accel-Redirect, чтобы память не расходовалась. Ranges он умеет.
======================
Если не сложно то хоть немного по подробнее или линками поделись, а то я чёт даже не знаю что такое ngix

>> Нет, он кочает и в пять и в 10
>Не верю.
Регет запрашивает не определённый фрагмент, а фаил до конца всегда не зависимо от того сколько частей он качает

==================
mod_rewrite рулит
а где искать про него инфу-то?
 

leonid_p

Новичок
Автор оригинала: Andreika
leonid_p
реализацию сабжа с mod_rewrite в студию, плиз
Реализацию делайте сами :) Идею опишу..

Когда юзер запрашивает файл (через пхп скрипт) - пхп скрипт ставит юзеру куку + создаёт файлик с именем этой куки в какой-нибудь директории доступной апачу.
все файлы кладутся в директорию доступную из веба, в ту же директорию кидается .htaccess который проверяет есть ли файлик (имя файла берётся из кук но наверное и переменную окружения установить можно) и если файлик есть то апач отдаёт файл, если нет.. то отправляет нафиг :)
Вся проверка идёт через mod_rewrite естественно (копать в сторону RewriteCond и ключика -f)

по такому принципу sendmefile.com сделано, вроде пока не поломали :)
 

Nimous

Guest
.htaccess который проверяет есть ли файлик (имя файла берётся из кук но наверное и переменную окружения установить можно)
Не вполне понятно, .htaccess научился куки читать?
 

leonid_p

Новичок
Автор оригинала: Nimous
Не вполне понятно, .htaccess научился куки читать?
Написал же
===
Вся проверка идёт через mod_rewrite естественно (копать в сторону RewriteCond и ключика -f)
===
Да, через mod_rewrite можно получить куку.
 

Nimous

Guest
Да, через mod_rewrite можно получить куку.
Кто получает куку? Мод реврайт? И он понимает, что в ней написано?
Никогда про такое не слышал...
Может я чего-то не знаю?
 

leonid_p

Новичок
Автор оригинала: Nimous
Кто получает куку? Мод реврайт? И он понимает, что в ней написано?
Никогда про такое не слышал...
Может я чего-то не знаю?
Ну понимать он не понимает, зато записывает значение куки в переменную которую можно потом использовать в другом месте.
Чтобы не быть голословным.. Получение куки __auth через mod_rewrite:
RewriteCond %{HTTP_COOKIE} __auth=([a-zA-Z0-9]+)
Дальше переменная %1 будет содержать значение этой куки.
Всё, дальше сами ;)
 

Nimous

Guest
leonid_p
Не знал.
Спасибо за инормацию.

Тогда метод интересен.
 

hohoho

Новичок
Ну кто-нибудь дайте ссылку на инфу о mod_rewrite? в поиске вроде нет =(
 
Сверху