2010-09-19 30 views
1

我正在PHP中编写一个重定向脚本,它将插入有关单击MySQL数据库的信息。在执行PHP脚本的其余部分之前,可以重定向头()重新定向

如果在插入前放置header()函数,数据库是否会始终插入信息?我想这样做,尽可能快地重定向。

$location = "Location: http://www.example.com"; 
header($location); 

$sql = "INSERT INTO tracking (info) VALUES ('$info')"; 
$result = @mysql_query($sql, $con) or die(mysql_error()); 

我测试了它,它确实在数据库中插入了信息。然而,我主要担心的是,如果服务器运行缓慢并且header()函数在插入前完成,那么脚本最终不会在数据库中插入信息。

或者脚本是否会完成?

回答

6

如果你什么都不想要运行:

header('..'); 
exit; 

如果你想有理由确信,其余运行:

header('..'); 
ignore_user_abort(true); 

其实,301的& 302的可包含一个机构按HTTP定义(该措辞是“除非请求方法是HEAD,否则响应实体应该包含一个超链接到新URI的简短超文本注释。”),事实上如果您的浏览器支持它,您可以ñ只是(暂时)禁用重定向并观看正在呈现的实际页面。浏览器是否会在标题之后立即执行重定向,或等待整个请求完成,取决于用户代理本身。它会根据我的经验等待所有的头文件(例如cookie头文件),所以在初始重定向头文件之前还是之后调用它并没有什么区别,但要确保在任何内容/主体之前发送它。

ignore_session_abort()的使用是有限制的,通常网络服务器本身的超时,以及因网络服务器本身的设置而断开连接。如果你有一个需要花费很多时间的进程,当它没有进行任何HTTP通信时,你不应该让webserver进程忙碌。在这种情况下,像齿轮人员这样的异步工作系统可能更适合您的需求。

+0

看起来像最后一个是OP请求 – 2010-09-19 20:35:57

+0

'ignore_user_abort()'应该在'header()'之前吗? – Hammerite 2010-09-19 21:07:36

+0

@Hammerite:给答案增加了一些背景。 – Wrikken 2010-09-19 21:30:27

1

是的。重定向可以在之前。不,你不能保证它总是将信息插入到数据库中。你根本无法依靠这个。

+1

只是试图让游客等待尽可能短的重定向。 – Mark 2010-09-19 20:32:11

+0

@Mark他们需要等多久?半个小时? – 2010-09-19 20:35:20

+0

每当你试图出售时都很重要。 – Mark 2010-09-19 20:41:10