2010-11-17 20 views
0

J'ai écrit le script PHP suivant pour travailler avec un proxy HTTP pour le filtrage de contenu. Le proxy POST à ​​ce script l'URL du site que l'utilisateur tente de visiter. Le script (évidemment) vérifie le site pour les mots-clés qui devraient être bloqués, puis répond au proxy. Cela prend trop de temps pour naviguer entre les pages avec ceci. Actuellement .... environ 3 minutes. par page.Meilleur moyen d'écrire ceci? Augmenter la vitesse?

Voici ce code:

<?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

Pourquoi est-ce marqué python? – Falmarri

Répondre

0

Le 3mn/page est très douteux, mais la else partie du code:

if (in_array($location, $address)) 

est un goulot d'étranglement en raison du E/S disque et mot-clé correspondant impliqué.

Voir si cela aide (sans cache):

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

C'est un problème avec le proxy lui-même. Il semble ne fonctionner qu'une fois, alors il ne va pas à la page suivante jusqu'à ce que je le redémarre. Je posterai cela dans une autre question. Ce morceau de code a accéléré le temps qu'il a fallu pour le script PHP, donc je vais vous donner celui-ci. –

0

La façon dont vous avez collé, il ressemble à l'appel à ProxyRequest.process (auto) ne se fait pas à l'intérieur de votre méthode de processus.

+0

Désolé ... c'était une erreur lors du collage. Je l'ai corrigé ci-dessus. –

+0

Si vous dites que cela prend environ 3 minutes, regardez si vous gérez les connexions persistantes correctement. – cababunga

1

Avez-vous essayé d'utiliser GET au lieu de POST? Techniquement, ils devraient avoir la même vitesse, mais le proxy pourrait faire quelque chose de bizarre avec POST pour éviter plusieurs requêtes.

Voici un exemple rapide de la façon d'utiliser GET à la place avec urllib: http://docs.python.org/library/urllib.html#examples

Exactement combien de temps est « trop long »? Vous pouvez essayer de le chronométrer par rapport à l'accès au site sans le proxy.

En outre, vous pouvez effectuer d'autres profils pour voir où se trouve le goulot d'étranglement. Est-ce votre script python, votre connexion à Internet, le script PHP ou l'hôte PHP? Le site PHP est-il sur un hôte partagé? Il pourrait être plus vif si vous aviez un dédié ou VPS. Une autre pensée, vous pourriez essayer d'ajouter une mise en cache sur le côté PHP. Si le même utilisateur continue à frapper le ou les mêmes sites, il n'y a aucun sens à interroger la base de données à chaque fois.

+0

Chemin trop long = 3 minutes (ish) par page. J'ai fait quelques tests et j'ai découvert que le problème de vitesse réside dans le script PHP. Oui, c'est sur un serveur d'hébergement partagé. J'aime l'idée de la mise en cache, mais je ne sais même pas par où commencer. Je vais aller de l'avant et supprimer le script Python de mon message original. –

+0

Je demanderais à votre hébergeur s'il fournit memcached, je vais deviner qu'ils ne le font pas, mais s'ils le font, il y a beaucoup de tutoriels sur Internet sur la façon d'implémenter memcached avec PHP. Vous pouvez également essayer cette bibliothèque d'abstraction de base de données (http://adodb.sourceforge.net), car elle vous permet de mettre facilement en cache les requêtes de base de données. Il serait également plus facile à implémenter que memcached. –

+0

Comment avez-vous déterminé que c'était votre script PHP? Je dis toujours que vous devriez essayer de convertir vos deux scripts python/php pour utiliser GET au lieu de POST et voir ce qui se passe. Même si cela ne résout pas le problème, cela vous permettra de chronométrer/modifier votre script PHP directement, via votre navigateur. Voir: http://php.net/manual/en/function.microtime.php pour un exemple de synchronisation d'un script. –

1

$query1/2 et $result1/2 peuvent être écrasées très facilement en les appelant du même nom. Cela ne posera aucun problème. Aussi les vars de résultats mysql sont très lourds.

Pour vérifier si une variable est vide, il existe une fonction native php qui vérifie également si la variable est égale à NULL, '' ou n'est pas définie du tout: empty($var). Je l'utiliserais pour la première partie de votre code au lieu de $var == '' qui n'est pas élégant non plus.

Egalement, mysql_num_rows() renvoie un entier et vous comparez ce résultat avec une chaîne de valeur "1". Je le corrigerais avec: mysql_num_rows($result) == 1.

Nous avons aussi le problème de

echo "deny"; 
    exit; 

Wich peut être remplacé par exit('deny');

Je doute encore qu'une page prend 3 minutes pour charger, peut-être 3 secondes?