Really all you need it application/octet-stream as your mime type. That tells the browser that it is binary and cannot be displayed.
To do this in PHP you also need to provide 2 additional headers to follow HTTP specification.
The content disposition header set to attachment will tell the browser what to save it as... Instead of a random filename with query string like "whatever.php?d=12422&file=blah"
The content length header is required by HTTP 1.0, but not by HTTP 1.1, it is expected... If the file size cannot be determined it should be given the chunked attribute, this allows the HTTP 1.1 compliant client to determine if it has received the correct amount off data or not, and will return to the server whether or not it has.
PHP Code:
<?php
header ("Content-type: octet/stream");
header ("Content-disposition: attachment; filename=".$file.";");
header("Content-Length: ".filesize($file));
readfile($file);
exit;