2010-11-17 92 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秒?

相关问题