bumperbox
bumperbox

Reputation: 10214

php most memory efficient way to return files

so i have a bunch of files, some can be up to 30-40mb and i want to use php to handle security of the files, so i can control who has access to them

that means i have a script sort of like this rough example

$has_permission = check_database_for_permission($user, filename);

if ($has_permission) {
   header('Content-Type: image/jpeg'); 
   readfile ($filename);    
   exit; 
} else {
  // return 401 error
}

i would hate for every request to load the full file into memory, as it would soon chew up all the memory on my server with a few simultaneous requests

so a couple of questions

  1. is readfile the most memory efficient way of doing this?
  2. is there some better method of achieving the same outcome, that i am overlooking?

server: apache/php5

thanks

Upvotes: 2

Views: 399

Answers (2)

johannes
johannes

Reputation: 15989

The fastest way is when you can relay this to the webserver. The webserver can use the sendfile() call to ask the operating system kernel to directly copy from a file to the network stream. for instance when using lighttpd there is a way that PHP can signal the server to take over and do the sendfile trick:

http://redmine.lighttpd.net/projects/lighttpd/wiki/X-LIGHTTPD-send-file

Upvotes: 3

JSBձոգչ
JSBձոգչ

Reputation: 41388

readfile is the correct way to do this. By all means don't try to read the file yourself and print it to output--that will consume excessive memory. With the readfile function the contents of the file are buffered directly to output, taking up a trivial amount of transitory memory.

Upvotes: 6

Related Questions