Watts[]n!
Лучший вариант -- использование mod_rewrite с редактируемой картой реврайтинга№ Потому что в процессе самой скачки php не будет являться промежуточным звеном.
Если возможности сделать это нет, то php придётся делать промежуточным звеном. Т.е. запрос поступает к php скрипту, скрипт что-то думает, читает содержимое файла и выдаёт его клиенту в stdout, клиенту. При этом придётся php-скриптом анализировать все заголовки (включая partial-content-ные, иначе пользователи будут материть твой сайт).
Сам механизм заключается в создании отдельной таблицы с 4 полями: [ID пользователя], [Ключ скачки], [Ресурс], [Время добавления].
При генерации ссылки, скрипт генерирует уникальный "ключ скачки", и заносит в таблицe запись, содержащую ид пользователя, которому была отдана ссылка, уник. ключ ссылки, ресурс, который должен быть отдан пользователю по этой ссылке.
Скрипт-гейт, через который будет осуществляться скачивание, проверяет переданный уникальный ID, т.е. запрашивает из специальной таблицы запись с таким ID-ом, и если такая есть, используя поле [Ресурс] отдаёт пользователю файл.
Если же такой записи нет (число записей = 0), -- вежливо посылает пользователь.
И вне зависимости от того, удалось ли найти записиь или нет, делает запрос, который удаляет все записи из этой таблице, у которых [время добавления] будет меньше, чем ТекущееВремя минус СрокЖизниСсылки.
И топик по теме:
http://fire-lines.ru/forum/viewtopic.php?t=301