Toon posts:

[php] HTML Search Engine

Pagina: 1
Acties:

Verwijderd

Topicstarter
2 weken geleden had ik een topic dat mijn database erg langzaam was.

zie topic:
[topic=431019]

Aan het einde zei ik ook dat ik de nieuwe code zou plaatsen.
Het is me nu gelukt om het veel sneller te laten werken.
Ik heb het getest met 75 pagina's en het duurde ongeveer een halve minuut voordat alles geindexeerd was (in win98). :)
Ik heb de tabel structuur gebruikt die Grum vermelde, met dank dus aan Grum en alle andere tweakers die me geholpen hebben. (Alleen datum is geen date, want ik gebruik de tijd dat het bestand gemaakt is en niet wanneer die erin gezet wordt. Zo kan ik later controleren of het bestand gewijzigd of niet.)

Helaas kan je geen subquery's gebruiken in MySQL dus er staan nog veel query's in.

Zien jullie nog mogelijkheden om het sneller te maken, graag melden ;)
PHP:
1
<?//zet de tijd limiet op oneindig.set_time_limit(0);$dbname="";$user="";$password="";$server="localhost";//Kontakt maken met de database.mysql_connect($server,$user,$password);mysql_select_db($dbname);function BestandenInDir(){    //Global van $HTMLpages maken, zodat deze teruggegeven kan worden na de functie.    Global $HTMLpages;    //beginnende mappen om door te zoeken.    $dir = array("../Web site/2vianen");    //$dir = array("../test");    //telt hoeveel mappen er doorgezocht worden.    $teller = count($dir);    //maak array HTMLpages aan.    $HTMLpages = array();    for($dirI=0; $dirI<$teller; $dirI++)    {        //opent de map.        $opendir = opendir($dir[$dirI]);        //gaat alle bestanden in de map na.        while($filename = readdir($opendir))        {            //gebruikt de . &amp; .. &amp; ws_ftp bestanden niet.            if(($filename!=".")&amp;&amp;($filename!="..")&amp;&amp;($filename!="WS_FTP.LOG"))            {                //als het een map is, word deze toegevoegd aan $dir.                if(is_dir("$dir[$dirI]/$filename"))                {                    array_push($dir, "$dir[$dirI]/$filename");                }                else                {                    //hier worden alleen html &amp; htm bestanden doorgelaten.                    if (eregi(".*\.html$", $filename)||eregi(".*\.htm$", $filename))                    {                        //in deze array komen alle HTML bestanden te staan.                        array_push($HTMLpages, "$dir[$dirI]/$filename");                    }                }            }        }        //dir sluiten.        closedir($opendir);        //telt opnieuw, want er kan een nieuwe map begezet zijn.        $teller = count($dir);    }}function URLcontrole($HTMLpages){    Global $NieuwUrl;    //maak array Nieuw aan.    $NieuwUrl = array();    //Hier worden de doorgelaten pagina's geteld.    $URLteller = count($HTMLpages);        for($i=0; $i<$URLteller; $i++)    {        $url=mysql_query("SELECT Id FROM pages WHERE Url='$HTMLpages[$i]'") or die ("ack! query failed: "        ."<li>errorno=".mysql_errno()        ."<li>error=".mysql_error()        ."<li>query=".$url);        //tellen hoeveel er gevonden zijn.        $rtel = mysql_num_rows($url);        if($rtel==0)        {            //In deze array komen alle nieuwe pagina's te staan.            array_push($NieuwUrl, "$HTMLpages[$i]");        }    }}function SleutelWoorden($url){    //bestand openen en code opslaan.    $bestand = "$url";    $fd = fopen ($bestand, "r");    $code = fread ($fd, filesize ($bestand));    fclose ($fd);    //de titel los in variabele zetten.    preg_match_all ("!\<title>(.+?)</title>!i", $code, $matches);    for ($i=0; $i< count($matches[0]); $i++)        {            $titel = $matches[1][$i];            //alle gevaarlijk tekens backspacen \            $titel = addslashes($titel);        }    $code = ereg_replace("(<head>)(.*)(</head>)", "<head> </head>", $code);    //alleen de teskt tussen </head> en </body> gebruiken.    preg_match_all ("!\</head>(.+?)</body>!i", $code, $matches);    for ($i=0; $i< count($matches[0]); $i++)        {            $code = $matches[1][$i]."\n";        }    $filesize = filesize("$url");    $date = filemtime("$url");    //HTML codes verwijderen    $code = strip_tags($code);    //omshrijving voor onder de zoekresultaten opslaan.    $omschrijving = substr($code, 0, 300);    //alle gevaarlijk tekens backspacen \    $omschrijving = addslashes($omschrijving);    //De url + info opslaan in db.    $query = "insert into pages (Url,Title,Description,Size,Datum) values    ('$url','$titel','$omschrijving','$filesize','$date')";    mysql_query($query) or die ("ack! query failed: "    ."<li>errorno=".mysql_errno()    ."<li>error=".mysql_error()    ."<li>query=".$query);    //De AutoIncrement integer die de url gekregen heeft, wordt hier opgeslagen.    $UrlId = mysql_insert_id();    //Alles onderscore maken    $code = strtolower($code);    //alle gevaarlijk tekens backspacen \    $code = addslashes($code);    //alle vage go-live shit eruit halen    $code = str_replace("&amp;agrave;", "à", $code);    $code = str_replace("&amp;aacute;", "á", $code);    $code = str_replace("&amp;acirc;", "â", $code);    $code = str_replace("&amp;auml;", "ä", $code);    $code = str_replace("&amp;egrave;", "è", $code);    $code = str_replace("&amp;eacute;", "é", $code);    $code = str_replace("&amp;ecirc;", "ê", $code);    $code = str_replace("&amp;euml;", "ë", $code);    $code = str_replace("&amp;igrave;", "ì", $code);    $code = str_replace("&amp;iacute;", "í", $code);    $code = str_replace("&amp;icirc;", "î", $code);    $code = str_replace("&amp;iuml;", "ï", $code);    $code = str_replace("&amp;ograve;", "ò", $code);    $code = str_replace("&amp;oacute;", "ó", $code);    $code = str_replace("&amp;ocirc;", "ô", $code);    $code = str_replace("&amp;ouml;", "ö", $code);    $code = str_replace("&amp;ugrave;", "ù", $code);    $code = str_replace("&amp;uacute;", "ú", $code);    $code = str_replace("&amp;ucirc;", "û", $code);    $code = str_replace("&amp;uuml;", "ü", $code);    $code = str_replace("&amp;yacute;", "ý", $code);    $code = str_replace("&amp;yuml;", "ÿ", $code);    //alle nutteloze tekens zoals o.a. spaties en enters weghalen    $code = preg_replace('![[:space:]]+!', ',', $code);    //code filteren    $filter = array(",de,", ",het,", ",een,", ",van,", ",in,", ",op,", ",en,", ",er,", ",dan,", ",maar,", ",als,", ",heeft,", ",wel,", ",niet,", ",aan,", ",dat,", ",is,", ",je,", ",ik,", ",wij,", ",we,", ",onze,", ",jullie,", ",ons,", ",hij,", ",zij,", ",mij,", ",", ".", "!", "?", ":", "\"", "(", ")", ",werd,", ",kunt,", ",per,", ",geen,", ",te,", ",kan,", ",nog,", ",me,", ",wordt,", ",was,", ",gaan,", ",met,", ",die,", ",hebben,", ",voor,", ",willen,", ",maken,", ",waarna,", ",om,", ",ben,", ",alle,", ",bij,", ",zijn,", ",door,", ",men,", "&amp;#148;", "&amp;#146;", ";", ",wie,", ",ze,", ",-,", ",ja,", ",nee,", ",ook,", ",had,", ",al,", ",mijn,", ",heb,", ",betreft,", ",wat,", ",soms,", ",kontakt,", ",edities,", ",bv,", ",ter,", ",na,", ",blijft,", ",over,", ",komt,", ",vind,", ",vindt,", ",u,", ",der,", ",moeten,", ",worden,", ",mee,", ",heel,", ",gaat,", ",zo,", "/", ",wil,", ",tot,", ",ene,", ",legt,", ",uit,", ",daar,", ",mag,", ",wanneer,", ",spreekt,", ",vanaf,", ",neer,", ",nu,", ",-,", ",_,", ",,", ",deze,", ",doet,", ",ziet,", ",deels,", ",af,", ",ervan,", ",of,", ",andere,", ",waarin,", ",zitten,", ",zorgt,", ",zoals,", ",zich,", ",zélf,", ",gebruikt,", ",zodat,", ",naar,", ",dit,", ",voordat,", ",doordat,");    //de woorden filteren uit filter 1.    for($i=0; $i<count($filter); $i++)    {        $code = str_replace($filter[$i], ",", $code);    }    //van een string een array maken.    $array1 = explode(",", $code);    //alle dubbele waardes eruit halen.    $array2 = array_unique($array1);    //alle lege velden weghalen.    $naarDB = array_values(array_unique($array2));    //Tellen hoeveel items en in de array staan.    $tellerWord = count($naarDB);    for($WordId = 0; $WordId < $tellerWord; $WordId++)    {        //hier word gecontroleerd of het woord in de datbase staat.        $url=mysql_query("SELECT Id FROM keywords WHERE Word='$naarDB[$WordId]'") or die ("ack! query failed: "        ."<li>errorno=".mysql_errno()        ."<li>error=".mysql_error()        ."<li>query=".$url);        //tellen hoeveel er gevonden zijn.        $WordTel = mysql_num_rows($url);        //keyword staat niet in DB.        if($WordTel==0)        {            //Keyword word toegevoegd aan DB.            $query = "insert into keywords (Word) values            ('$naarDB[$WordId]')";            mysql_query($query) or die ("ack! query failed: "            ."<li>errorno=".mysql_errno()            ."<li>error=".mysql_error()            ."<li>query=".$query);            //De AutoIncrement integer die het woord gekregen heeft, wordt hier opgeslagen.            $WordId = mysql_insert_id();            //Combinatie url en woord in DB zetten.            $query = "insert into pagekeywords (PageId,WordId) values            ('$UrlId','$WordId')";            mysql_query($query) or die ("ack! query failed: "            ."<li>errorno=".mysql_errno()            ."<li>error=".mysql_error()            ."<li>query=".$query);        }        else        {            //De ID van het woord opvragen.            while ($row = mysql_fetch_array($url))            {                $WordId2 = $row[Id];            }            //Combinatie url en woord in DB zetten.            $query = "insert into pagekeywords (PageId,WordId) values ('$UrlId','$WordId2')";            mysql_query($query) or die ("ack! query failed: "            ."<li>errorno=".mysql_errno()            ."<li>error=".mysql_error()            ."<li>query=".$query);        }    }}BestandenInDir();URLcontrole($HTMLpages);//Controle of er wel nieuwe pagina's zijn.if(empty($NieuwUrl)){    print "Er zijn geen nieuwe pagina's.";}else{    $tellerUrl = count($NieuwUrl);    //Array $UrlId uitlezen en per pagina function SleutelWoorden oproepen.    for($UrlId = 0; $UrlId < $tellerUrl; $UrlId++)    {        SleutelWoorden($NieuwUrl[$UrlId]);    }    print "Er zijn ".$tellerUrl." pagina's geupload.";}print "<br>einde";?>

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 09-09 20:58

