在执行PHP脚本的其余部分之前,header()重定向是否可以进行

Mar*_*cus 1 php mysql redirect

我正在用PHP编写一个重定向脚本,它将在MySQL数据库中插入有关点击的信息.

如果我在插入之前放置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());
Run Code Online (Sandbox Code Playgroud)

我测试了它,它确实在数据库中插入了信息.但是,我主要担心的是,如果服务器运行缓慢且header()函数在插入发生之前完成,脚本将在不插入数据库的情况下结束.

或者脚本会完成吗?

Wri*_*ken 6

如果你不想运行任何东西:

header('..');
exit;
Run Code Online (Sandbox Code Playgroud)

如果你想合理地确定其余的运行:

header('..');
ignore_user_abort(true);
Run Code Online (Sandbox Code Playgroud)

实际上,301和302可以根据HTTP定义包含一个正文(措辞是"除非请求方法是HEAD,否则响应的实体应该包含一个带有指向新URI的超链接的短超文本注释.")事实上,如果您的浏览器支持它,您可以(暂时)禁用重定向并观察正在呈现的实际页面.浏览器是否会在标题之后立即执行重定向,或者等待整个请求完成,取决于用户代理本身.它会在我的经验中等待所有标题(例如cookie标题),因此无论是在初始重定向标题之前还是之后调用它都没有区别,但请确保在任何内容/正文之前发送它.

ignore_session_abort()对网络服务器本身的常规超时使用有限制,并且由于网络服务器本身的设置而导致的断开连接也适用.如果您的进程需要花费大量时间,那么当它没有进行任何HTTP通信时,您不应该让Web服务器进程保持忙碌状态.在这种情况下,像gearman这样的异步作业系统可能更适合您.