URL处理——PHP与Apache重写


URL handling – PHP vs Apache Rewrite

目前我让一个PHP脚本来处理所有传入的URL。然后,这个PHP脚本解析URL并加载该URL的特定处理程序。像这样:

if(URI === "/")
{
    require_once("root.php");
}
else if(URI === "/shop")
{
    require_once("shop.php");
}
else if(URI === "/contact")
{
    require_once("contact.php");
}
...
else
{
    require_once("404.php");
}

现在,我一直在想,这实际上是非常低效的,一旦我的网站被更频繁地访问,就会需要大量不必要的处理能力。所以我想,为什么不在Apache中使用mod_rewrite,让Apache直接加载PHP脚本:

RewriteRule ^$ root.php [L]
RewriteRule ^shop$ shop.php [L]
...

然而,因为我有很多这样的URL,我只想在真正值得的时候做出改变

所以,我的问题是:什么选择更好(效率方面和其他方面(,为什么?

顺便说一句,我绝对想保留URL方案,而不是简单地让脚本通过其实际文件名(something.php(进行访问。

所以,我的问题是:什么选择更好(效率方面和其他方面(,为什么?

如果每个资源都必须运行基于PHP的检查,正如您在评论中所说:

有些资源只对登录用户可用,所以我可以先检查cookie和登录状态,然后用readfile((为它们提供服务。

那么您确实可以使用PHP端逻辑来处理一些事情:无论如何都要启动一个PHP实例,这使得在Apache中解析URL的性能改进在很大程度上没有意义。

如果您有而不需要任何会话或其他PHP侧检查的静态资源,那么如果可能的话,您绝对应该在.htaccess文件中处理路由,因为您避免为每个资源启动单独的PHP进程。但在你的情况下,这不适用。

提高性能的一些想法:

  • 考虑是否真的每个资源都需要通过基于PHP的身份验证进行保护。样式表或某些图像是否可以不公开,从而节省性能密集型PHP进程?

  • 尝试将资源缩小为尽可能少的文件,例如将所有样式表缩小为一个,并使用CSS精灵来减少图像的数量。

  • 我听说nginx可以更好地处理这种特定的场景——至少我听说它可以非常有效地处理身份验证检查完成后的文件传递,而不必依赖PHP的readfile()

PHP方法是正确的,但它需要一些改进。

$file = $uri.".php";
if (!is_file($file)) { header("Status: 404 Not Found"); require_once(404.php); die(); }
require_once($uri.".php");

好的,就效率而言,带有regexp的htaccess版本和带有单个regexp的php版本以及匹配文件的加载将比许多htaccess规则或许多php-if-else 更快

除此之外,在这种情况下,htaccess和php的方式在效率上应该相似,使用htaccess(消除php中的一个需求(

可能收效甚微
RewriteRule ^([a-z]+)$ $1.php [L]

并将CCD_ 2重命名为CCD_。