Fastest way to redirect missing image files

烂漫一生 提交于 2020-01-07 04:12:25

问题


I have an on-the-fly thumbnailing system and am trying to find the best way to make sure it's as fast as possible when serving up images. Here is the current flow:

  • User requests thumbnail thumbnails/this-is-the-image-name.gif?w=200&h=100&c=true
  • htaccess file uses modrewrite to send requests from this folder to a PHP file
  • PHP file checks file_exists() for the requested image based on the query string values

If it does:

header('content-type: image/jpeg'); 
echo file_get_contents($file_check_path); 
die();

If it doesn't it creates the thumbnail and returns it.

My question is whether there is a way to optimize this into being faster? Ideally my htaccess file would do a file_exists and only send you to the PHP file when it doesn't... but since I am using query strings there is no way to build a dynamic URL to check. Is it worth switching from query strings to an actual file request and then doing the existence check in htaccess? Will that be any faster? I prefer the query string syntax, but currently all requests go to the PHP file which returns images whether they exist or not.

Thank you for any input in advance!


回答1:


You should be able to do this in theory. The RewriteCond command has a flag -f which can be used to check for the existence of a file. You should be able to have a rule like this:

# If the file doesn't exist
RewriteCond %{REQUEST_FILENAME} !-f

# off to PHP we go
RewriteRule (.*)   your-code.php [L,QSA]

The twist here is that I imagine you're naming files according to the parameters that come in -- so the example above might be thumbnails/this-is-the-image-name-200-100.gif. If that is the case, you'll need to generate a filename to test on the fly, and check for that instead of the REQUEST_FILENAME -- the details of this are really specific to your setup. If you can, I would recommend some sort of system that doesn't involve too much effort. For example, you could store your thumbnails to the filesystem in a directory structure like /width/height/filename, which would be easier to check for in a rewrite rule than, modified-filename-width-height.gif.

If you haven't checked it out, Apache's mod_rewrite guide has a bunch of decent examples.

UPDATE: so, you'll actually need to check for the dynamic filename from the looks of it. I think that the easiest way to do something like this will be to stick the filename you generate into an environment variable, like this (I've borrowed from your other question to flesh this out):

# generate potential thumbnail filename
RewriteCond %{SCRIPT_FILENAME}%{QUERY_STRING} /([a-zA-Z0-9-]+).(jpg|gif|png)w=([0-9]+)&h=([0-9]+)(&c=(true|false))

# store it in a variable
RewriteRule .* - [E=thumbnail:%1-%2-%3-%4-%6.jpg]

# check to see if it exists
RewriteCond %{DOCUMENT_ROOT}/path/%{ENV:thumbnail} !-f 

# off to PHP we go
RewriteRule (.*)   thumbnail.php?file_name=%1&type=%2&w=%3&h=%4&c=%6 [L,QSA]

This is completely untested, and subject to not working for sure. I would recommend a couple other things:

Also, one huge recommendation I have for you is that if possible, turn on logging and set RewriteLogLevel to a high level. The log for rewrite rules can be pretty convoluted, but definitely gives you an idea of what is going on. You need server access to do this -- you can't put the logging config in an .htaccess file if I recall.



来源:https://stackoverflow.com/questions/6348045/fastest-way-to-redirect-missing-image-files

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!