Forum Webscript.Ru
Программирование => PHP => Тема начата: semya от 27 Октября 2003, 12:45:36
-
столько парюсь уже, в конечном итоге чтобы реализовать сабж вернулся к банальному header(\'Location: ..\') - обидно ужас как.
цель: не показывать реальный урл файла ни при каких условиях и умудриться запустить нитевидную закачку
решение: мод-рерайт отлавливает что хотя в пути стоит файл, это скрипт и отдает имя файла скрипту, скрипт делает все необходимые рассчеты, инкрементирует все счетчики, и выдает файл... вот тут и возникают проблемы
проблемы: 1) когда файл небольшой проблем вроде нет, 2) если отдавать все обычным способом типа readfile(), fopen(), fpassthru() etc.... то на файле больше 2х, 3х, метров скрипт дохнет, т.к. у пхп ограничения памяти стоит, и это понятно, разжали мы этот лимит до 100 метров, даже 18ти метровые файлы стал пропускать - но когда три-четыре юзера их качает - все равно кто-то дохнет! ставить ограничение на колчисество скачивающих - нереально! и нельзя! 3) заюзал pear::download класс, который якобы поддерживает нитевидную закачку, но все равно не стартуют остальные части кроме первой...
вопросы:
1) каким образом дать возможность срипту юзать стольк памяти сколько надо и при этом не ограничивать количество скачивающих? я так понимаю надо как-то заюзать внутренние функции апача?
2) как при отдаче файла скриптом заставить работать нитевидность?
спасибо... надеюсь найти ответ...
-
Отдавай файл вот так:
$fp = fopen(\'filename.ext\', \'rb\');
while(!feof($fp)) {
echo fread($fp, 1024);
}
fclose($fp);
У меня на локальном сервере такой код работает с файлами любого размера. Правда на одном хостинге, где мне приходилось отдавать действительно большие файлы, он умирал на файлах больше 93 Мб, даже на одном потоке...
ЗЫ: Насколько я знаю, fpassthru и readfile вообще не должны использовать память скрипта - они сразу всё отдают в output.
-
FreeSpace
пасибо за совет, но такой код тоже пробовал, не работает, дохнет эдак на файлах между 2,5 и 2,8 когда как. Видимо у твоего локального сервера памяти побольше и пошустрее он.
Насколько я знаю, fpassthru и readfile вообще не должны использовать память скрипта - они сразу всё отдают в output.
When using readfile() -or fopen() and fpassthru() - make sure that if you are dealing with large files that are located on your server, use absolute paths and not URL\'s! Otherwise, the file will essentially be downloaded twice - the script will access the file from your web server itself, and then output it to the client, doubling the bandwidth. I made this mistake in a download script I made that included files on other servers, when the file was on mine, I forgot to use absolute paths. So, even for good practice if your files you\'re accessing are small, use absolute paths whenever possible. Seems obvious, but don\'t forget about it. - man...
и нитевидная закачка все равно не пашет
-
Каким образом
use absolute paths and not URL\'s
относится к этой теме?
По-моему у тебя проблемы с хостингом и тебе следует его поменять.
Но только если ты действительно всё делаешь правильно и даже PEAR-класс у тебя не работает так, как должен.
-
По-моему решение тут очень простое: используешь mod_rewrite, в нем прописываешь
RewriteEngine On
RewriteMap update-stats prg:/home/www/htdocs/update.pl
RewriteRule ^/download?id=([0-9]+)$ ${update-stats:$1}
update.pl при этом делает необходимые изменения и возвращает реальный путь к файлу на сервере (завершенный \\n).
Не забудь отключить буферизацию вывода:
$| = 1;
-
[off]
amigo:
RewriteMap update-stats prg:/home/www/htdocs/update.pl
amigo:
$| = 1;
Форум по перлу на этаж выше.[/off]
-
FreeSpace я знаю, но ведь такой способ гораздо лучше, чем fpassthru(), равзе не так?
Зачем повторно реализовывать функции, заложенные в Апаче?
Если не нравиться Перл, то пусть уж в RewriteMap вызывается шелловый скрипт, который будет вызывать PHP ^_^
-
amigo
мод-рерайт не прокатит в моем конкретном случае, т.к. у меня на нем и так движок сайта завязан. а вот с буферизацией вывода ты похоже прав, сейчас это проверяю, видимо где-то в движке она включается... сейчас ищу, спасибо за идею.
-
semya и что мешает прикрутить еще несколько рерайт-директив? =)
Ладно, умолкаю, больше идей у меня нет.
-
amigo
ну понимаешь, движок штука нежная, чуть где слэша не хватает, чуть где страница не так проиндексина - уже не хорошо получается, поэтому именно в моем случае такое решение не катит... тем более если я поставлю перепись определенного адреса, топотеряется универсальность.... ну короче много мелких геморров... но это уже не по теме...
-
semya OK. Если с buffering что-нибудь получится, сообщи =)