Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么我的301重定向要花这么长时间?_Php_Header_Location_Redirect - Fatal编程技术网

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

Php 为什么我的301重定向要花这么长时间?,php,header,location,redirect,Php,Header,Location,Redirect,为了加速我的网站,我花了很长时间,我发现重定向有问题:目前我的index.php通过php标题位置301永久重定向处理所有主页重定向:website.com>website.com/en/home和website.dewebsite.de/home等等(这个多语言网站大约需要20秒)重定向需要200到6000毫秒。看看瀑布吧 在那之后,页面在霹雳般的瞬间加载! 你不认为这是浪费时间吗?服务器一直在做什么? 经过仔细检查,我最好的猜测是:它正在洗衣服 为了这个,我几乎要放弃PHP了! 非常欢迎任何

为了加速我的网站,我花了很长时间,我发现重定向有问题:目前我的index.php通过php标题位置301永久重定向处理所有主页重定向:
website.com
>
website.com/en/home
website.de
website.de/home
等等(这个多语言网站大约需要20秒)重定向需要200到6000毫秒。看看瀑布吧

在那之后,页面在霹雳般的瞬间加载! 你不认为这是浪费时间吗?服务器一直在做什么? 经过仔细检查,我最好的猜测是:它正在洗衣服

为了这个,我几乎要放弃PHP了! 非常欢迎任何和所有关于我的困惑问题的线索+1

A.给定事实:Apache/2.0.54 Fedora,PHP5.2.9。没有数据库:只有包含大约15个PHP的平面PHP文件,用页眉和页脚完成我的页面)。YSlow等级:92/100!良好的页面速度:93/100!javascript和css尽可能地结合在一起。缓存控件似乎也设置得很好(通过等级证明)。100分中的7分缺失了什么:不使用Keep Alive(超出我在共享主机中的控制范围,不使用内容交付网络。我可以接受缺失的7分,但这是对速度的重大打击

B.此外:我最近在这里得到了很好的见解,我应该通过htacces使用url重写。我明白了这一点,但是,也许这里还有一些错误,我应该在继续讨论更难理解的apache正则表达式语法之前纠正

C.更快的方法:当我php
包含
预期的主页时,而不是重定向,然后所有内容都会快速加载,但url不会被重写:它位于浏览器栏上的website.com上,而我希望在包含它后成为website.com/en/home。php是否可以这样做?包括并更改url的当前地址

结论:您可以使用index.php或使用.htaccess.Sofar从我的测试中重定向(来自下面的genius答案!谢谢大家!)后者在速度上似乎无与伦比:重定向比php重定向快得多!将重定向缩短到比第一次dns查找更短的时间


如果确实是标题需要花费时间,那么您的JS/CSS/HTML就无关紧要了

您可以在
.htaccess
中进行转发

RewriteEngine On
RewriteRule ^$ en/home [R=301]
这实际上会发送相同的头,但不会首先调用PHP引擎来执行:)

更新
仔细观察,我觉得您的
en/home
页面下载时间较长。

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

更新


只要看看亚历克斯的最新消息,他似乎是正确的。时间就在/en/主页上。

该死,我讨厌被这种问题缠住。你需要消除一些变量

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

<?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
您是否尝试过从其他机器或世界其他地方执行相同的请求?这可以确认或否认它是否只是您的机器

如果是响应生成,您可以尝试的另一件事是在生产服务器上进行一些黑客分析。我讨厌不得不做这些事情,但有时您的代码只是拒绝在生产服务器上表现,就像它在您的开发环境或登台上表现一样。对生成
/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);

发送标题并不能阻止脚本运行。我必须为瀑布图投票。这里没有一个,不是两个,而是三个手绘圆圈。哦,我的上帝。即时情人节真的吗?如果一个图像太小而无法阅读,我通常会尝试点击它。这真的需要指出吗?:)这一定是我在网上见过的最好的图片之一。
en/home
page开始下载要花更长的时间。延迟的原因可能是PHP或数据库服务器第一次启动。谢谢,我更新了我的问题。你看,这是一个多语言网站,要求每个域都到自己的主页,所以一个所有域到一个主页恐怕是不够的。@Sam啊,是的,我没想到。:)现在我明白了Ignacio的意思,Jeremy:我必须手动停止脚本,因为它不需要继续运行index.php文件的所有其余部分。这是正确的实现吗?:
case“website.bla”:header('HTTP/1.1 301永久移动');标题(“位置:/bla/home”);退出()然后是下一个案例等等。山姆,看起来不错。试一试,看看它是否适合你。顺便说一句,您不需要两次调用header。您可以使用函数的第二个和第三个参数在一次点击中设置重定向的类型,有点像这样:header('Location:/bla/home',true,301)@Sam:这里使用301而不是302有什么原因吗(另外,如果您指定一个位置头,除非您像这里那样明确声明您的HTTP状态,否则n.b.PHP自动默认为302)?看起来你的情况在语义上是302,而不是301。您有一个规范的基本URL(根),3xx将其重定向到当前处理程序。今天,您的CMS是这样的/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);