Модераторы: Aliance, skyboy, MoLeX, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Правильная отдача файла клиенту, Остановка скрипта при отмене закачки 
V
    Опции темы
v1kee
Дата 28.1.2011, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 14.9.2010

Репутация: нет
Всего: нет



Здравствуйте уважаемые форумчане! 
Такая тема: клиент (например Download Master) обращается на сервер к скрипту download.php, скрипт начинает отдавать клиенту файл на сервере через:
Код

$fs = fopen('filename.rar','rb');
    header("Content-Disposition: attachment; filename=filename.rar");
    header("Accept-Ranges: bytes");
    header("Content-Length: $size");
    header("Content-Range: bytes $range-".($size-1)."/$size");
    header("Content-type: application/octet-stream");
    while (!feof($fs))
    {
        $line = fgets($fs,2048);
        print $line;
    }

таким образом он print'ит весь файл.
Проблема в том что если клиент отменяет закачку или она прервалась по техническим причинам у клиента, скрипт все равно продолжает работу, чем наверно впустую тратит процессорное время сервера! А если файл около 500 МБ скрипт будет работать пока не наступит конец файла...

Вопрос: как определить что клиент отменил передачу файла и завершить работу скрипта? Может в цикле while (!feof($fs)) вставить проверку на какую либо переменную глобальную, а когда в Download Master'e
клиент жмет паузу наверно отправляется заголовок какой нибудь что мол "закачка остановлена", перехват этого заголовка и изменение глобальной переменной приведет к выходу из цикла?

Помогите пожалуйста решить проблему, посоветуйте что нибудь?
PM MAIL   Вверх
gta4kv
Дата 28.1.2011, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: нет
Всего: 91



ну во-первых отдача файла скриптом, это идея вообще отстой.

Если оно, всё таки надо, то:
Код

readfile($file_path);


без fopen и прочего. если нужна поддержка докачки, то или отдавать файл не скриптом, или анализировать заголовок X-Range, и тогда придется отдавать файл опять через fopen
PM MAIL   Вверх
skyboy
Дата 28.1.2011, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 1
Всего: 260



Цитата(gta4kv @  28.1.2011,  15:24 Найти цитируемый пост)
Если оно, всё таки надо, то:

... использовать x-sendfile или аналоги. ели тебе вообще нужен скрипт(авторизация, счетчик закачек etc)
PM MAIL   Вверх
gta4kv
Дата 28.1.2011, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: нет
Всего: 91



skyboy,
это я собирался предложить дальше.. всё таки x-sendfile это уже не "отдача скриптом"
PM MAIL   Вверх
v1kee
Дата 28.1.2011, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 14.9.2010

Репутация: нет
Всего: нет



Нет, мужики, это все конечно хорошо.... но необходимо через php.......
PM MAIL   Вверх
gta4kv
Дата 28.1.2011, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: нет
Всего: 91



я написал в первом сообщение, как через PHP
PM MAIL   Вверх
skyboy
Дата 28.1.2011, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 1
Всего: 260



Цитата(v1kee @  28.1.2011,  15:55 Найти цитируемый пост)
Нет, мужики, это все конечно хорошо.... но необходимо через php....... 

что дает механизм x-sendfile - в курсе? если нет, то лучше сначала почитай. 
если в курсе - приведи хоть один аргумент в пользу "только РНР" супротив "PHP + X-SendFile"
PM MAIL   Вверх
v1kee
Дата 28.1.2011, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 14.9.2010

Репутация: нет
Всего: нет



Понимаешь, я просто привожу пример такого рода - что скрипт выдает файл со своего сервера, на самом деле все так:
у меня 2 хостинга, первый недорогой с размером в 200 мегабайт, на втором у меня 4 Тб дискового пространства это FTP.
Это все связано таким образом - файл на самом деле хранится на втором хостинге, но я не могу отдавать файл просто так со своего FTP, так как это влечет скачивание файлов без учета трафика, и без учета рейтинга пользователя... Я не хочу чтобы адресс моего FTP фигурировал при передаче пакетов так как это влечет определенные затраты для меня,
поэтому я реализовал следующее:

1. Клиент обращается к download.php
2. download.php отсылает через сокет на FTP header с запросом "HEAD /file.rar HTTP/1.1" 
3. получив размер файла download.php отправляет заголовок GET
4. download.php качает по 2 килобайта и сразу направляет клиенту.

Вот вся цепочка. Теперь, зная что к чему, Вы можете посоветовать что нибудь для решения данной задачи без умного вида
выражений вроде:
Цитата(skyboy @  28.1.2011,  17:01 Найти цитируемый пост)
если нет, то лучше сначала почитай. 

?
PM MAIL   Вверх
skyboy
Дата 28.1.2011, 18:15 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 1
Всего: 260



Цитата(v1kee @  28.1.2011,  15:09 Найти цитируемый пост)
Проблема в том что если клиент отменяет закачку или она прервалась по техническим причинам у клиента, скрипт все равно продолжает работу

Если коротко: так не должно быть. Для такого поведения надо совершить определенные действия.
PHP: Connection handling 
Цитата(v1kee @  28.1.2011,  17:03 Найти цитируемый пост)
без умного вида выражений вроде:

сорри, пишу, как могу.
в дальнейшем попытаюсь писать проще.
дабы не смущать.

PM MAIL   Вверх
skyboy
Дата 28.1.2011, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 1
Всего: 260



используемый FTP поддерживает докачку?

Добавлено через 36 секунд
давай, показывай настоящий скрипт.
PM MAIL   Вверх
v1kee
Дата 28.1.2011, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 14.9.2010

Репутация: нет
Всего: нет



Щас почитаю по поводу PHP: Connection handling спасибо!
Да FTP поддерживает докачку, при условии что к нему обращаются с логином и паролем администратора.

Это сообщение отредактировал(а) v1kee - 31.1.2011, 19:11
PM MAIL   Вверх
skyboy
Дата 28.1.2011, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 1
Всего: 260



Цитата(v1kee @  28.1.2011,  17:55 Найти цитируемый пост)
Щас почитаю по поводу

соственно, скинул только ради описания факта - в отсутствие вызова ignore_user_abort работа скрипта должна прерываться сразу после разрыва соединения. если не рвется - то что-то не так.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Сеть | Следующая тема »


 




[ Время генерации скрипта: 0.0790 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.