+ +
www.b52hosting.com Хостинг
С нами с 10.01.08
Сообщения: 4931
Рейтинг: 147
|
Добавлено: 19/03/08 в 04:52 |
Подскажите - как на виртуале настроить чтобы отдавать файлы пользователям PHP скриптом? На html странице прямые ссылки на avi/wmv/mpeg файлы - пользователь кликает, а файл ему отдает на Апач а PHP скрипт. Файлы нужно отдавать в ОДИН поток, желательно с докачкой, скорость регулировать НЕ нужно.
Аутентификация используется стандартная через .htaccess Доступа к httpd и прочим конфугурационным файлам Апача нет.
Последний раз редактировалось: dlk44 (20/03/08 в 01:15), всего редактировалось 1 раз
|
|
|
|
« ... full on ... »
С нами с 17.03.07
Сообщения: 670
Рейтинг: 1686
|
Добавлено: 19/03/08 в 07:24 |
Самый простой вариант (без ограничения скорости):
Код: | 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().
А зачем нужно отдавать именно через пыху, антилич?
|
|
|
|
С нами с 01.03.06
Сообщения: 629
Рейтинг: 620
|
Добавлено: 19/03/08 в 12:32 |
скорость в пыхе можно регулировать задержками между отсылаемыми блоками.
количество потоков если с ип, то через вызов консоли, если пофайлово, то через свои счетчики.
Цитата: | Самый простой вариант (без ограничения скорости) |
а так же без поддержки докачки и автоматического mime-типа
Цитата: | readfile тут хорош тем, что сразу выводит файл в браузер и не забивает память. |
тогда уж лучше юзать passthru - и не грузить пых вообще
вообще не лучшая задача для виртула, много могут не разрешить (если виртуал херовенький)[/list]
|
|
|
|
+ +
www.b52hosting.com Хостинг
С нами с 10.01.08
Сообщения: 4931
Рейтинг: 147
|
Добавлено: 20/03/08 в 00:54 |
Heavy писал: |
тогда уж лучше юзать passthru - и не грузить пых вообще
вообще не лучшая задача для виртула, много могут не разрешить (если виртуал херовенький)[/list] |
Вобщем скорость регулировать НЕ нужно.
Но хотелось бы отдавать файлы только в один поток. Зачем? Статистика на хосте направильно считает траф при скачивании многопотоковыми качалками. Поэтому для скачивания больших файлов пришлось перейти на FTP что для юзеров сложно.
По поводу passthru можно немного подробнее или дай URL где почитать.
|
|
|
|
+ +
www.b52hosting.com Хостинг
С нами с 10.01.08
Сообщения: 4931
Рейтинг: 147
|
Добавлено: 20/03/08 в 01:01 |
ADSenex писал: |
А зачем нужно отдавать именно через пыху, антилич? |
Есть 2 причины:
1. Основная - неправильный учет трафа при использовании многопотоковых качалок. Поэтому хочется отдавать через PHP в один поток. Скорость ограничивать НЕ нужно.
2. похоже хостер траф прокачанный через PHP не считает. Эта библиотека в PHP вроде CURL называется. Я ставил один скрипт на PHP и им закачивал на хост по http/ftp по 50Gb в сутки - а в статистике 0.
|
|
|
|
+ +
www.b52hosting.com Хостинг
С нами с 10.01.08
Сообщения: 4931
Рейтинг: 147
|
Добавлено: 20/03/08 в 01:07 |
Heavy писал: |
вообще не лучшая задача для виртула, много могут не разрешить (если виртуал херовенький) |
А что именно должно быть разрешено?
PS Файлы большие - от 200Mb до 1500Mb.
|
|
|
|
С нами с 11.01.07
Сообщения: 3607
Рейтинг: 2686
|
Добавлено: 20/03/08 в 01:18 |
ставим nginx для тех кто болеет за наших или lighttpd кто за пиндосов - там есть ограничение и по скорости отдачи и по потокам.
|
|
|
|
С нами с 11.01.07
Сообщения: 3607
Рейтинг: 2686
|
Добавлено: 20/03/08 в 01:20 |
упс не прочел про виртуал, совет считать недействительным :)
|
|
|
|
С нами с 01.03.06
Сообщения: 629
Рейтинг: 620
|
Добавлено: 20/03/08 в 01:54 |
для таких больших файлов - обязательно докачку нужно делать, но возможность докачки - сразу открывает возможность многопоточной скачки
по passthru вот -
http://php.net/manual/en/function.passthru.php
т.е. просто вывод файла через шел в браузер можно сделать.
докачку можно так - может не работать, т.к. оригинал работал с базой... ну и валидаций добавить на файл нужно - что бы не хакали
Код: |
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);
|
|
|
|
|
+ +
www.b52hosting.com Хостинг
С нами с 10.01.08
Сообщения: 4931
Рейтинг: 147
|
Добавлено: 21/03/08 в 05:50 |
[quote="Heavy"]для таких больших файлов - обязательно докачку нужно делать, но возможность докачки - сразу открывает возможность многопоточной скачки
по passthru вот -
http://php.net/manual/en/function.passthru.php
т.е. просто вывод файла через шел в браузер можно сделать.[quote]
Ладно - можно и без докачки ибо многопотоковость мне не подходит - могут неправильно учеть траф.
Подскажи - если использовать passthru - юзеры смогут качать не браузером, а качалками? Ничего против качалок я не имею.
|
|
|
|
С нами с 01.03.06
Сообщения: 629
Рейтинг: 620
|
Добавлено: 21/03/08 в 11:41 |
да конечно. пусть качают чем хотят. только для правильного имени скачиваемого файла и что бы броузер предложил скачать файл, а не открыть как страницу - всетаки добавляйте в заголовок ответа:
Content-Disposition: attachment; filename=...
|
|
|
|
www.phpdevs.com
С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105
|
Добавлено: 21/03/08 в 14:36 |
а можно съехать с сервага и не мучать больше жопу
Ограничение на скорость сделать легко, а вот на 1 поток сложно, тем более на виртуале.
|
|
Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.
|
0
|
|
|
+ +
www.b52hosting.com Хостинг
С нами с 10.01.08
Сообщения: 4931
Рейтинг: 147
|
Добавлено: 22/03/08 в 04:29 |
Да мне скорость ограничивать не нужно.
А если отдавать файлы через PHP способом котрый не поддерживает докачку - юзеры ведь не смогут качать многопотоково?
PS Ну а с серваги я пока съезжать не буду.
|
|
|
|
+ +
www.b52hosting.com Хостинг
С нами с 10.01.08
Сообщения: 4931
Рейтинг: 147
|
Добавлено: 22/03/08 в 04:32 |
Heavy писал: | да конечно. пусть качают чем хотят. только для правильного имени скачиваемого файла и что бы броузер предложил скачать файл, а не открыть как страницу - всетаки добавляйте в заголовок ответа:
Content-Disposition: attachment; filename=... |
Я в PHP чесно говоря не очень понимаю. Нужно создать отдельный .php скрипт и через .htaccess назначить его обработчиком http запросов? Или нужно вставить код прямо в html страницу где ссылки на файлы? Мы говорим конечно про отдельную запароленную папку откуда юзеры и будут качать файлы.
|
|
|
|