2015-12-21 103 views
0

我正在構建一個像控制檯一樣工作的網站。我有一個狀態腳本,用於檢查該頁面是否處於脫機狀態,或者您是否被列入黑名單/白名單。我通過在我的數據庫中查找IP來做到這一點。之後,我使用一個開關來指導用戶。我使用javaScript重定向,因爲該網站使用ajax,我無法獲得標題('Location:xxx');與它一起工作(另一個問題)。優化MySqli請求

當我使用狀態頁面運行該站點時,它的加載速度降低了一倍,並且每次用戶使用命令時都無法幫助該頁面加載此腳本。

對於如何優化加載速度,您有什麼建議嗎?我爲所有想法開放。謝謝你的時間。

if (!empty($_SERVER['HTTP_CLIENT_IP'])) { 
     $ip = $_SERVER['HTTP_CLIENT_IP']; 
    } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { 
     $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; 
    } else { 
     $ip = $_SERVER['REMOTE_ADDR']; 
}; 

$conn = new MySQLi('localhost', 'xxx', 'xxx', 'xxx'); 

$statusRank = ""; 

$sql = "SELECT enable FROM global WHERE enable = '1' AND setting = 'frontend'"; 
$query = $conn->query($sql) or die ($conn->error); 
if(mysqli_num_rows($query)) { 
    $statusRank = "offline"; 
} 

$sql = "SELECT ip FROM blacklist WHERE ip = '$ip'"; 
$query = $conn->query($sql) or die ($conn->error); 
if(mysqli_num_rows($query)) { 
    $statusRank = "blacklist"; 
} 

$sql = "SELECT ip FROM whitelist WHERE ip = '$ip'"; 
$query = $conn->query($sql) or die ($conn->error); 
if(mysqli_num_rows($query)) { 
    $statusRank = "whitelist"; 
} 

switch ($statusRank) { 
    case "blacklist": 
     ?><script>window.location.replace("include/blacklist.php");</script><?php 
    break; 
    case "whitelist": 
    break; 
    case "offline": 
     ?><script>window.location.replace("include/offline.php");</script><?php 
    break; 
    default: 
}; 
+0

哪一個是加載速度慢的查詢? 「兩次慢」是沒有價值,你可以使用..是毫秒?分鐘?小時?沒有你的表格結構/索引,就沒有機會幫助你。 – Olli

+0

對不起......我從接近瞬間開始,可能會在300-500毫秒左右,當腳本啓用+/- 2秒。 –

回答

1

這裏是從最簡單的開始實施的一些想法:

  • 確保您有在blacklistwhitelist表的ip列的索引。
  • 我不是很熟悉PHP,但你應該使用持久連接。打開數據庫連接是一項昂貴的操作。有關更多詳細信息,請參閱php connection pooling mysql
  • 最後,您可以將三個查詢合併在一起,而不是對行進行計數,只檢查是否找到ip。喜歡的東西:
SELECT 
    CASE WHEN EXISTS 
    (SELECT * FROM global WHERE enable = '1' AND setting = 'frontend') THEN 'T' ELSE 'F' 
    END AS offline, 
    CASE WHEN EXISTS 
    (SELECT * FROM blacklist WHERE ip = '$ip') THEN 'T' ELSE 'F' 
    END AS blacklisted, 
    CASE WHEN EXISTS 
    (SELECT * FROM whitelist WHERE ip = '$ip') THEN 'T' ELSE 'F' 
    END AS whilelisted 
1

閱讀DB曾經爲IP,開始PHP會話,並將結果保存到它。因此,在第二次和隨後的加載中,您從會話中讀取。

我會讓你的選擇是:

SELECT 'blacklisted' FROM blacklist WHERE ip = '$ip' JOIN 
SELECT 'whitelisted' FROM whitelist WHERE ip = '$ip' 

然後你只需要檢查每一行字符串「黑名單」或「白名單」(或B/W較短)。