Janoz

Moderator Devschuur®

!litemod

Ook een tijd kun je in een datum veld opslaan.. Als ik jouw was zou ik daar nog heel ff extra naar kijken. Scheelt een hoop werk later waneer je ook werkelijk wat met de datum wilt gaan doen :)


//alle vage go-live shit eruit halen

Is geen go-live shit, maar verplichte html encoding :)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
Op woensdag 20 maart 2002 16:31 schreef Janoz het volgende:
Ook een tijd kun je in een datum veld opslaan.. Als ik jouw was zou ik daar nog heel ff extra naar kijken. Scheelt een hoop werk later waneer je ook werkelijk wat met de datum wilt gaan doen :)
Maar voor nu is dit toch de snelste manier (en ik wilde het snel hebben :)), anders moet ik weer de datums gaan omrekenen. Kan ik dat niet beter doen wanneer ze opgevraagt worden?
Op woensdag 20 maart 2002 16:31 schreef Janoz het volgende:
//alle vage go-live shit eruit halen

Is geen go-live shit, maar verplichte html encoding :)
Krijg ik daar problemen mee, als ik die codes niet gebruik?

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

PHP:
1
<?for($i=0; $i<count($filter); $i++)    {       $code = str_replace($filter[$i], ",",$code);    }?>

