Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: Отдавать файлы PHP скриптом
цитата
19/03/08 в 04:52
 dlk44
Подскажите - как на виртуале настроить чтобы отдавать файлы пользователям PHP скриптом? На html странице прямые ссылки на avi/wmv/mpeg файлы - пользователь кликает, а файл ему отдает на Апач а PHP скрипт. Файлы нужно отдавать в ОДИН поток, желательно с докачкой, скорость регулировать НЕ нужно.

Аутентификация используется стандартная через .htaccess Доступа к httpd и прочим конфугурационным файлам Апача нет.

Последний раз редактировалось: dlk44 (20/03/08 в 01:15), всего редактировалось 1 раз
цитата
19/03/08 в 07:24
 Corex
Самый простой вариант (без ограничения скорости):
Код:
header("Content-type: video/mpeg");
header("Cache-control: public");
readfile("movie1.mpg");


readfile тут хорош тем, что сразу выводит файл в браузер и не забивает память.

Ограничивать по скорости можно например так:
Код:
$handle = fopen("movie1.mpg",'r')
while(!feof($handle))
{
   echo fgets($handle, 4096);
   sleep(1);
}
fclose($handle);

это может быть более ресурсоёмко и нужно увеличить или снять вовсе set_time_limit(). Кол-во потоков можно ограничивать, например, через flock().

А зачем нужно отдавать именно через пыху, антилич?
цитата
19/03/08 в 12:32
 Heavy
скорость в пыхе можно регулировать задержками между отсылаемыми блоками.
количество потоков если с ип, то через вызов консоли, если пофайлово, то через свои счетчики.

Цитата:
Самый простой вариант (без ограничения скорости)

а так же без поддержки докачки и автоматического mime-типа icon_smile.gif


Цитата:
readfile тут хорош тем, что сразу выводит файл в браузер и не забивает память.

тогда уж лучше юзать passthru - и не грузить пых вообще icon_smile.gif

вообще не лучшая задача для виртула, много могут не разрешить (если виртуал херовенький)[/list]
цитата
20/03/08 в 00:54
 dlk44
Heavy писал:

тогда уж лучше юзать passthru - и не грузить пых вообще icon_smile.gif

вообще не лучшая задача для виртула, много могут не разрешить (если виртуал херовенький)[/list]


Вобщем скорость регулировать НЕ нужно.

Но хотелось бы отдавать файлы только в один поток. Зачем? Статистика на хосте направильно считает траф при скачивании многопотоковыми качалками. Поэтому для скачивания больших файлов пришлось перейти на FTP что для юзеров сложно.

По поводу passthru можно немного подробнее или дай URL где почитать.
цитата
20/03/08 в 01:01
 dlk44
ADSenex писал:

А зачем нужно отдавать именно через пыху, антилич?


Есть 2 причины:

1. Основная - неправильный учет трафа при использовании многопотоковых качалок. Поэтому хочется отдавать через PHP в один поток. Скорость ограничивать НЕ нужно.

2. похоже хостер траф прокачанный через PHP не считает. Эта библиотека в PHP вроде CURL называется. Я ставил один скрипт на PHP и им закачивал на хост по http/ftp по 50Gb в сутки - а в статистике 0.
цитата
20/03/08 в 01:07
 dlk44
Heavy писал:

вообще не лучшая задача для виртула, много могут не разрешить (если виртуал херовенький)


А что именно должно быть разрешено?

PS Файлы большие - от 200Mb до 1500Mb.
цитата
20/03/08 в 01:18
 LemonS
ставим nginx для тех кто болеет за наших или lighttpd кто за пиндосов - там есть ограничение и по скорости отдачи и по потокам.
цитата
20/03/08 в 01:20
 LemonS
упс не прочел про виртуал, совет считать недействительным :)
цитата
20/03/08 в 01:54
 Heavy
для таких больших файлов - обязательно докачку нужно делать, но возможность докачки - сразу открывает возможность многопоточной скачки

