Php处理与Apache rewriterrules和RegExp:哪一个更快


Php handling vs Apache RewriteRules and RegExp: which one is quicker?

我已经读过了,但是它没有回答我的问题。

这是我的场景:我一直在开发我自己的框架,这是我引以为傲的(多语言、模板等)。但是我不得不面对一个问题:多语言和模板处理是在Php中完成的。800行代码,分析主机,看在哪里查找,读取模板等等。它很乱,我很确定它效率不高,尽管我没有测试它的效率。它处理了很多数组(array_push(), array_key_exists()等等)

我重写了整个Php文件,现在它创建了自己的"缓存"文件,几乎所有的工作都是由Apache在进入Php文件之前完成的。Php文件只分析_GET中的内容。

但我担心一件事:RegExp快吗?在我以前的Php文件中,我玩了很多array_xx()函数,但绝对没有 Apache rewriterrules 之前。

我不知道RegExp的性能,我不知道Apache rewriterrules和初始化环境变量所需的时间。我经常这样做(见后文)。所以,也许,在这些解释之后,有人会告诉我"没问题,你的RegExp并不复杂,Apache处理得很快",或者"立即停止这个,你可能会遇到RegExp的麻烦"等等。

这是关于"Apache RegExp rewriterrules"answers"Php处理url而不是Apache"的性能的建议和警告。

这里是我所有的RewriteRule,我只是想知道他们是否会减慢我的Apache Webserver 比我以前的Php文件

