2010-11-17 101 views
0

我寫了下面的PHP腳本來處理內容過濾的HTTP代理。代理向此腳本發佈用戶嘗試訪問的網站的URL。該腳本(顯然)檢查該網站的關鍵字應該被阻止,然後迴應代理。用這個在頁面之間導航需要很長的時間。目前....大約3分鐘。每頁。寫這個更好的方法?增速?

這裏是代碼:

<?php 

$location = $_POST['Location']; 
$user = $_POST['User']; 
if($location == "") { 
    die("Invalid Request! Missing Parameter 1!"); 
} 

if($user == "") { 
    die("Invalid Request! Missing Parameter 2!"); 
} 
$con = mysql_connect("MySQL Host", "USER", "PASS") or die(mysql_error()); 
mysql_select_db("DBName", $con) or die(mysql_error()); 
$query = "SELECT `Policy` FROM Subscribe WHERE `Username`='$user'"; 
$result = mysql_query($query) or die(mysql_error()); 
if(mysql_num_rows($result) == "1") { 
    $nothing = "nothing"; 
} else { 
    die("Invalid User!"); 
} 
while($row = mysql_fetch_assoc($result)) { 
    $policy = $row['Policy']; 
} 
if($policy == "0") { 
    echo "allow"; 
    exit; 
} 
if($policy == "4") { 
    $query1 = "SELECT `Address`, `Keyword` FROM Policy WHERE `Owner`='$user'"; 
    $result2 = mysql_query($query1) or die(mysql_error()); 
    while($row = mysql_fetch_assoc($result2)) { 
    $address = explode(',', $row['Address']); 
    $keyword = explode(',', $row['Keyword']); 
    } 
} else { 
    $query2 = "SELECT `Address`, `Keyword` FROM Policies WHERE `Policy`='p".$policy."'"; 
    $result2 = mysql_query($query2) or die(mysql_error()); 
    while($row = mysql_fetch_assoc($result2)) { 
    $address = explode(',', $row['Address']); 
    $keyword = explode(',', $row['Keyword']); 
    } 
} 

if(in_array($location, $address)) { 
    echo "deny"; 
    exit; 
} else { 
    $meta = get_meta_tags($location); 
    $keywords = $meta['keywords']; 
    $keywords = preg_replace('/\s+/', ' ', $keywords); 
    $keywords = str_replace(' ', '', $keywords); 
    $keywords = explode(',', $keywords); 
    while (list($key, $val) = each($keywords)) { 
    if(in_array($val, $keyword)) { 
     echo "deny"; 
     exit; 
    } 
    } 
    $urlk = explode('.', $location); 
    while (list($key, $val) = each($urlk)) { 
    if(in_array($val, $keyword)) { 
     echo "deny"; 
     exit; 
    } 
    } 
} 
echo "allow"; 
?> 
+0

爲什麼這個標記的python? – Falmarri 2010-11-18 04:25:59

回答

0

的3mins /頁是非常令人懷疑,但代碼的else部分:

if (in_array($location, $address)) 

是一個瓶頸問題,因爲磁盤I/O和關鍵字匹配參與。

看看這有助於(無緩存):

else {  
    $meta=get_meta_tags($location); 
    $keywords=explode(',',str_replace(' ','',$meta['keywords'])); 
    $urlk=explode('.',$location); 
    if (array_intersect($keywords,$keyword) || array_intersect($location,$urlk)) 
     echo 'deny'; 
} 
+0

這是代理本身的問題。它似乎只能工作一次,然後在重新啓動之前它不會進入下一頁。我會在另一個問題上發表。這段代碼大大加快了PHP腳本所花的時間,所以我會把這個給你。 – 2010-11-18 03:24:32

0

貼上圖片的方式,它看起來像調用ProxyRequest.process(個體經營)是不是你的工藝方法完成了。

+0

抱歉...粘貼時發生錯誤。我在上面糾正了它。 – 2010-11-17 23:39:59

+0

如果你說大概需要3分鐘,看看你是否正確處理持續連接。 – cababunga 2010-11-18 00:55:22

1

您是否嘗試過使用GET而不是POST?從技術上講,他們應該是相同的速度,但代理可能會做一些奇怪的事情,以防止多個請求。

這裏有一個如何使用GET與替代的urllib一個簡單的例子: http://docs.python.org/library/urllib.html#examples

究竟有多長是「太長」?與沒有代理訪問網站相比,您可以嘗試計時。

此外,您可能想要進行一些其他分析以查看瓶頸所在的位置。它是你的Python腳本,連接到互聯網,PHP腳本還是PHP主機? PHP網站是否在共享主機上?如果您有專用或VPS,它可能會更快捷。

另一個想法,你可以嘗試在PHP端添加一些緩存。如果同一個用戶一遍又一遍地訪問同一個站點,那麼每次查詢數據庫都沒有意義。

+0

太長時間=每頁3分鐘(ish)。我做了一些測試,發現速度問題在於PHP腳本。是的,它在共享的託管服務器上。我喜歡緩存的想法,但甚至不知道從哪裏開始。我將繼續並從原始帖子中刪除Python腳本。 – 2010-11-18 00:33:53

+0

我會問你的主機,如果他們提供memcached,我會猜測他們沒有,但如果他們這樣做,那麼互聯網上有很多關於如何使用PHP實現memcached的教程。或者,你可以嘗試這個數據庫抽象庫(http://adodb.sourceforge.net),因爲它可以讓你輕鬆地緩存數據庫查詢。它比memcached更容易實現。 – 2010-11-18 00:53:31

+0

你是如何確定它是你的PHP腳本的?我仍然說你應該嘗試轉換你的python/php腳本來使用GET而不是POST並且看看會發生什麼。即使它沒有解決問題,它也可以讓你通過瀏覽器直接調整/調整PHP腳本。有關計時腳本的示例,請參閱:http://php.net/manual/en/function.microtime.php。 – 2010-11-18 01:14:16

1

$query1/2$result1/2可以通過使用相同的名稱調用它們很容易被覆蓋。它根本不會造成任何問題。另外mysql結果變量非常重。

要檢查一個變量是否爲空,有一個php本地函數也檢查變量是否等於NULL,''或根本沒有設置:empty($var)。我將它用於代碼的第一部分而不是$var == '',它既不優雅也不優雅。

另外mysql_num_rows()返回一個整數,並且將該結果與值爲「1」的字符串進行比較。我會更正它:mysql_num_rows($result) == 1

我們還

echo "deny"; 
    exit; 

至極的問題可以被替換exit('deny');

我仍然懷疑一個頁面需要3分鐘加載,也許3秒?

相關問題