It\'s surprising how difficult it is to find a simple, concise answer to this question:
Use the logs--each GET request for the file is another download (unless the visitor stopped the download partway through for some reason).
The simplest way would probably be instead of linking directly to the file, link to a script which increments a counter and then forwards to the file in question.
With the answer "The simplest way would probably be instead of linking directly to the file, link to a script which increments a counter and then forwards to the file in question."
This is additional:
$hit_count = @file_get_contents('count.txt');
$hit_count++;
@file_put_contents('count.txt', $hit_count);
header('Location: http://www.example.com/download/pics.zip'); // redirect to the real file to be downloaded
Here count.txt
is a simple plain text file, storing the counter info.
You can save it in a database table along with downloadable_filename.ext
also.
Or you could parse the log file if you don't need the data in realtime.
grep foo.zip /path/to/access.log | grep 200 | wc -l
In reply to comment:
The log file also contains bytes downloaded, but as someone else pointed out, this may not reflect the correct count if a user cancels the download on the client side.