RewriteMap maprns dbm:/rns.map
RewriteMap mapdps dbm:/dps.map
RewriteMap mapcts dbm:/cts.map
RewriteMap ts dbm:/ts.map
RewriteRule /404.php - [QSA,E=PLOCAL:${ts:www'.}]
RewriteCond %{ENV:PLOCAL} ^default'.([a-zA-Z0-9'-]+)'.$
RewriteRule /404.php - [QSA,E=L:%1,E=PLOCAL:${ts:%1'.}]
RewriteCond %{ENV:PLOCAL} !^$
RewriteCond %{HTTP_HOST} ([a-zA-Z0-9'-]+'.)+([a-zA-Z0-9'-]+)'.+(fr|com|net|org|eu)$
RewriteRule (.*) /404.php?L=%{ENV:L}&Pt=%{ENV:PLOCAL}&Pt_cm=${ts:cm.}&h_static=%{ENV:L}.s.%2.%3 [QSA,L]
RewriteCond %{HTTP_HOST} ((([a-zA-Z0-9'-]+)'.)+)(s|static)'.(([a-zA-Z0-9'-]+'.)+)([a-zA-Z0-9'-]+)'.+(fr|com|net|org|eu)$
RewriteRule (.*) - [QSA,E=L:%3,E=PLOCAL:${ts:%1%5|notfound},E=Pcm:${ts:cm.%5},E=STATIC:1]
RewriteCond %{ENV:PLOCAL} ^$
RewriteCond %{HTTP_HOST} ((([a-zA-Z0-9'-]+)'.)+)(s|static)'.([a-zA-Z0-9'-]+)'.+(fr|com|net|org|eu)$
RewriteRule (.*) - [QSA,E=L:%3,E=PLOCAL:${ts:%1|notfound},E=Pcm:${ts:cm.},E=STATIC:1]
RewriteCond %{ENV:PLOCAL} ^$
RewriteCond %{HTTP_HOST} (([a-zA-Z0-9'-]+)'.)((([a-zA-Z0-9'-]+)'.)+)([a-zA-Z0-9'-]+)'.+(fr|com|net|org|eu)$
RewriteRule (.*) - [QSA,E=L:%2,E=PLOCAL:${ts:%1%3|notfound},E=Pcm:${ts:cm.%3}]
RewriteCond %{ENV:PLOCAL} ^$
RewriteCond %{HTTP_HOST} (([a-zA-Z0-9'-]+)'.)([a-zA-Z0-9'-]+)'.+(fr|com|net|org|eu)$
RewriteRule (.*) - [QSA,E=L:%2,E=PLOCAL:${ts:%1|notfound},E=Pcm:${ts:cm.}]
RewriteCond %{ENV:PLOCAL} ^default'.([a-zA-Z0-9'-]+)'.(([a-zA-Z0-9'-]+'.)+)
RewriteRule (.*) - [QSA,E=L:%1,E=PLOCAL:${ts:%1'.%2|notfound},E=Pcm:${ts:cm.%2}]
RewriteCond %{ENV:PLOCAL} ^default'.([a-zA-Z0-9'-]+)'.$
RewriteRule (.*) - [QSA,E=L:%1,E=PLOCAL:${ts:%1'.|notfound},E=Pcm:${ts:cm.}]
RewriteCond %{ENV:PLOCAL} ^$ [OR]
RewriteCond %{ENV:PLOCAL} notfound
RewriteRule .* - [R=404,L]
RewriteRule (.*) $1?L=%{ENV:L}&Plocal=%{ENV:PLOCAL}&Pcm=%{ENV:Pcm} [QSA]
RewriteCond %{ENV:STATIC} !^$
RewriteRule (.*)('.(css|js|pdf|jpg|jpeg|gif|png)){1}$ $1$2 [QSA,E=EXT:$3]
RewriteCond %{ENV:EXT} (jpg|jpeg|gif|png)
RewriteRule (.*) - [QSA,E=EXT:img]
RewriteCond %{ENV:STATIC} !^$
RewriteCond %{ENV:EXT} !([a-z]+)
RewriteRule .* - [L,R=404]
RewriteCond %{ENV:STATIC} !^$
RewriteCond %{ENV:EXT} (css|js)$
RewriteRule (.*) /%1.php?%1=$1&static=1 [QSA,L]
RewriteCond %{ENV:STATIC} !^$
RewriteCond %{DOCUMENT_ROOT}/%{ENV:PLOCAL}/%{ENV:EXT}%{REQUEST_FILENAME}  -f
RewriteRule  ^(.+) %{DOCUMENT_ROOT}/%{ENV:PLOCAL}/%{ENV:EXT}%{REQUEST_FILENAME} [QSA,L]
RewriteCond %{ENV:STATIC} !^$
RewriteCond %{DOCUMENT_ROOT}/%{ENV:Pcm}/%{ENV:EXT}%{REQUEST_FILENAME}  -f
RewriteRule  ^(.+) %{DOCUMENT_ROOT}/%{ENV:Pcm}/%{ENV:EXT}%{REQUEST_FILENAME} [QSA,L]
RewriteCond %{ENV:STATIC} !^$
RewriteRule .* - [L,R=404]
RewriteRule ^/$ /index.php [QSA,L]
RewriteRule /d-envoyer-lte-par-mail/ /d_envoyer_lte_par_mail.php [QSA,L]
RewriteRule /d-creer-editer/ /d_creer_editer.php [QSA,L]
RewriteRule /d-mail-ver/(.*)/$ /d_mail_ver.php?chaine_vation=$1 [QSA,L]
RewriteRule /d-mail-ver/ /d_mail_ver.php [QSA,L]
RewriteRule /i/lg/$ /i/lg.php [QSA,L]
RewriteRule /i/lg-ver/$ /i/lg_ver.php [QSA,L]
RewriteCond %{HTTP_HOST} ^s'.(.*) [NC]
RewriteRule /contact-([0-9]+)-([0-9]+)-([a-z0-9]+)'.png$ /d_image_telephone.php?no=$1&id=$2&chaine_vation=$3 [QSA,L]
RewriteCond %{HTTP_HOST} ^www'.(.*) [NC]
RewriteRule /d-contact/numero-([0-9]+)-([a-z0-9]+)/$ /d_message.php?id=$1&chaine_vation=$2 [QSA,L]
RewriteRule ^/d-(dtl|ann)/offre/(.*)/$ /d-$1/$2/$3?d_type=1 [QSA,NC]
RewriteRule ^/d-(dtl|ann)/demande/(.*)/$ /d-$1/$2/$3?d_type=2 [QSA,NC]
RewriteRule ^/d-dtl/(.*)/numero-([0-9]+)/$ /d-dtl/?val_ct=$1&id=$2 [QSA,NC,E=ct:${mapcts:$1|notfound}]
RewriteRule ^/d-ann/(.*)/numero-([0-9]+)-([a-z0-9]+)/$ /d-ann/?val_ct=$1&id=$2&chaine_ann=$3 [QSA,NC,E=ct:${mapcts:$1|notfound}]
RewriteCond %{ENV:ct} ([0-9]+)
RewriteRule /d-(dtl|ann)/ /d_$1.php?ct=%{ENV:ct} [QSA,NC,L]
RewriteRule ^/d/offres/(rn|dp|ct)/(.*)/$ /d/$1/$2/?d_type=1 [QSA,NC]
RewriteRule ^/d/demandes/(rn|dp|ct)/(.*)/$ /d/$1/$2/?d_type=2 [QSA,NC]
RewriteRule ^/d/(.*)/d-([0-9]+)-a-([0-9]+)/$ /d/$1/$2/?start=$3&end=$4 [QSA,NC]
RewriteRule ^/d/rn/([a-z'-'_0-9]+)/(.*)/$ /d/$2/?val_rn=$1 [QSA,NC,E=rn:${maprns:$1|notfound}]
RewriteRule ^/d/rn/(.*)/$ /d/?val_rn=$1 [QSA,NC,E=rn:${maprns:$1|notfound}]
RewriteRule ^/d/dp/(.*)/$ /d/?val_dp=$1 [QSA,NC,E=dp:${mapdps:$1|notfound}]
RewriteRule ^/d/ct/(.*)/$ /d/?val_ct=$1 [QSA,NC,E=ct:${mapcts:$1|notfound}]
RewriteCond %{ENV:rn} notfound [OR]
RewriteCond %{ENV:dp} notfound [OR]
RewriteCond %{ENV:ct} notfound
RewriteRule .* - [L,R=404]
RewriteCond %{SCRIPT_FILENAME} /d/
RewriteCond %{QUERY_STRING} !start=(.+)
RewriteRule (.*) $1?start=1 [NC,QSA]
RewriteCond %{SCRIPT_FILENAME} /d/
RewriteCond %{QUERY_STRING} !end=(.+)
RewriteRule (.*) $1?end=20 [NC,QSA]
RewriteCond %{ENV:rn} ([0-9]+) [OR]
RewriteCond %{ENV:dp} ([0-9]+) [OR]
RewriteCond %{ENV:ct} ([0-9]+)
RewriteRule /d/ /d_lte.php?rn=%{ENV:rn}&dp=%{ENV:dp}&ct=%{ENV:ct} [QSA,L]
RewriteRule .* - [L,R=404]

这取决于您的服务器,内存等。唯一确定的方法是运行性能基准测试,看看httperf。

主观地说,我可以告诉你,我们在工作中的。htaccess中有大约450行重写规则,虽然重写规则越少越好,但到目前为止,重写规则还不是应用程序的瓶颈(我们每秒处理数千个请求)。

所以,考虑到这一点,我就不会太担心了。在重写规则成为系统中最慢的部分之前,您更有可能遇到未优化的数据库、缓存不足和许多其他问题。

你的重写规则集似乎有点混乱,所以我会尝试花一些时间将其组织成一个更有意义的url结构(并从旧url添加301重定向)。您可以查看常见的HMVC框架(如Kohana、Codeigniter或Symfony)如何处理路由。

为了性能和服务器平台的可移植性,你应该让Apache重写到你的index.php中,然后尝试使用$_SERVER['REQUEST_URI']来减轻你复杂的路径/请求处理到PHP。

我会在PHP中这样做。

$uri = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
$request = parse_url($uri);

然后你可以随意使用$request和提取/处理它。

最好的办法是把它放到apache vhost/httpd配置文件中。然后它只解析一次,只执行,这确实比在。htaccess文件中快!