One problem when relaunching large projects with a ton of images is to re-create all the thumbnails that users have uploaded in the years. If you don’t use paperclip (ruby) or anything like it in PHP (is there any like it!?) where you can run run one command to re-create all the thumbnails in all specified sizes your can try to keep it flexible and create every image on demand.
Theory
The Webserver should serve the image if it exists. If the file does not exist, the request should be redirected to a PHP script that searches and creates the requested image file (in requested size) at exactly the location it was originally requested. The second request on the file will not be redirected to the PHP script and will server the image that now exists.
Practice
So the first thing to archive is to send the request of a not existing image to a PHP file. That’s easy if you’re familiar with all the nginx directives:
This rule can be combined with the anti-hotlinking rules for images with nginx I showed you last week.
After that we need to create a format that includes width and height of any requested image so that the thumbnailer.php
knows which size the created image should have. A valid request for a resized file should always have all parameters (width, height) in it:
../img/public/9c4be029/438xauto/filename.jpg
This makes it easy to split up width, height with a regexp in thumbnailer.php
. The following code is just an example. You’re surelly integrate the logic into your frameworks:
That’s it! After that you can request any image in any size on your webserver by only creating it once it’s requested.
There are some things you can add, like other parameters in the $formatRegexp
string to add different resizing methods or even filters, or limitations on the width
and height
parameter.
Appendix: Apache
It’s almost the same thing with apache. Just add a few lines to your .htaccess.
and all your image requests are redirected to the thumbnailer (or anything):