Отдача файла скриптом и параллельная работа другими страницами сайта

AHTIXPICT

Новичок
Отдача файла скриптом и параллельная работа другими страницами сайта

Отдаю файл таким скриптом.
PHP:
// ....
//  тут стартует сессия и определяются все константы и переменные
// ....
if (isset($_SESSION['sess_allow_access']))
{
      $file = 'any_big.file';
      $file = UPLOAD_DIR.'/'.$file;
      if ($fp = fopen($file,'rb'))
      {
            header('HTTP/1.1 200 OK');
            header('Content-Disposition: attachment; filename='.basename($file));
            header('Content-Length: '.filesize($file));
            header('Content-Type: '.mime_content_type($file));
            while (!feof($fp)) { echo fread($fp,1024); }
            fclose($fp);
      } else { header('HTTP/1.1 404 Not Found'); }
} else { header('HTTP/1.1 403 Forbidden'); }
exit;
И пока файл качается невозможно работать с другим контентом этого домена
Что можно сделать, файл должен быть защищен от прямой скачки
 

StUV

Rotaredom
if (isset($_SESSION['sess_allow_access']))
{
} else { header('HTTP/1.1 403 Forbidden'); }
это "сквозной" код для всего функционала ?..

-~{}~ 22.04.08 17:23:

+
невозможно работать с другим контентом этого домена
по-русски плиз - в чем заключается "невозможность" ? ;)
 

AHTIXPICT

Новичок
>по-русски плиз - в чем заключается "невозможность" ?

Пока идет скачка фала (файл большой) не открываются другие страницы сайта.
Такое ощущение что апач перестает обрабатывать запросы.
 

StUV

Rotaredom
AHTIXPICT
есть возможность смотреть логи апача ?..

+
фактически что приходит в браузер - какая ошибка ?
 

AHTIXPICT

Новичок
на сервере где пхп как модуль ничего в браузер не приходит.
в логи не пишет запись с вызовом этого скрипта пока файл не скачан
и не пишет в логи ничего пока не скачан фал

На сервере где пхп собран как FastCGI пока качается файл
тоже долго не открывается страница а потом выходит
(блин перепутал)
Service Temporarily Unavailable 503
Логи не могу смотреть


Причем на сервере там где модуль с другого браузера или с другого IP можно работать

А на сервере где ФастЦГИ "Service Temporarily Unavailable 503" для всех
 

StUV

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

+
ключевой момент... =)
сайт "умирает" только для того, кто закачивает или для всех ?
 

AHTIXPICT

Новичок
Автор оригинала: StUV
+
ключевой момент... =)
сайт "умирает" только для того, кто закачивает или для всех ?
Я же говорю на моем сервере там где ПХП как модуль сайт умирает только для этого браузера
На моем сервере лимиты довольно таки большие (но помоему дело не в лимитах ПХП а всамом вебсервере, - он ведь перестает отвечать на запросы)

А на хостинге где ФастЦГИ "сайт временно недоступен" всем
 

nimistar

Новичок
если используешь сессии, то
Session data is usually stored after your script terminated without the need to call session_write_close(), but as session data is locked to prevent concurrent writes only one script may operate on a session at any time.
и соответственно:

PHP:
...
if ($fp = fopen($file,'rb')){
   session_write_close ();   ///<------ закрыть сессию при выдачи больших файлов
   header('HTTP/1.1 200 OK');

...
---------
3 месяца искал сам подобную ошибку!
 

AHTIXPICT

Новичок
nimistar

Для PHP как модуль помогло. Спасибо.

А вот для фастЦГИ не помогло, что очевидно было и ранее, ведь там сервер недоступен становится для всех, не только для текущей сессии, но и для других АЙПИ адресов
 

nimistar

Новичок
честно говоря , фастЦГИ - не юзал :-/
могу только посоветовать методы отладки
1. проверить -работает ли одновременно пхп для разных хостов (может оказаться что нет)(заслипь на время пустой код и с другой машины глянь - есть ответы или нет)
2. зачитать весь фаил в буфер (file_get_content) (или если много то зачитывать кусками) ивыдавать кусками ....

вообще стоит проверить - какие ещё файлы попадают в совместное использование (так и искал - только вот про сессии недодумал, а потом нашел :))
 

AHTIXPICT

Новичок
> 2. зачитать весь фаил в буфер (file_get_content) (или если много то зачитывать кусками) ивыдавать кусками ....

Так ведь и так кусками читает.
while (!feof($fp)) { echo fread($fp,1024); }
fclose($fp);

Весь файл нельзя сразу, он(они) большой
Уже делал так

ob_start();

.....
while (!feof($fp))
{
echo fread($fp,1024);
flush();
ob_flush();
}
fclose($fp);
ob_end_flush();
ob_end_clean();

Тоже самое. Сервер темпорари недоступен
 

nimistar

Новичок
AHTIXPICT, очень извиняюсь за то что выдаю домыслы -
ФастСДЖИАЙ - запуск множества обращений без повторной инициализации парсера (пхп), и вроде бы где-то видел обсуждение что сам ПХП не умеет отпочковывать триды - значит вызов в единицу времени может быть только один ?!

но как вариант ПХП хоть и один .. но работать может (закроем глаза на пространство переменных) но вот файлик то у тебя открыт! .. (хендлер установлен) - вот я и предлагал использовать file_get_content
Вот чушь то я написал! :-( проблема действительно в том что пхп как фастСДЖИАй неспособен обрабатывать несколько запросв одновременно - только последовательно


просто пример как обрабатывать фаил через file_get_contents - поблочно
PHP:
$FSize=filesize(UPLOAD_DIR.'/'.$file);
for($i=0;$i<=$FSize;$i+=1024){
    echo file_get_contents(UPLOAD_DIR.'/'.$file,FALSE,null,$i,1024); // php > 5.1.0
}
надеюсь меня извинят, если неправ - данный вариант рассматривать исключительно как мысль, требующую шлифовки
 

dr-sm

Новичок
скорей всего session handler - files, и по этому воркеры фастцжи локаются на файлах с сессиями, нельзя по идее files и фастцжи.
 

fixxxer

К.О.
Партнер клуба
какой нафиг file_get_contents, сумашедшые сервера не жалко

readfile в худшем случае, а вообще X-Accel-Redirect

ну про session_write_close уже сказали

-~{}~ 23.04.08 09:07:

>>проблема действительно в том что пхп как фастСДЖИАй неспособен обрабатывать несколько запросв одновременно - только последовательно

один воркер? ;) гы
 
Сверху