.htaccess mod_rewrite性能

eri*_*ric 15 performance .htaccess mod-rewrite

我在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]
Run Code Online (Sandbox Code Playgroud)

因为第一个只接受字母和数字,它是否会让它更快执行?

Jas*_*rel 21

如有疑问,请进行测试.我使用Apache2设置了运行Ubuntu 2011.10的测试服务器,并使用攻城负载测试应用程序执行3次测试.测试运行1分钟(或直到5000次失败),50个并发用户请求'/index.html'

测试#1使用以下重写规则配置:

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

围攻的结果:

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
Run Code Online (Sandbox Code Playgroud)

使用重写规则配置测试#2:

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

结果:

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
Run Code Online (Sandbox Code Playgroud)

使用以下重写规则测试#3:

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

结果:

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
Run Code Online (Sandbox Code Playgroud)

  • 使用围攻的+1.你用`ab`获得相同的结果吗? (6认同)
  • 对不起,但是你的整个方法都是-1.看我的对位回应. (2认同)

Ter*_*ryE 9

对不起,但恕我直言杰森的答案表明,他不了解一些基准101的基准.一个样本的差异<1%.这种比较在统计上毫无意义,因为样本方差是无限的.我会对重复三次的第一个案例的时间安排感兴趣,比如说,传播的内容是什么......它也关注错误的问题.

如果您strace正在进行如下操作,那么您将更好地了解它发生了什么.(将apache子进程限制为3个左右,否则你需要跟踪很多!)

strace  -u www-data -tt -ff -o /tmp/strace $(ps -o "-p %p" h -u www-data) &  
Run Code Online (Sandbox Code Playgroud)

这里开销的99%到99.9%之间是探测器的文件系统开销,用于lstat和打开各种文件,例如SCRIPT_FILENAME路径上的所有推定的.htaccess文件(在我的共享服务的情况下,有8个这样的探测),并阅读任何存在的.层次结构中的最低层RewriteEngine Onmod_rewrite引擎解析.

如果您打开其中一个较高的日志级别,则可以看到测试VM上的per语句执行(包括日志开销)通常约为0.1毫秒.在基于suPHP的共享服务上激活PHP映像的成本约为100毫秒.如果文件不在虚拟文件系统缓存中,则单个"-f"文件探测的开销可以是相同的顺序.读取脚本文件的成本(如果服务没有启用Opcode缓存),特别是对于像Mediawiki或Wordpress这样的应用程序,可能需要一秒或更长时间,这取决于缓存.

因此,无论实际通话ap_regcompap_regexechttpd-2.x.y/server/util_pcre.c需要30微秒到35微秒是无关紧要的.作为练习的基准测试与此选择无关,因为任何运行时间差异都在采样噪声中.关键是这三种变体具有不同的语义含义.Eric应该遵循两个原则:

  • 他应该选择他知道做他想要的版本
  • 如果有疑问:保持简单愚蠢,因为"聪明"最终会咬你的屁股,在这种情况下,没有任何意义.