PHP - 发送HTTP重定向标头后执行昂贵的代码

时间:2012-03-20 21:07:12

标签: php redirect header

我对PHP非常陌生,我目前正在开发一项服务,其中包括短网址,我使用标头重定向设置好了一切:

<?php

if (code_exists($code)) {
    // this code gets url for redirect:
    $url_query = mysql_query("SELECT * FROM urls WHERE code = '".$code."'");
    $url = mysql_result($url_query,0,'url');
    $id = mysql_result($url_query,0,'url_id');

    // this code redirects user
    header("Cache-Control: no-cache, must-revalidate");
    header("Expires: Thu, 1 Jan 1970 00:00:00 GMT");
    header( "HTTP/1.1 301 Moved Permanently" );
    header( "Location: ".$url );

    // this code executes a function, takes 3 - 4 seconds to return
    $affected = dostuff($id);

} else {
    echo "Code Error: ".$code;
}

?>

$affected = dostuff($id);正在调用几个外部API并将结果写入mysql表(通常是100多行)。

问题是因为外部API和添加行需要几秒钟,用户必须在重定向之前等待这一点,这意味着用户体验不佳。

在没有停止执行代码的情况下,有没有办法构建并向用户发送标头?

或者有没有办法'启动'另一个脚本但是传递$id参数?

如果可能的话,我宁愿避免使用CRON工作,因为这会让我感到困惑:)。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

此处有一篇文章:https://www.zulius.com/how-to/close-browser-connection-continue-execution/

简而言之,您需要发送标头告诉浏览器关闭连接,强制HTTP服务器将数据发送到浏览器,并阻止PHP对脚本进行计时。

此方法的缺点是您的一个HTTP工作线程用完了这个请求。有了足够的请求,您可以轻松地耗尽工作线程以便能够处理请求。另一种看待这种情况的方法是,如果有人想要攻击你的服务器,那么调用URL以尽可能快地启动这个过程会很快使你的服务器瘫痪。

答案 1 :(得分:0)

我认为您需要创建工作线程执行该功能,并在完成时更新数据库中的状态或向用户发送电子邮件。之后用户可以回到状态屏幕。