Я реализовал подобное решение на веб-сайте файлового хостинга.
То, что вы хотите сделать, это использовать обратный вызов register_shutdown_function, который позволяет вам определить конец выполнения сценария php независимо от результата.
Затем вы хотите, чтобы ваш файл находился в недоступном для Интернета месте на вашем сервере (серверах), и чтобы ваши загрузки проходили через php: идея состоит в том, что вы хотите иметь возможность отслеживать, сколько байтов было передано в клиент.
Вот основной способ реализации (например:)
<?php
register_shutdown_function('shutdown', $args);
$file_name = 'file.ext';
$path_to_file = '/path/to/file';
$stat = @stat($path_to_file);
//Set headers
header('Content-Type: application/octet-stream');
header('Content-Length: '.$stat['size']);
header('Connection: close');
header('Content-disposition: attachment; filename='.$file_name);
//Get pointer to file
$fp = fopen('/path/to/file', 'rb');
fpassthru($fp);
function shutdown() {
$status = connection_status();
//A connection status of 0 indicates no premature end of script
if($status == 0){
//Do whatever to increment the counter for the file.
}
}
>?
Очевидно, что есть способы улучшения, поэтому, если вам нужно больше деталей или другое поведение, пожалуйста, дайте мне знать!