When I previously suggested that Apache improve performance on .htaccess files by caching them and then watching for changes with inotify, Chris wrote:
just invalidate its cacheThis is very sensible, except Apache doesn't actually cache .htaccess files between requests.
Apache checks .htaccess files in a monster function, ap_directory_walk. It's called on every request, and if AllowOverride is set it will call ap_parse_htaccess on every directory from the root out to the leaf. In ap_parse_htaccess you can see that it does have a per-request cache for parsed .htaccess files:
/* firstly, search cache */ for (cache = r->htaccess; cache != NULL; cache = cache->next) { if (cache->override == override && strcmp(cache->dir, d) == 0) { *result = cache->htaccess; return OK; } } ... more sanity and safety checks ... dc = ap_create_per_dir_config(r->pool); ... load and parse the htaccess file into dc ... /* cache it */ new = apr_palloc(r->pool, sizeof(struct htaccess_result)); new->dir = parms.path; new->override = override; new->override_opts = override_opts; new->htaccess = dc; /* add to head of list */ new->next = r->htaccess; r->htaccess = new; return OK;
Now it may be that the overhead of parsing .htaccess files just isn't that big and that in many cases a cache would just be a waste of memory. While I doubt that, this is testable. To get a best-case for caching we could test just something like:
/var/www/foo.html /var/www/.htaccessComparing this to the version that has the configuration options in a <Directory> block should tell us the maximum we could expect to gain from caching.
Update 2013-02-08: I ran some tests on the above configuration with ab, but the variance was so extreme (some runs of 10k requests averaged 4k/s while others averaged 500/s) that I think something else is wrong. I tried running longer tests with more requests but ab consistently died with apr_socket_recv: Operation timed out (60) before finishing the test.
Comment via: google plus, facebook