как в rapidshare.de?

bevaine

Новичок
Steamroller а примерчик можно, я что-то не очень пойму, по идеи readfile всегда выдает полный размер файла, его в цикл нужно заключать?
 

Steamroller

Новичок
А readfile() выполняется меньше секунды и всегда возвращает размер картинки. Вот такая штука.
Значит это буферизация.
Steamroller а примерчик можно, я что-то не очень пойму, по идеи readfile всегда выдает полный размер файла, его в цикл нужно заключать?
Там в комментах на странице мануала по fpassthru куча примеров. Еще надо ignore_user_abort вызвать, чтобы если прервется связь - снять блокировку.
 

berkut

Новичок
>> Steamroller Значит это буферизация.
буферизация чего и где? output buffering?

-~{}~ 03.11.05 18:35:

>> Еще надо ignore_user_abort вызвать, чтобы если прервется связь - снять блокировк
в том-то и дело, что не работает не именно connection_aborted(), а вообще определение обрыва связи. можно проверить
set_time_limit(10);
ignore_user_abort(false);
register_shutdown_function('shd');
while (true) {
sleep(1);
}

скрипт всегда вылетает по max exec time
 

Steamroller

Новичок
буферизация чего и где? output buffering?
Либо php-шный output buffering, либо какая-то прозрачная прокся между сервером и клиентом например.
в том-то и дело, что не работает не именно connection_aborted(), а вообще определение обрыва связи. можно проверить
set_time_limit(10);
ignore_user_abort(false);
register_shutdown_function('shd');
while (true) {
sleep(1);
}
А попробуй в этот код добавить вывод чего-либо (echo "Hello world!") перед циклом sleep, и проверить.

В общем решение с fpassthru как выяснилось плохое, т. к. таймаут большой на отправку... надо еще подумать.
 

bevaine

Новичок
похоже здесь нужно искать не прерывание соединения,а обрабатывать заголовки с Range, только не знаю как?
 

Steamroller

Новичок
Во, кажись нашел рабочий вариант. :)
Надо отдавать среди заголовков header("Connection: close");
Лочим файл.
Далее - делаем fpassthru(...);
Когда он отрабатывает - разлочиваем файл.

С браузерами это работает (проверял на MSIE и FF), но вот при реальном обрыве связи (когда корректно TCP-соединение не завершается) - не известно, как себя поведет. Может быть и в долгий таймаут уйдет...

похоже здесь нужно искать не прерывание соединения,а обрабатывать заголовки с Range, только не знаю как?
Ну смотришь значение заголовка, fseek'ом устанавливаешь начало диапазона, и fpassthru с этого дескриптора вызываешь.
 

berkut

Новичок
>> Steamroller А попробуй в этот код добавить вывод чего-либо (echo "Hello world!") перед циклом sleep, и проверить.

да пробовал я, не работает
 

Steamroller

Новичок
PHP:
	ignore_user_abort(true);
	set_time_limit(0);
	ini_set("output_buffering", "Off");
	$my_file = "./files/file.pdf";
	
if ($fd = fopen ($my_file, "rb")) {
   $fname    = basename ($my_file);

   header("Pragma: ");
   header("Cache-Control: ");
   header("Content-type: application/octet-stream");
   header("Content-Disposition: attachment; filename=\"".$fname."\"");
   header("Content-length: $fsize");
   header("Connection: close");

   system("echo starting. >> ./files/fpass2.log");
   fpassthru($fd);
   system("echo done. >> ./files/fpass2.log");
   
}
Вот.
При обрыве связи - через короткий промежуток пишется done в файл.
Правда при этом fpassthru возвращает столько же, как будто связь и не обрывалась. Но это и не важно.
 

berkut

Новичок
работает и пример из мана, только выдавать надо ни по байту, а большие куски данных. ибо flush(); и ini_set('implicit_flush', 1); не работают, ни на вин(4.11, 5.0.4) ни на фрибсд(5.0.4)
 

bevaine

Новичок
Может можно организовать данное действо через сокеты? Так намного нагляднее, что юзер отсоеденился.
 

Profic

just Profic (PHP5 BetaTeam)
Меня может и побьют тут :).
Касатаельно "можно докачивать, но скачка только в один поток", предлагаю тупо стартовать сессию :).
Почему это будет работать? Файл сессии лочится php при старте, после остановки скрипта или ручного вызова нужной ф-ции php его разлочивает и другой процесс может его благополучно залочить. В принципе тот-же механизм можно применить и без сессий, только вот не уверен насчет разлочки после завершения скрипта, но с другой стороны куда ему детьтся с подводной лодки :).
 

bevaine

Новичок
А ты вообще пробовал, я вообще-то не очень понял, каким образом файл сессии разлочиться при обрыве связи, если можно на пальцах, и желательно с примером :)
 

SiMM

Новичок
> каким образом файл сессии разлочиться при обрыве связи
Файл сессии разлочится по завершению скрипта.
 

berkut

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