по passthru вот -
http://php.net/manual/en/function.passthru.php
т.е. просто вывод файла через шел в браузер можно сделать.

докачку можно так - может не работать, т.к. оригинал работал с базой... ну и валидаций добавить на файл нужно - что бы не хакали icon_smile.gif

Код:

error_reporting(0);
set_time_limit(0);

        $file='some_dir'.intval($_REQUEST['filename']);
        if (!is_file($file)) { die('404 File not found!'); }

        $size = filesize($file);
        $filename = basename($file);
        $ctype='application/octet-stream'; // либо определять реальный тип mime

        header('Cache-Control: public', true);
        header('Content-Type: '.$ctype, true);

        if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) {
            $iefilename = preg_replace('/\./', '%2e', $filename,
                                substr_count($filename, '.') - 1);
            header("Content-Disposition: attachment; filename=\"$iefilename\"",true);
        } else {
            header("Content-Disposition: attachment; filename=\"$filename\"",true);
        }
        header("Accept-Ranges: bytes");

        if(isset($_SERVER['HTTP_RANGE'])) {
            list($a, $range)=explode("=",$_SERVER['HTTP_RANGE']);
            str_replace($range, "-", $range);
            $size2=$size-1;
            $new_length=$size2-$range;
            header("HTTP/1.1 206 Partial Content");
            header("Content-Length: $new_length");
            header("Content-Range: bytes $range-$size2/$size");
        } else {
            $size2=$size-1;
            header("Content-Range: bytes 0-$size2/$size");
            header("Content-Length: ".$size);
            $range = 0;
        }

        $fp=fopen("$file","r");
        fseek($fp,$range);
        while (!feof($fp)) {
            print(fread($fp,32*1024));
            flush();
            ob_flush();
            sleep(0); // хз на сколько это пыху поможет
        }
        fclose($fp);
цитата
21/03/08 в 05:50
 dlk44
[quote="Heavy"]для таких больших файлов - обязательно докачку нужно делать, но возможность докачки - сразу открывает возможность многопоточной скачки

по passthru вот -
http://php.net/manual/en/function.passthru.php
т.е. просто вывод файла через шел в браузер можно сделать.[quote]

Ладно - можно и без докачки ибо многопотоковость мне не подходит - могут неправильно учеть траф.

Подскажи - если использовать passthru - юзеры смогут качать не браузером, а качалками? Ничего против качалок я не имею.
цитата
21/03/08 в 11:41
 Heavy
да конечно. пусть качают чем хотят. только для правильного имени скачиваемого файла и что бы броузер предложил скачать файл, а не открыть как страницу - всетаки добавляйте в заголовок ответа:
Content-Disposition: attachment; filename=...
цитата
21/03/08 в 14:36
 Stek
а можно съехать с сервага и не мучать больше жопу icon_smile.gif

Ограничение на скорость сделать легко, а вот на 1 поток сложно, тем более на виртуале.
цитата
22/03/08 в 04:29
 dlk44


Да мне скорость ограничивать не нужно.

А если отдавать файлы через PHP способом котрый не поддерживает докачку - юзеры ведь не смогут качать многопотоково?

PS Ну а с серваги я пока съезжать не буду.
цитата
22/03/08 в 04:32
 dlk44
Heavy писал:
да конечно. пусть качают чем хотят. только для правильного имени скачиваемого файла и что бы броузер предложил скачать файл, а не открыть как страницу - всетаки добавляйте в заголовок ответа:
Content-Disposition: attachment; filename=...


Я в PHP чесно говоря не очень понимаю. Нужно создать отдельный .php скрипт и через .htaccess назначить его обработчиком http запросов? Или нужно вставить код прямо в html страницу где ссылки на файлы? Мы говорим конечно про отдельную запароленную папку откуда юзеры и будут качать файлы.


Эта страница в полной версии