Working with large files

Using streams

In order to allow transfers of big files, SabreDAV makes use of streams everywhere internally.

This allows you to deal with very large files (tried up to 15GB), without requiring a high number for memory_limit.

PHP Configuration

For this to work, output buffering must be turned off. It appears to be on for some php installations. Not turning this off will make PHP return memory-related errors.

In php ini, this should be:

output_buffering=off

Or if you're setting php settings through apache:

php_flag output_buffering off

More information can be found on webservers.

32bit vs 64bit

The maximum filesize we can currently represent on 32bit systems is 2 GB. To support files larger than 2GB, make sure that your PHP is compiled for 64 bit.

PHP bugs

We recently found out that PHP's fpassthru() method is broken for large files, and does not allow files to be served over 2GB.

A fix has been made for SabreDAV 1.7.11 and 1.8.9. So make sure you are running at least one of those two versions.

mod_security woes

If you're running Apache, and particularly on a shared host, there's a reasonable chance mod_security is deployed, which can limit the total size of request bodies and thus restricts large uploads with PUT.

The main symptomn for this is a server responding with the HTTP status code 413 Request Entity Too Large.

The setting to look for is called SecRequestBodyLimit.


Comments