.htaccess mod_rewrite performance

Я много искал в SOF о .htaccess и mod_rewrite, и я хочу, чтобы производительность была более быстрой:

RewriteRule ^([a-z0-9]+)/?$ index.php?id=$1 [NC,L]
RewriteRule ^(.*)/?$ index.php?id=$1 [NC,L]
RewriteRule ^([^/]*)/?$ index.php?id=$1 [NC,L]

поскольку первый принимает только буквы и цифры, делает ли он быстрее выполнение?

Ответы

Ответ 1

Если вы сомневаетесь, проверьте это. Я настраиваю тестовый сервер под управлением Ubuntu 2011.10 с Apache2 и использовал приложение для тестирования осадной нагрузки для выполнения 3 тестов. Тест выполнялся в течение 1 минуты (или до 5000 сбоев) с 50 одновременными пользователями, запрашивающими "/index.html"

В тесте # 1 использовалась следующая конфигурация правила перезаписи:

RewriteEngine on
RewriteRule ^([a-z0-9]+)/?$ /index.html?id=$1 [NC,L]

Результаты осады:

Transactions:                 300970 hits
Availability:                  98.36 %
Elapsed time:                  57.25 secs
Data transferred:              20.38 MB
Response time:                  0.00 secs
Transaction rate:            5257.12 trans/sec
Throughput:                     0.36 MB/sec
Concurrency:                    9.04
Successful transactions:      300970
Failed transactions:            5009
Longest transaction:            0.02
Shortest transaction:           0.00

Тест № 2 с конфигурацией правила перезаписи:

RewriteEngine on
RewriteRule ^(.*)/?$ /index.html?id=$1 [NC,L]

Результаты:

Transactions:                 225244 hits
Availability:                  97.82 %
Elapsed time:                  42.43 secs
Data transferred:              15.25 MB
Response time:                  0.00 secs
Transaction rate:            5308.60 trans/sec
Throughput:                     0.36 MB/sec
Concurrency:                    8.71
Successful transactions:      225244
Failed transactions:            5009
Longest transaction:            0.18
Shortest transaction:           0.00

Тест № 3 со следующим правилом перезаписи:

RewriteEngine on
RewriteRule ^([^/]*)/?$ /index.html?id=$1 [NC,L]

Результаты:

Transactions:                 210469 hits
Availability:                  97.68 %
Elapsed time:                  39.39 secs
Data transferred:              14.25 MB
Response time:                  0.00 secs
Transaction rate:            5343.21 trans/sec
Throughput:                     0.36 MB/sec
Concurrency:                    8.60
Successful transactions:      210469
Failed transactions:            5009
Longest transaction:            0.02
Shortest transaction:           0.00

Ответ 2

Извините, но ответ IMHO Джейсон демонстрирует, что он не понимает некоторые из основных 101 бенчмаркинга. Спрэд составл ет < 1% с одним образцом. Это сравнение статистически бессмысленно, так как дисперсия выборки бесконечна. Я был бы так же заинтересован в сроках для первого случая, который повторялся три раза, скажем, и от того, что распространялось от этого. Он также фокусируется на неправильных проблемах.

Когда вы strace, что происходит дальше, вы получите лучшее представление о том, что происходит. (Ограничьте дочерние процессы apache до 3 или около того, иначе вам будет нужно многое отслеживать!)

strace  -u www-data -tt -ff -o /tmp/strace $(ps -o "-p %p" h -u www-data) &  

Где-то между 99% и 99,9% накладных расходов здесь накладные расходы файловой системы для зондов lstat и открывает различные файлы, например. все предполагаемые файлы .htaccess на пути к SCRIPT_FILENAME (в случае моих общих служб есть 8 таких пробников) и чтение любых существующих. Самый низкий в иерархии с RewriteEngine On анализируется движком mod_rewrite.

Если вы включите один из более высоких уровней журнала, вы увидите, что выполнение каждой инструкции на тестовой виртуальной машине (включая служебные данные журнала) обычно составляет около 0,1 мсек. Стоимость активации изображения PHP на общей службе suPHP составляет ~ 100 мсек. Стоимость одного "-f" файла, если файл не находится в кеше виртуальной файловой системы, может быть одного порядка. Стоимость чтения файлов script (если услуга не включена в кеш-память Opcode), особенно для приложения, такие как Mediawiki или Wordpress, могут занимать секунду или больше, опять же в зависимости от кеширования.

Таким образом, действительно ли фактические вызовы ap_regcomp и ap_regexec в httpd-2.x.y/server/util_pcre.c занимают 30 мкс или 35 мксек. Бенчмаркинг в качестве упражнения не имеет никакого отношения к этому выбору, так как любые различия во время выполнения зависят от шума выборки. Дело в том, что три варианта имеют разные смысловые значения. Эрик должен руководствоваться здесь двумя принципами:

  • Он должен выбрать версию, которую он знает, делает то, что хочет.
  • Когда вы сомневаетесь: держите это просто глупо, потому что "умный" может в конечном итоге кусать вас в задницу, и в этом случае просто нет смысла.