A: 

Thanks Andy

I tried it, and it works, but I must ask, does anyone know if the readfile() function literally reads the file, or just serves it?

I guess I'm concerned about server optimization and memory usage. I am limited in my knowledge with php + files, but I am trying to be smart about it too.

It should output as it reads, rather than reading the whole file into memory all at once. As such, memory usage should be minimal.
Frank Farmer
@user271619: That example is slightly modified from the example in the manual for the `readfile()` function. If you read the manual, you'll find that `readfile()` outputs the file's contents and returns the number of bytes read. http://us3.php.net/manual/en/function.readfile.php
Andy E
+1  A: 

The PHP manual gives good insight on how to achieve this with an example on the readfile function's page:

<?php
$file = 'monkey.gif';

if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
}
?>

This forces any file to be downloadable by setting the content-disposition and content-type headers. That's pretty much the way this sort of thing is usually done, file_get_contents will allow you to do the same thing too.

Andy E
A: 

Thanks Guys! This really helps with the options.

I'm not always concerned about memory usage, but when other users are utilizing your server, you can't help but wonder where the limits are pushed, since people tend to upload large stuff, from time to time.