我对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工作,因为这会让我感到困惑:)。
非常感谢任何帮助。
答案 0 :(得分:1)
此处有一篇文章:https://www.zulius.com/how-to/close-browser-connection-continue-execution/
简而言之,您需要发送标头告诉浏览器关闭连接,强制HTTP服务器将数据发送到浏览器,并阻止PHP对脚本进行计时。
此方法的缺点是您的一个HTTP工作线程用完了这个请求。有了足够的请求,您可以轻松地耗尽工作线程以便能够处理请求。另一种看待这种情况的方法是,如果有人想要攻击你的服务器,那么调用URL以尽可能快地启动这个过程会很快使你的服务器瘫痪。
答案 1 :(得分:0)
我认为您需要创建工作线程执行该功能,并在完成时更新数据库中的状态或向用户发送电子邮件。之后用户可以回到状态屏幕。