[This is a post for self-reference]
Up front I’m going to say I got exactly the help I need from here: https://www.wpbeginner.com/wp-tutorials/how-to-increase-the-maximum-file-upload-size-in-wordpress/.
The author of that post deserves all my credit.
I’m creating this post to summarise it in my own words and to give it a little educational context.
When allowing file uploads on a website there are 3 big things you need to think about:
- The size of each file.
- The total size of all files in an upload.
- The time it takes to process the upload.
Actually, there are a couple of things to consider that are worthy of mention but I won’t cover in this post:
- Asynchronous uploads (AJAX as we used to call them) can change the figure of an upload, because instead of uploading multiple files at one, you upload one file at a time (even if they are in parallel) so the “total size of all files” number will be different.
- Tell users about the limits they face before they upload. Also, when uploading images a bit of guidance around things like “27MB images are a stupid side for most sites because 27MB isn’t going to be better than 7MB, and the site will trim the size down to a couple of hundred KB at most anyway.”
- Trap, log and respond to any errors. This is on my mind because WordPress/PHP seems to like gobbling errors and not telling anyone about it (I’m in the process of hunting down how to handle this and will be a topic of another post).
There are 3 main ways in PHP to affect file upload sizes and times:
- @set_init() in a PHP script itself.
- php.ini file
- .hataccess file.
Be aware, as a PHP/Linux novice I reckon there are other defaults and hierarchies that come into play.
This article is spawned by a situation where I was changing php.ini without realising .htaccess had a value overriding it.
How do you implement these values?
This is where I rip from the wpbeginner site I mentioned above for quick reference:
1. PHP script file (e.g. functions.php in WordPress themes)
@ini_set( 'upload_max_size' , '64M' ); @ini_set( 'post_max_size', '64M'); @ini_set( 'max_execution_time', '300' );
(I haven’t tried this approach yet, but I have used @ini_set() in other instances (e.g. ‘memory_limit’) and it’s worked well.
upload_max_filesize = 64M post_max_size = 64M max_execution_time = 300
I’ve used this approach in development and it did the trick.
php_value upload_max_filesize 64M php_value post_max_size 64M php_value max_execution_time 300
Before writing this post I had to fix a production issue and after trying php.ini I got lucky and discovered .htaccess was where the value was coming from.
So the moral: .htaccess overrides php.ini.
Also, I did not need to restart apache for this change to take affect.
DISCLAIMER: I haven’t actually read in-depth how all this works. I’m a typical developer who expects other people’s shit to work, and when it doesn’t I’m usually in the middle of my own concerns so it’s a case of “search and scan by keyword until someone else’s solution works for me”.
Such is this age of software development.
Need to know what your current settings are?
It’s helpful in debugging and verification to know what your actual PHP settings are so you know what your starting point is (and you have a number to search your files for).
A good way is to call phpinfo();.
For example, create a file in your site (I call mine info.php) and add the following PHP code:
<?php phpinfo(); ?>
You should see something like the following when you run it. This screenshot shows some output from the section titled “Core”, and the 3 columns are (from left to right): “Directive”, “Local Value” and “Master Value”. I can say from experience the “Local Value” is the one that matters.