С нами с 28.03.00
Сообщения: 520
Рейтинг: 349
|
Добавлено: 14/07/06 в 23:30 |
Нужно организовать раздачу файлов размером до 25Мб. Думаю как бы это лучше сделать. Прочитал что используют следующую конструкцию ПХП:
$namefile = './file.zip'; # Имя файла.
$f_size = filesize( $namefile );
/* Отправка заголовков */
header( 'Content-Type: application/zip' ); # Тип файла - zip-архив.
header( 'Content-Length: '.$f_size ); # Размер файла.
header( 'Accept-Ranges: bytes' ); # Размер измеряется в байтах.
/* Отдаем содержимое файла */
$f = fopen( $namefile, 'rb' );
$content = fread( $f, $f_size );
fclose( $f );
print $content;
Но как мне кажется такая фигня при одновременной скачке, скажем 50 пользователями, просто положит сервер т.к. будет запущено 50 апачей и ПХП каждый из который возмет файл в 25 Мб...
Вариант второй, как я уже когда-то делал копировать файл во временный каталог и уничтожать его по крону черз Nое количество часов. Тут, как я понимаю сервер грузиться не будет, т.к. человеку будет выдан прямой линк, но тут бы не забить до упора винт, да и контролировать скачку становится несколько затруднительно.
Вариант третий, который предложил админ:
Файл не копировать, а в папке откуда будет вестись скачка делать симлинк или хардлинк на исходный файл, потом его по крону удалять, старее суток например.
Так как я в юниксе не силен, полазил по инету нашел следующий ликбез про семи и хард линки: хttp://www.spravkaweb.ru/php/datafun/link/ - впринципе, тут все понятно. Остается непонятным как мне это реализовать для моего конкретного случая? Т.е. на PHP, для отдачи файлов пользователю, причем так, чтобы пользователь не знал реального местонахождения файла на сервере.
Кто-нибудь может кинуть в меня каким-ниубдь примером?
А может возможен четвертый вариант?
Буду благодарен за любые советы.
|
|
|
|
С нами с 15.06.06
Сообщения: 114
Рейтинг: 25
|
Добавлено: 14/07/06 в 23:46 |
А ты читай по кусочкам.
/* Отдаем содержимое файла */
$buf_size = 32767; // Размер буфера
$f = fopen( $namefile, 'rb' );
while (!feof($f)) print fread( $f, $buf_size );
fclose( $f );
|
|
|
|
С нами с 28.03.00
Сообщения: 520
Рейтинг: 349
|
Добавлено: 14/07/06 в 23:53 |
так при таком подходе, во время отдачи файла постоянно будет висеть копия апача и ПХП, что для меня недопустимо.
|
|
|
|
С нами с 15.06.06
Сообщения: 114
Рейтинг: 25
|
Добавлено: 14/07/06 в 23:54 |
Стукнись ко мне в аську 259149271 - подскажу. ;-)
|
|
|
|
С нами с 28.03.00
Сообщения: 520
Рейтинг: 349
|
Добавлено: 15/07/06 в 00:06 |
Пытался стукнуться, но такой аси не находит.
|
|
|
|
С нами с 27.11.05
Сообщения: 945
Рейтинг: 930
|
Добавлено: 15/07/06 в 08:02 |
jerry-mooner писал: | А ты читай по кусочкам.
/* Отдаем содержимое файла */
$buf_size = 32767; // Размер буфера
$f = fopen( $namefile, 'rb' );
while (!feof($f)) print fread( $f, $buf_size );
fclose( $f ); |
Документацию принципиально не читаем или специально стараемся сервер побольше загрузить?
@fpasstru($f);
вместо цикла
|
|
|
|
С нами с 19.02.03
Сообщения: 1284
Рейтинг: 354
|
Добавлено: 15/07/06 в 12:10 |
ну так тебе админ правильно сказал,
http://php.net/symlink
в скрипте создаешь уникальный symlink на файл в /downloaddir имя допусим через md5(filename+user_id+time+.zip) пишешь в базу имя symlink время создания и ставишь крон на удаление через сутки.
и выводишь юзеру ссылку вида /downloaddir/dh8sj76khu4sfvueg0i1ua76hm.zip
этот способ самый удачный потому как не сильно грузит сервак
|
|
|
|
С нами с 06.08.03
Сообщения: 243
Рейтинг: 228
|
Добавлено: 17/07/06 в 06:50 |
MrDio писал: | чтобы пользователь не знал реального местонахождения файла на сервере |
Если еще не решил вопрос, стучись: 2-5-7-2-5-4-5-1-2
|
|
|
|
Текстовая реклама в форме ответа Заголовок и до четырех строчек текста Длина текста до 350 символов Купить рекламу в этом месте! |