Лучший способ написать это?Увеличить скорость? - PullRequest
0 голосов
/ 18 ноября 2010

Я написал следующий 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";
?>

Ответы [ 4 ]

1 голос
/ 21 ноября 2010

$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 секунды?

1 голос
/ 18 ноября 2010

Вы пытались использовать GET вместо POST? Технически они должны иметь одинаковую скорость, но прокси может делать что-то странное с POST, чтобы предотвратить несколько запросов.

Вот краткий пример использования GET вместо urllib: http://docs.python.org/library/urllib.html#examples

Точно, как долго это "слишком долго"? Вы можете попробовать рассчитать время по сравнению с доступом к сайту без прокси.

Кроме того, вы можете захотеть сделать другое профилирование, чтобы увидеть, где находится узкое место. Это ваш скрипт на python, ваше подключение к интернету, скрипт PHP или хост PHP? Находится ли сайт PHP на общем хосте? Это может быть быстрее, если у вас есть выделенный или VPS.

Еще одна мысль, вы можете попробовать добавить кеширование на стороне PHP. Если один и тот же пользователь продолжает посещать одни и те же сайты снова и снова, нет смысла каждый раз запрашивать базу данных.

0 голосов
/ 18 ноября 2010

3 минуты / страница весьма сомнительны, но часть кода else:

if (in_array($location, $address))

является узким местом из-за дискового ввода-вывода и соответствия ключевых слов.

Проверьте, поможет ли это (без кэширования):

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 голосов
/ 18 ноября 2010

Как вы его вставили, похоже, что вызов ProxyRequest.process (self) не выполнен внутри вашего метода процесса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...