Twee Fouten!
Fout 1: Nooit een count of ander calculatie in je expressie gebruiken tenzij het noodzakelijk is voor de logica. Liever een variable declaren die vullen met de calculatie, en dan vergelijken met de variable.
Fout 2: str_replace is fout gebruikt. (kan beter)
PHP:
1
<?$code=str_replace($filter,",",$code); ?>

Werkt net zo goed.... Alleen sneller :)

Loop ook even alle loops van jouw door ik heb zo'n vermoeden dat je te vaak door een loop gaat dan noodzakelijk

Programmer - an organism that turns coffee into software.


Verwijderd

Topicstarter
Bedankt :9

Is het trouwens ook mogelijk om zoiets te maken zonder database? Dat je alles in een tekstfile stopt ofzo...

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 09-09 20:58

Janoz

Moderator Devschuur®

!litemod

Op woensdag 20 maart 2002 16:35 schreef mvkooten het volgende:
Maar voor nu is dit toch de snelste manier (en ik wilde het snel hebben :)), anders moet ik weer de datums gaan omrekenen. Kan ik dat niet beter doen wanneer ze opgevraagt worden?
Zoveel trager is het niet hoor.. De meeste tijd zit in het omzetten van de html naar keywords en dit vervolgens inserten. Het omzetten naar date gebeurt maar 1x per html pagina. Daarnaast heeft MySQL zelf een behoorlijk uitgebreide set functies om een string om te zetten in een datum (zoals alle DBMS)..
Krijg ik daar problemen mee, als ik die codes niet gebruik?
Weet ik niet precies hoor.... Maar wel waneer je je data rechtstreeks uit de DB op een html pagina gooit, maar daarvoor is er html_entities (phpfunctie)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
Je hebt gelijk, dat van die datum zoek ik wel ff uit.

