2010-11-17 3 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

Почему этот помеченный питон? – Falmarri

ответ

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, поэтому я дам вам это. –

0

Путь вы вставили его, это выглядит как призыв к ProxyRequest.process (я) не выполняется внутри вашего метода процесса.

+0

извините ... это была ошибка при вставке. Я исправил его выше. –

+0

Если вы говорите, что это занимает около 3 минут, посмотрите, правильно ли выполняете постоянные подключения. – cababunga

1

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

Вот краткий пример того, как использовать GET вместо того, чтобы с URLLIB: http://docs.python.org/library/urllib.html#examples

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

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

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

+0

Путь слишком длинный = 3 минуты (ish) на страницу. Я провел некоторое тестирование и обнаружил, что проблема скорости связана с PHP-скриптом. Да, это на общем сервере хостинга. Мне нравится идея кэширования, но даже не знаю, с чего начать. Я продолжу и удалю скрипт Python из моего исходного сообщения. –

+0

Я бы попросил вашего хоста, если они предоставят memcached, я собираюсь догадаться, что они этого не делают, но если они это сделают, есть много учебных пособий в Интернете о том, как реализовать memcached с PHP. Кроме того, вы можете попробовать эту библиотеку абстракции базы данных (http://adodb.sourceforge.net), так как она позволяет легко кэшировать запросы к базе данных. Было бы проще реализовать, чем memcached. –

+0

Как вы определили, что это ваш PHP-скрипт? Я все же говорю, что вы должны попробовать конвертировать оба сценария python/php, чтобы использовать GET вместо POST и посмотреть, что произойдет. Даже если это не решит проблему, это позволит вам напрямую/настроить ваш PHP-скрипт напрямую через ваш браузер. См. Http://php.net/manual/en/function.microtime.php для примера синхронизации сценария. –

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

Смежные вопросы