2010-10-25 124 views
1

我把重定向代码放在页面的顶部,下面有引导代码。重定向是否产生了一个不同的进程,使重定向页面进程成为后台进程,或者完全杀死当前进程?在重定向上重定向的页面被处理了吗?

我使用header()进行重定向,但令人惊讶的是,需要数据库连接的header()下面的剩余代码也被执行。这让我好奇。

回答

2

首先,你应该永远不会调用header()就这样,除非你非常肯定的是,Drupal的助手是不恰当的(我从来没有碰到过这样的情况在我10年以上的Drupal开发)

header()将不会调用Drupal中的关闭和其他关闭函数,导致潜在的会话中断,错误的统计信息和损坏的模块(取决于正在调用的关闭)。在这种情况下,套接字和其他底层资源没有关闭,甚至会在某些时候崩溃你的apache服务器(或其他服务器)。

如果您要设置标题,请拨打drupal_set_header()。九次你想要一个重定向标题,在这种情况下,你最好打电话drupal_goto(),这样做会完成所有的关闭,甚至支持目标参数。

在drupal_goto上,所有进程都被终止(请参阅底部的exit()),因此不会保留正在运行的进程。 module_invoke_all('exit')将确保所有模块在关闭它们的插座,连接以及其他方面都有所转机。

+0

我将标题代码放在index.php的顶部。这是否也会导致故障?事实上,我使用这个重定向将网站带到维护页面,因为MySQL服务器需要停止一段时间。 – 2010-10-25 10:01:05

+0

位于index.php的顶部Drupal尚未加载,所以确实需要在其中运行header(),然后调用exit(),/ if /如果真的需要这样做。我不信。你可以简单地把一个叫做index.html的HTML页面放在Drupal根目录下,然后禁用或重命名.htaccess。如果您重定向,Google,书签和服务将遵循重定向,并导致许多不需要的副作用。 – berkes 2010-10-25 12:05:39

0

据我所知,一个进程既参加原始请求,也参加重定向请求。一旦原始请求完成,重定向请求就会被处理。

由于URL重定向技术有很多,我们无法确定,除非您让我们知道您使用的特定URL重定向技术。

0

从我的理解来看,如果直接从apache htaccess文件重定向,那么不会创建新进程。如果使用header()函数,它将响应发送到apache服务器,并且apache重定向页面。在这两种情况下,都没有创建新的流程;但后者在重新定向之前运行php脚本(更昂贵?)。