You only need 3 headers to make this work and 1 or 2 more lines after that. That is all you need to add in order to have any binary file to force download itself whenever the PHP file is called.
header("Content-Length: " . filesize($path_to_file));
header('Content-Disposition: attachment; filename="' . basename($filename) . '"');
The path to file variable is the absolute path of the file that you wish to have the user force download it.
The 3 headers are important, otherwise they won’t work. The basename function is also important in case you might pass a variable that contains the absolute path of the filename and we do not want other users to see the file structure of your server.
The basename function removes all directory paths and returns the name of the file itself.
That’s it! Easy, right?