【问题标题】:Can a header() redirect go before the rest of the PHP script executes可以在 PHP 脚本的其余部分执行之前进行 header() 重定向吗
【发布时间】:2011-04-14 10:10:11
【问题描述】:

我正在用 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());

我已经对其进行了测试,它确实在数据库中插入了信息。但是,我主要担心的是如果服务器运行缓慢并且 header() 函数在插入发生之前完成,那么脚本是否会结束而不在数据库中插入信息。

或者无论如何脚本都会完成?

【问题讨论】:

    标签: php mysql redirect


    【解决方案1】:

    如果你不想运行:

    header('..');
    exit;
    

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

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

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

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

    【讨论】:

    • 看起来最后一个是 OP 要求的
    • 肯定ignore_user_abort()应该在header()之前?
    • @Hammerite:为答案添加了一些背景。
    【解决方案2】:

    是的。重定向可以去之前。
    不,你不能保证它总是会在数据库中插入信息。你根本不能依赖它。

    【讨论】:

    • 只是试图让访问者尽可能短地等待重定向。
    • @Mark 他们还要等多久?半小时?
    • 当您尝试进行销售时,每一秒都很重要。
    • @Mark a 整秒?你是在 IBM XT 上运行你的服务器吗?
    • 抱歉,当您尝试进行销售时,应该阅读每一秒的“分数”。
    猜你喜欢
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 2010-10-01
    • 1970-01-01
    • 2013-01-28
    相关资源
    最近更新 更多