2013-04-14 11 views
0

我在我的索引頁上登錄IP,這是大多數人將訪問的頁面。我想記錄IP的統計信息。所有信息都將進入MySQL數據庫。我的問題是滯後的。獲取用戶IP並將其無延遲插入到數據庫中

大約需要一秒鐘爲我生成頁面。我希望它儘可能快,並且服務器連接到數據庫並插入日誌。現在(我相信)用戶進入索引頁面,在整個頁面加載之前,我的腳本被執行,它連接到數據庫並插入數據。所以用戶必須等待一秒鐘才能插入數據。我希望用戶訪問該頁面,然後將數據插入到數據庫中。

這是我的代碼。

的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

連接到您的數據庫應該花的時間少於一秒鐘。 – ThiefMaster

+0

您可以使用PHP陣列來記錄IP而不是MySQL數據庫。然後,您可以使用cronjob將其插入數據庫,並且無需等待重置數組。 – Megadv

+0

爲什麼不使用Apache訪問日誌,默認情況下幾乎在所有的設置中。 – 2013-04-14 08:45:34

回答

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> 

這樣你就可以管理髮布的「IP」和「頁面」變量在「storeip.php」文件

+0

沒有按照我的想法工作。認爲它消除了滯後(並沒有記錄)。 我谷歌了很長一段時間,發現用「127.0.0.1」替換「localhost」刪除了一些延遲。 我做了一些檢查,使用「本地主機」連接到服務器的空白頁面花費了1.020792秒 「127.0.0.1」花了0.001272秒。 –

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
相關問題