写这个更好的方法?增速?

时间:2010-11-17 23:11:20

标签: php mysql post proxy

我编写了以下PHP脚本来使用HTTP代理进行内容过滤。代理向此脚本POST POST用户尝试访问的站点的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";
?>

4 个答案:

答案 0 :(得分:1)

您是否尝试过使用GET而不是POST?从技术上讲,它们应该是相同的速度,但代理可能会使用POST做一些奇怪的事情以防止多个请求。

以下是如何使用GET代替urllib的快速示例: http://docs.python.org/library/urllib.html#examples

“太长了”到底有多长?与访问没有代理的站点相比,您可以尝试计时。

此外,您可能希望进行一些其他分析以查看瓶颈所在的位置。它是你的python脚本,你的互联网连接,PHP脚本或PHP主机? PHP站点是否在共享主机上?如果您有专用或VPS,可能会更快捷。

另一个想法,你可以尝试在PHP端添加一些缓存。如果同一个用户一遍又一遍地访问同一个站点,那么每次查询数据库都没有意义。

答案 1 :(得分: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秒?

答案 2 :(得分:0)

您粘贴它的方式,看起来在您的流程方法中没有完成对ProxyRequest.process(self)的调用。

答案 3 :(得分:0)