为什么我的301重定向需要这么长时间?

时间:2010-12-19 00:22:35

标签: php header location redirect

在一个漫长的疲惫的追求加速我的网站,我发现重定向有问题:目前我的index.php通过 PHP标头位置301处理所有主页重定向永久重定向: website.com >> website.com/en/home website.de >> website.de/de/home etcettera etcettera(这个多语种网站大约20个)需要200ms到6000ms才能进行重定向。看看瀑布!

之后,页面在霹雳眨眼之间加载! 你不会说什么浪费时间?什么是服务器这么做? 仔细检查后,我最好的猜测是: ITS做洗衣

我几乎放弃了PHP! 任何和我所有令人费解的问题的线索都非常受欢迎+1

一个。鉴于事实:Apache / 2.0.54 Fedora,PHP 5.2.9。没有数据库:只有大约15个php的平面php文件,包括用页眉和页脚完成我的页面)。 YSlow等级:92/100!好页面速度:93/100! javascript和css尽可能合并。缓存控件似乎设置得很好(由成绩证明)。在100分中的7分中缺少什么:没有使用Keep-Alive(在共享主机中使用我的控制权而不使用内容分发网络。我可以忍受那些缺少7分的人,但这是速度的重大打击!

B中。此外:我最近在这里得到了很好的见解,我应该通过htacces使用url重写。点了,但是,也许这里有一些 else 错误我应该纠正,然后继续为我提供更困难的apache正则表达式语法。

℃。更快的方式:当我在php include预期的主页上,而不是重定向,然后所有加载都很快,但网址没有被重写:它位于浏览器栏上的website.com,而我希望包括它成为website.com/en/home。这可能用PHP吗?要包含+更改网址的当前地址吗?

screenshot

结论:您可以使用index.php或使用.htaccess重定向。从我的测试中得到Sofar(来自下面的天才答案!感谢所有人!)后者在速度上看起来无与伦比:重定向比重定向更快!将重定向减少到比第一次dns查找更短的时间。

see here how to do this correclty for multilingual site

3 个答案:

答案 0 :(得分:7)

该死的,我讨厌陷入这种问题。你需要消除一些变量。

首先我应该指出,在你开始输出内容之前,PHP不会刷新它自己的所有标题(或者,如果output_buffering(?)ini指令设置为x字节,直到输出x字节为止)。因此,以下脚本将不会完成“发送标题”直到最后:

<?php
header('Content-Type: text/pants');
sleep(6);
header('Ding-Ding: time to put the socks in the dryer');
echo "z"; // headers are sent here

如果将exit;echo "wheeeee"; exit;放在该PHP脚本的最顶端,对en / home的调用会发生什么变化?那么当你用一个简单的空文件替换它会发生什么?如果带有exit的php脚本速度很慢但纯文本文件速度很快,那么PHP解释器可能会扮演有趣的bug。如果您仍然得到两者的延迟,那么您已经消除了实际的响应生成(但是如果是这种情况,我仍然会尝试提出一些想法)。

另外,你可以ssh到服务器?如果是这样,您可以尝试从服务器内部搜索同一页面吗?如果你可以没有速度问题,我会看客户端。如果你不能SSH,你可以尝试从PHP做一个请求,虽然我真的不确定这是否会起作用:

<?php
$context = stream_context_create(array(
    'http'=>array(
        // send request headers if you need to
        'header'=>array(
            'Foo: Bar',
            'Bar: Baz',
        ),
    ),
));
$start = microtime(true);
$response = file_get_contents('http://yourserver.com/', null, context);
$end = microtime(true) - $start;
var_dump($end);

// for some bizarre reason, PHP emits this variable into the local scope.
var_dump($http_response_header);

您是否尝试过从其他机器或世界其他地方做同样的请求?这可以确认或否认它是否仅仅是您的机器。

如果是响应生成,您可以尝试的另一件事是在生产服务器上进行一些hack-profiling。我讨厌不得不做这些事情,但有时你的代码只是拒绝在生产服务器上表现,就像它在你的开发环境中或在登台时一样。对生成/en/home

的脚本执行此操作
<?php
// put this at the very top
$rqid = uniqid('', true);
$h = fopen(__DIR__.'/crap.log', 'a');
fwrite($h, $rqid.' [START] '.microtime(true).PHP_EOL);
fclose($h);

// do all that other wonderful stuff, like laundry or making a cup of tea

// put this at the very end
$h = fopen(__DIR__.'/crap.log', 'a');
fwrite($h, $rqid.' [END]   '.microtime(true).PHP_EOL.PHP_EOL);
fclose($h);

针对它运行一些请求,检查以确保'crap.log'正在写入内容(检查权限!!),然后你会有一些数据显示你的脚本中是否有东西这需要进一步调查作为缓慢的原因。

哦,我提到了MySQL索引吗?您在请求期间是否在进行任何查询?您是否已将所有正确的索引添加到表中?

Steven Xu在你的问题评论中提出了一个很好的观点 - 你确定你用来生成瀑布的程序给你提供了很好的信息吗?尝试安装Firebug如果还没有,请点击firefox右下方的小火炬图标,确保“Net”面板已打开,然后重新运行您的请求并查看瀑布是否与您在所使用的程序中看到的结果。

此外,我知道这是一个愚蠢的建议,我道歉,但我认为需要说:你的主机不允许ssh,只使用PHP 4?我会认真考虑另一位主持人。它甚至可以解决这个具体问题。

我会想到更多的东西。

答案 1 :(得分:2)

如果标题确实耗时,那么你的JS / CSS / HTML就无关紧要了。

您可以在.htaccess进行转发。

RewriteEngine On
RewriteRule ^$ en/home [R=301]

这实际上会发送相同的头,但它不会首先调用PHP引擎来执行它:)

更新

仔细观察后,我认为您的en/home页面需要较长的下载时间。

答案 2 :(得分:2)

我认为Ignacio Vazquez-Abrams可能有这样的答案:在调用header()进行重定向之后,需要调用exit()以使PHP脚本执行停止。没有它,脚本将继续执行,将输出发送到浏览器,直到结束。由于浏览器必须等待服务器端脚本结束才能执行可能导致问题的重定向。

<强>更新

刚刚阅读Alex的更新,他似乎是正确的。 / en / home页面是时间。