获取用户IP并将其插入数据库而不会延迟

时间:2013-04-14 08:04:22

标签: php mysql

我正在我的索引页面上记录IP,这是大多数人将访问的页面。我想记录IP的统计数据。所有信息都进入MySQL数据库。我的问题是滞后。

为我生成页面大约需要一秒钟。我希望它尽可能快,并且服务器连接到数据库并插入日志。现在(我相信)用户进入索引页面,在整个页面加载之前,我的脚本被执行,它连接到数据库并插入数据。因此用户必须等待一秒钟才能插入数据。我希望用户访问该页面,然后将数据插入到数据库中。

这是我的代码。

的index.php

$ip = $_SERVER['REMOTE_ADDR'];
if(substr($ip,0,4) != "192."){ //Don't log my local IP
    $page = $_SERVER['PHP_SELF']; 
    include("ext/functions.php"); 
    logger($page,$ip);
}

的functions.php

<?php 
function logger($page, $ip){ 
    $logr = mysqli_query(mysqli_connect($host, $user, $pass,$statDB),
    "INSERT INTO logs (page, DATE, ip) VALUES ('$page', NOW(), '$ip')"); 
}
?>

2 个答案:

答案 0 :(得分:0)

你可以在完全加载页面后使用jquery来完成它:

创建一个php页面并将你的php / mysql代码存储到其中,如“storeip.php”

然后只需下载并将jquery库插入索引页面,如:

<script src="scripts/jquery.min.js" type="text/javascript"></script>

并使用以下代码:

<script type="text/javascript">
$(document).ready(function(){
var ip = "<? echo $_SERVER['REMOTE_ADDR']; ?>";
var page = "<? echo $_SERVER['PHP_SELF']; ?>";

$.post("storeip.php","ip="+ip+"&page="+page);
});
</script>

这样您就可以在“storeip.php”文件中管理发布的“ip”和“page”变量

答案 1 :(得分:0)

您可以刷新输出缓冲区,以便用户可以看到实际页面,然后执行插入。您是否真的能够这样做取决于您的实际实现,但是如果它很简单,您可以将代码放在脚本的最末端,并且在它执行之前:

ob_flush();
flush();
session_write_close();  //optional; it will allow your users to navigate away before the slow operation is complete (if you are using sessions)
//your logging code goes here
  • 您可能需要在脚本开头调用ob_start();
  • 这样只会让您的页面显示更快,不会加快加载速度(加载图标仍会显示)

在另一个注释中,正如其他人所提到的那样,对于一个简单的操作只需一秒,因为这太多了。你必须试着看看为什么会这么久。首先,检查是连接还是查询本身。在后一种情况下,如果日志表太大,则必须考虑:

  • 删除表上的任何(或所有)索引。索引适合读取,但可以减慢写入速度,因此如果您将此表主要用于写入,则应重新考虑其结构。
  • 重新考虑您正在使用的table engine。不同的表类型具有不同的性能特征;例如,查看archive