Verwijderd

Topicstarter
Op woensdag 20 maart 2002 16:41 schreef LuCarD het volgende:
Fout 2: str_replace is fout gebruikt. (kan beter)
PHP:
1
<?$code=str_replace($filter,",",$code); ?>

Werkt net zo goed.... Alleen sneller :)
Maar er moet toch een waarde uit een array gehaald worden?
Vandaar die $filter[$i]...

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Op woensdag 20 maart 2002 16:49 schreef mvkooten het volgende:

[..]

Maar er moet toch een waarde uit een array gehaald worden?
Vandaar die $filter[$i]...
Nope....

str_replace accepteert ook array's

Programmer - an organism that turns coffee into software.


Verwijderd

Topicstarter
Op woensdag 20 maart 2002 16:50 schreef LuCarD het volgende:

[..]

Nope....

str_replace accepteert ook array's
Dus ik kan heel die for loop weglaten...

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Yep....

Programmer - an organism that turns coffee into software.


  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Hmmm wat wil je bereiken met deze code
PHP:
1
<?for ($i=0; $i< count($matches[0]); $i++)        {            $titel = $matches[1][$i];            //alle gevaarlijk tekens backspacen \            $titel = addslashes($titel);        }    ?>

Of beter waarom doe je het niet als volgt?
PHP:
1
<?$titel=$matches[1][(count($matches[0])-1)];$titel=addslashes($titel);?>

En ik zie meer van dit soort vage actie's.... ?

Programmer - an organism that turns coffee into software.


Verwijderd

Topicstarter
Op woensdag 20 maart 2002 17:36 schreef LuCarD het volgende:
Hmmm wat wil je bereiken met deze code
PHP:
1
<?for ($i=0; $i< count($matches[0]); $i++)        {            $titel = $matches[1][$i];            //alle gevaarlijk tekens backspacen \            $titel = addslashes($titel);        }    ?>

Of beter waarom doe je het niet als volgt?
PHP:
1
<?$titel=$matches[1][(count($matches[0])-1)];$titel=addslashes($titel);?>

En ik zie meer van dit soort vage actie's.... ?
Idd, ik zal ze er proberen uit te vissen.
Bedankt.

Ik heb het zo gemaakt, omdat ik zo zeker weet dat het werkt.
Als je dan verder gaat, dan vergeet je dit soort slordigheidjes...
Pagina: 1