首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >写这个更好?提速?

写这个更好?提速?
EN

Stack Overflow用户
提问于 2010-11-17 23:11:20
回答 4查看 196关注 0票数 0

我编写了以下PHP脚本来使用HTTP代理进行内容过滤。代理将用户试图访问的站点的URL发布到此脚本。脚本(显然)检查站点中应该被阻止的关键字,然后响应代理。用这个在页面之间导航需要太长时间。目前..。大约3分钟。每页。

这里是代码:

代码语言:javascript
复制
<?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";
?>
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-11-18 01:32:48

3分钟/页非常可疑,但是代码的else部分:

代码语言:javascript
复制
if (in_array($location, $address))

是由于磁盘I/O和关键字匹配造成的瓶颈。

看看这是否有帮助(没有缓存):

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2010-11-18 00:29:40

你试过用GET代替POST吗?从技术上讲,它们应该是相同的速度,但是代理可能对POST做了一些奇怪的事情,以防止多个请求。

下面是一个关于如何在urllib中使用GET的快速示例:http://docs.python.org/library/urllib.html#examples

到底有多长“太长了”?与不使用代理访问站点相比,您可以尝试对其进行计时。

另外,您可能需要做一些其他的分析来查看瓶颈所在。是您的python脚本、您与internet的连接、PHP脚本还是PHP主机?PHP站点是否位于共享主机上?如果您有一个专用的或VPS,它可能会更快。

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

票数 1
EN

Stack Overflow用户

发布于 2010-11-21 14:42:51

通过使用相同的名称调用$query1/2$result1/2,可以非常容易地覆盖它们。这根本不会造成任何问题。另外,mysql的结果vars非常重。

要检查变量是否为空,还有一个php本机函数,它还检查变量是否等于NULL,'',或者根本没有设置:empty($var)。我会将它用于代码的第一部分,而不是不优雅的$var == ''

另外,mysql_num_rows()返回一个整数,您正在将该结果与值为"1“的字符串进行比较。我会用:mysql_num_rows($result) == 1纠正它。

我们也有一个问题

代码语言:javascript
复制
  echo "deny";
  exit;

可以用exit('deny');代替wich

我仍然怀疑一个页面需要3分钟才能加载,也许3秒?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4210166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档