Avatar billede pcdl Nybegynder
07. april 2008 - 14:37 Der er 7 kommentarer og
1 løsning

Php programmer + mysql ekspert søges

Hej har en søgerobot og en søgemaskine som jeg godt vil have en til at optimere da den ikke kører specielt hurtigt mysql serveren inde fra phpmyadmin giver en responstid på 0.00001 sekunder mens scriptet giver en respons tid på 1 sekund så ville være meget taknemmelig hvis en havde tiden og lysten til at hjælpe
Avatar billede olebole Juniormester
07. april 2008 - 17:56 #1
<ole>

Hvad er spørgsmålet?  :)

/mvh
</bole>
Avatar billede pcdl Nybegynder
08. april 2008 - 10:35 #2
spørgsmålet er om der er en som kan hjælpe mig med at optimere mit php script så det søger lidt hurtigere
Avatar billede w13 Novice
08. april 2008 - 10:39 #3
Kan vi se koden?
Avatar billede pcdl Nybegynder
08. april 2008 - 10:42 #4
ja det kan du godt
Avatar billede pcdl Nybegynder
08. april 2008 - 10:43 #5
///#### Search.php ####///
<?php
error_reporting(E_ALL);
$include_dir = "./include";
include ("$include_dir/commonfuncs.php");

if (isset($_GET['query']))
    $query = $_GET['query'];
if (isset($_GET['search']))
    $search = $_GET['search'];
if (isset($_GET['domain']))
    $domain = $_GET['domain'];
if (isset($_GET['type']))
    $type = $_GET['type'];
if (isset($_GET['catid']))
    $catid = $_GET['catid'];
if (isset($_GET['category']))
    $category = $_GET['category'];
if (isset($_GET['results']))
    $results = $_GET['results'];
if (isset($_GET['start']))
    $start = $_GET['start'];
if (isset($_GET['adv']))
    $adv = $_GET['adv'];
   
   
$include_dir = "./include";
$template_dir = "./templates";
$settings_dir = "./settings";
$language_dir = "./languages";


require_once("$settings_dir/database.php");
require_once("$language_dir/en-language.php");
require_once("$include_dir/searchfuncs.php");
require_once("$include_dir/categoryfuncs.php");


include "$settings_dir/conf.php";

include "$template_dir/$template/header.html";
include "$language_dir/$language-language.php";


if ($type != "or" && $type != "and" && $type != "phrase") {
    $type = "and";
}

if (preg_match("/[^a-z0-9-.]+/", $domain)) {
    $domain="";
}


if ($results != "") {
    $results_per_page = $results;
}

if (get_magic_quotes_gpc()==1) {
    $query = stripslashes($query);
}

if (!is_numeric($catid)) {
    $catid = "";
}

if (!is_numeric($category)) {
    $category = "";
}



if ($catid && is_numeric($catid)) {

    $tpl_['category'] = sql_fetch_all('SELECT category FROM '.$mysql_table_prefix.'categories WHERE category_id='.(int)$_REQUEST['catid']);
}
   
$count_level0 = sql_fetch_all('SELECT count(*) FROM '.$mysql_table_prefix.'categories WHERE parent_num=0');
$has_categories = 0;

if ($count_level0) {
    $has_categories = $count_level0[0][0];
}



require_once("$template_dir/$template/search_form.html");


function getmicrotime(){
    list($usec, $sec) = explode(" ",microtime());
    return ((float)$usec + (float)$sec);
    }



function poweredby () {
    global $sph_messages;?>

    <?php
}


function saveToLog ($query, $elapsed, $results) {
        global $mysql_table_prefix;
    if ($results =="") {
        $results = 0;
    }
    $query =  "insert into ".$mysql_table_prefix."query_log (query, time, elapsed, results) values ('$query', now(), '$elapsed', '$results')";
    mysql_query($query);
                   
    echo mysql_error();
                       
}

switch ($search) {
    case 1:

        if (!isset($results)) {
            $results = "";
        }
        $search_results = get_search_results($query, $start, $category, $type, $results, $domain);
        require("$template_dir/$template/search_results.html");
    break;
    default:
        if ($show_categories) {
            if ($_REQUEST['catid']  && is_numeric($catid)) {
                $cat_info = get_category_info($catid);
            } else {
                $cat_info = get_categories_view();
            }
            require("$template_dir/$template/categories.html");
        }
    break;
    }

include "$template_dir/$template/footer.html";
?>




///#### Searchfuncs.php ####///

<?php

error_reporting(E_ALL ^ E_NOTICE);
   
    function swap_max (&$arr, $start, $domain) {
        $pos  = $start;
        $maxweight = $arr[$pos]['weight'];
        for  ($i = $start; $i< count($arr); $i++) {
            if ($arr[$i]['domain'] == $domain) {
                $pos = $i;
                $maxweight = $arr[$i]['weight'];
                break;
            }
            if ($arr[$i]['weight'] > $maxweight) {
                $pos = $i;
                $maxweight = $arr[$i]['weight'];
            }
        }
        $temp = $arr[$start];
        $arr[$start] = $arr[$pos];
        $arr[$pos] = $temp;
    }

    function sort_with_domains (&$arr) {
        $domain = -1;
        for  ($i = 0; $i< count($arr)-1; $i++) {
            swap_max($arr, $i, $domain);
            $domain = $arr[$i]['domain'];
        }
    }
   
    function cmp($a, $b) {
        if ($a['weight'] == $b['weight'])
            return 0;

        return ($a['weight'] > $b['weight']) ? -1 : 1;
    }

    function addmarks($a) {
        $a = eregi_replace("[ ]+", " ", $a);
        $a = str_replace(" +", "+", $a);
        $a = str_replace(" ", "+", $a);
        return $a;
    }

    function makeboollist($a) {
        global $entities, $stem_words;
        while ($char = each($entities)) {
            $a = eregi_replace($char[0], $char[1], $a);
        }
        $a = trim($a);

        $a = eregi_replace("&quot;", "\"", $a);
        $returnWords = array();
        $regs = Array();
        while (eregi("(
  • ?)\"([^\"]+)\"", $a, $regs)) {
            if ($regs[1] == '') {
                $returnWords['+s'][] = $regs[2];
                $returnWords['hilight'][] = $regs[2];
            } else {
                $returnWords['-s'][] = $regs[2];
            }
            $a = str_replace($regs[0], "", $a);
        }
        $a = strtolower(eregi_replace("[ ]+", " ", $a));
        $a = trim($a);
        $words = explode(' ', $a);
        if ($a=="") {
            $limit = 0;
        } else {
        $limit = count($words);
        }


        $k = 0;
        $includeWords = array();
        while ($k < $limit) {
            if (substr($words[$k], 0, 1) == '+') {
                $includeWords[] = substr($words[$k], 1);
                if (!ignoreWord(substr($words[$k], 1))) {
                    $returnWords['hilight'][] = substr($words[$k], 1);
                    if ($stem_words == 1) {
                        $returnWords['hilight'][] = stem(substr($words[$k], 1));
                    }
                }
            } else if (substr($words[$k], 0, 1) == '-') {
                $returnWords['-'][] = substr($words[$k], 1);
            } else {
                $includeWords[] = $words[$k];
                if (!ignoreWord($words[$k])) {
                    $returnWords['hilight'][] = $words[$k];
                    if ($stem_words == 1) {
                        $returnWords['hilight'][] = stem($words[$k]);
                    }
                }
            }
            $k++;
        }
        if (isset($returnWords['+s'])) {
            foreach ($returnWords['+s'] as $phrase) {
                $phrase = strtolower(eregi_replace("[ ]+", " ", $phrase));
                $phrase = trim($phrase);
                $temparr = explode(' ', $phrase);
                foreach ($temparr as $w)
                    $includeWords[] = $w;
            }
        }

        foreach ($includeWords as $word) {
            if (!($word =='')) {
                if (ignoreWord($word)) {

                    $returnWords['ignore'][] = $word;
                } else {
                    $returnWords['+'][] = $word;
                }   
            }

        }
        return $returnWords;

    }

    function ignoreword($word) {
        global $common;
        global $min_word_length;
        global $index_numbers;
        if ($index_numbers == 1) {
            $pattern = "[a-z0-9]+";
        } else {
            $pattern = "[a-z]+";
        }
        if (strlen($word) < $min_word_length || (!eregi($pattern, remove_accents($word))) || ($common[$word] == 1)) {
            return 1;
        } else {
            return 0;
        }
    }

    function search($searchstr, $category, $start, $per_page, $type, $domain) {
        global $length_of_link_desc,$mysql_table_prefix, $show_meta_description, $merge_site_results, $stem_words, $did_you_mean_enabled ;
       
        $possible_to_find = 1;
        $result = mysql_query("select domain_id from ".$mysql_table_prefix."domains where domain = '$domain'");
        if (mysql_num_rows($result)> 0) {
            $thisrow = mysql_fetch_array($result);
            $domain_qry = "and domain = ".$thisrow[0];
        } else {
            $domain_qry = "";
        }
        if (count($searchstr['+']) == 0) {
            return null;
        }
        $wordarray = $searchstr['-'];
        $notlist = array();
        $not_words = 0;
        while ($not_words < count($wordarray)) {
            if ($stem_words == 1) {
                $searchword = addslashes(stem($wordarray[$not_words]));
            } else {
                $searchword = addslashes($wordarray[$not_words]);
            }
            $wordmd5 = substr(md5($searchword), 0, 1);

            $query1 = "SELECT link_id from ".$mysql_table_prefix."link_keyword$wordmd5, ".$mysql_table_prefix."keywords where ".$mysql_table_prefix."link_keyword$wordmd5.keyword_id= ".$mysql_table_prefix."keywords.keyword_id and keyword='$searchword'";

            $result = mysql_query($query1);

            while ($row = mysql_fetch_row($result)) {   
                $notlist[$not_words]['id'][$row[0]] = 1;
            }
            $not_words++;
        }
        $wordarray = $searchstr['+s'];
        $phrase_words = 0;
        while ($phrase_words < count($wordarray)) {

            $searchword = addslashes($wordarray[$phrase_words]);
            $query1 = "SELECT link_id from ".$mysql_table_prefix."links where fulltxt like '% $searchword%'";
            echo mysql_error();
            $result = mysql_query($query1);
            $num_rows = mysql_num_rows($result);
            if ($num_rows == 0) {
                $possible_to_find = 0;
                break;
            }
            while ($row = mysql_fetch_row($result)) {   
                $phraselist[$phrase_words]['id'][$row[0]] = 1;
            }
            $phrase_words++;
        }
       

        if (($category> 0) && $possible_to_find==1) {
            $allcats = get_cats($category);
            $catlist = implode(",", $allcats);
            $query1 = "select link_id from ".$mysql_table_prefix."links, ".$mysql_table_prefix."sites, ".$mysql_table_prefix."categories, ".$mysql_table_prefix."site_category where ".$mysql_table_prefix."links.site_id = ".$mysql_table_prefix."sites.site_id and ".$mysql_table_prefix."sites.site_id = ".$mysql_table_prefix."site_category.site_id and ".$mysql_table_prefix."site_category.category_id in ($catlist)";
            $result = mysql_query($query1);
            echo mysql_error();
            $num_rows = mysql_num_rows($result);
            if ($num_rows == 0) {
                $possible_to_find = 0;
            }
            while ($row = mysql_fetch_row($result)) {   
                $category_list[$row[0]] = 1;
            }
        }   
        $wordarray = $searchstr['+'];
        $words = 0;
        $starttime = getmicrotime();
        while (($words < count($wordarray)) && $possible_to_find == 1) {
            if ($stem_words == 1) {
                $searchword = addslashes(stem($wordarray[$words]));
            } else {
                $searchword = addslashes($wordarray[$words]);
            }
            $wordmd5 = substr(md5($searchword), 0, 1);
            $query1 = "SELECT distinct link_id, weight, domain from ".$mysql_table_prefix."link_keyword$wordmd5, ".$mysql_table_prefix."keywords where ".$mysql_table_prefix."link_keyword$wordmd5.keyword_id= ".$mysql_table_prefix."keywords.keyword_id and keyword='$searchword' $domain_qry order by weight desc";
            echo mysql_error();
            $result = mysql_query($query1);
            $num_rows = mysql_num_rows($result);
            if ($num_rows == 0) {
                if ($type != "or") {
                    $possible_to_find = 0;
                    break;
                }
            }
            if ($type == "or") {
                $indx = 0;
            } else {
                $indx = $words;
            }

            while ($row = mysql_fetch_row($result)) {   
                $linklist[$indx]['id'][] = $row[0];
                $domains[$row[0]] = $row[2];
                $linklist[$indx]['weight'][$row[0]] = $row[1];
            }
            $words++;
        }


        if ($type == "or") {
            $words = 1;
        }
        $result_array_full = Array();

        if ($possible_to_find !=0) {
            if ($words == 1 && $not_words == 0 && $category < 1) {
                $result_array_full = $linklist[0]['weight'];
            } else {
                $j= 1;
                $min = 0;
                while ($j < $words) {
                    if (count($linklist[$min]['id']) > count($linklist[$j]['id'])) {
                        $min = $j;
                    }
                    $j++;
                }

                $j = 0;


                $temp_array = $linklist[$min]['id'];
                $count = 0;
                while ($j < count($temp_array)) {
                    $k = 0;
                    $n = 0;
                    $o = 0;
                    $weight = 1;
                    $break = 0;
                    while ($k < $words && $break== 0) {
                        if ($linklist[$k]['weight'][$temp_array[$j]] > 0) {
                            $weight = $weight + $linklist[$k]['weight'][$temp_array[$j]];
                        } else {
                            $break = 1;
                        }
                        $k++;
                    }
                    while ($n < $not_words && $break== 0) {
                        if ($notlist[$n]['id'][$temp_array[$j]] > 0) {
                            $break = 1;
                        }
                        $n++;
                    }               

                    while ($o < $phrase_words && $break== 0) {
                        if ($phraselist[$n]['id'][$temp_array[$j]] != 1) {
                            $break = 1;
                        }
                        $o++;
                    }
                    if ($break== 0 && $category > 0 && $category_list[$temp_array[$j]] != 1) {
                        $break = 1;
                    }

                    if ($break == 0) {
                        $result_array_full[$temp_array[$j]] = $weight;
                        $count ++;
                    }
                    $j++;
                }
            }
        }
        $end = getmicrotime()- $starttime;


        if ((count($result_array_full) == 0 || $possible_to_find == 0) && $did_you_mean_enabled == 1) {
            reset ($searchstr['+']);
            foreach ($searchstr['+'] as $word) {
                $word = addslashes($word);
                $result = mysql_query("select keyword from ".$mysql_table_prefix."keywords where soundex(keyword) = soundex('$word')");
                $max_distance = 100;
                $near_word ="";
                while ($row=mysql_fetch_row($result)) {
                   
                    $distance = levenshtein($row[0], $word);
                    if ($distance < $max_distance && $distance <4) {
                        $max_distance = $distance;
                        $near_word = $row[0];
                    }
                }

                if ($near_word != "" && $word != $near_word) {
                    $near_words[$word] = $near_word;
                }

            }
            $res['did_you_mean'] = $near_words;
            return $res;
        }
        if (count($result_array_full) == 0) {
            return null;
        }
        arsort ($result_array_full);


        if ($merge_site_results == 1 && $domain_qry == "") {
            while (list($key, $value) = each($result_array_full)) {
                if (!isset($domains_to_show[$domains[$key]])) {
                    $result_array_temp[$key] = $value;
                    $domains_to_show[$domains[$key]] = 1;
                } else if ($domains_to_show[$domains[$key]] ==  1) {
                    $domains_to_show[$domains[$key]] = Array ($key => $value);
                }
            }
        } else {
            $result_array_temp = $result_array_full;
        }
   
       
        while (list($key, $value) = each ($result_array_temp)) {
            $result_array[$key] = $value;
            if (isset ($domains_to_show[$domains[$key]]) && $domains_to_show[$domains[$key]] != 1) {
                list ($k, $v) = each($domains_to_show[$domains[$key]]);
                $result_array[$k] = $v;
            }
        }

        $results = count($result_array);

        $keys = array_keys($result_array);
        $maxweight = $result_array[$keys[0]];


        for ($i = ($start -1)*$per_page; $i <min($results, ($start -1)*$per_page + $per_page) ; $i++) {
            $in[] = $keys[$i];

        }
        if (!is_array($in)) {
            $res['results'] = $results;
            return $res;
        }

        $inlist = implode(",", $in);


        if ($length_of_link_desc == 0) {
            $fulltxt = "fulltxt";
        } else {
            $fulltxt = "substring(fulltxt, 1, $length_of_link_desc)";
        }

        $query1 = "SELECT distinct link_id, url, title, description,  $fulltxt, size FROM ".$mysql_table_prefix."links WHERE link_id in ($inlist)";

        $result = mysql_query($query1);
        echo mysql_error();

        $i = 0;
        while ($row = mysql_fetch_row($result)) {
            $res[$i]['title'] = $row[2];
            $res[$i]['url'] = $row[1];
            if ($row[3] != null && $show_meta_description == 1)
                $res[$i]['fulltxt'] = $row[3];
            else
                $res[$i]['fulltxt'] = $row[4];
            $res[$i]['size'] = $row[5];
            $res[$i]['weight'] = $result_array[$row[0]];
            $dom_result = mysql_query("select domain from ".$mysql_table_prefix."domains where domain_id='".$domains[$row[0]]."'");
            $dom_row = mysql_fetch_row($dom_result);
            $res[$i]['domain'] = $dom_row[0];
            $i++;
        }



        if ($merge_site_results  && $domain_qry == "") {
            sort_with_domains($res);
        } else {
            usort($res, "cmp");   
        }
        echo mysql_error();
        $res['maxweight'] = $maxweight;
        $res['results'] = $results;
        return $res;
    }

function get_search_results($query, $start, $category, $searchtype, $results, $domain) {
    global $sph_messages, $results_per_page,
        $links_to_next,
        $show_query_scores,
        $mysql_table_prefix,
        $desc_length;
    if ($results != "") {
        $results_per_page = $results;
    }

    if ($searchtype == "phrase") {
      $query=str_replace('"','',$query);
      $query = "\"".$query."\"";
    }

    $starttime = getmicrotime();
        if (substr_count($query,'"')==1){
          $query=str_replace('"','',$query);
        } 
    $words = makeboollist($query);
    $ignorewords = $words['ignore'];

   
    $full_result['ignore_words'] = $words['ignore'];

    if ($start==0)
        $start=1;
    $result = search($words, $category, $start, $results_per_page, $searchtype, $domain);
    $query= stripslashes($query);

    $entitiesQuery = htmlspecialchars($query);
    $full_result['ent_query'] = $entitiesQuery;

    $endtime = getmicrotime() - $starttime;
    $rows = $result['results'];
    $time = round($endtime*100)/100;

   
    $full_result['time'] = $time;
   
    $did_you_mean = "";


    if (isset($result['did_you_mean'])) {
        $did_you_mean_b=$query;
        $did_you_mean=$query;
        while (list($key, $val) = each($result['did_you_mean'])) {
            if ($key != $val) {
                $did_you_mean_b = str_replace($key, "<b>$val</b>", $did_you_mean_b);
                $did_you_mean = str_replace($key, "$val", $did_you_mean);
            }
        }
    }

    $full_result['did_you_mean'] = $did_you_mean;
    $full_result['did_you_mean_b'] = $did_you_mean_b;

    $matchword = $sph_messages["matches"];
    if ($rows == 1) {
        $matchword= $sph_messages["match"];
    }

    $num_of_results = count($result) - 2;
   
   
   
    $full_result['num_of_results'] = $num_of_results;


    if ($start < 2)
        saveToLog(addslashes($query), $time, $rows);
    $from = ($start-1) * $results_per_page+1;
    $to = min(($start)*$results_per_page, $rows);

   
    $full_result['from'] = $from;
    $full_result['to'] = $to;
    $full_result['total_results'] = $rows;

    if ($rows>0) {
        $maxweight = $result['maxweight'];
        $i = 0;
        while ($i < $num_of_results && $i < $results_per_page) {
            $title = $result[$i]['title'];
            $url = $result[$i]['url'];
            $fulltxt = $result[$i]['fulltxt'];
            $page_size = $result[$i]['size'];
            $domain = $result[$i]['domain'];
            if ($page_size!="")
                $page_size = number_format($page_size, 1)."kb";
           
           
            $txtlen = strlen($fulltxt);
            if ($txtlen > $desc_length) {
                $places = array();
                foreach($words['hilight'] as $word) {
                    $tmp = strtolower($fulltxt);
                    $found_in = strpos($tmp, $word);
                    $sum = -strlen($word);
                    while (!($found_in =='')) {
                        $pos = $found_in+strlen($word);
                        $sum += $pos;  //FIX!!
                        $tmp = substr($tmp, $pos);
                        $places[] = $sum;
                        $found_in = strpos($tmp, $word);

                    }
                }
                sort($places);
                $x = 0;
                $begin = 0;
                $end = 0;
                while(list($id, $place) = each($places)) {
                    while ($places[$id + $x] - $place < $desc_length && $x+$id < count($places) && $place < strlen($fulltxt) -$desc_length) {
                        $x++;
                        $begin = $id;
                        $end = $id + $x;
                    }
                }

                $begin_pos = max(0, $places[$begin] - 30);
                $fulltxt = substr($fulltxt, $begin_pos, $desc_length);

                if ($places[$begin] > 0) {
                    $begin_pos = strpos($fulltxt, " ");
                }
                $fulltxt = substr($fulltxt, $begin_pos, $desc_length);
                $fulltxt = substr($fulltxt, 0, strrpos($fulltxt, " "));
                $fulltxt = $fulltxt;
            }

            $weight = number_format($result[$i]['weight']/$maxweight*100, 2);
            if ($title=='')
                $title = $sph_messages["Untitled"];
            $regs = Array();

            if (strlen($title) > 80) {
                $title = substr($title, 0,76)."...";
            }
            foreach($words['hilight'] as $change) {
                while (@eregi("[^\>](".$change.")[^\<]", " ".$title." ", $regs)) {
                    $title = eregi_replace($regs[1], "<b>".$regs[1]."</b>", $title);
                }

                while (@eregi("[^\>](".$change.")[^\<]", " ".$fulltxt." ", $regs)) {
                    $fulltxt = eregi_replace($regs[1], "<b>".$regs[1]."</b>", $fulltxt);
                }
                $url2 = $url;
                while (@eregi("[^\>](".$change.")[^\<]", $url2, $regs)) {
                    $url2 = eregi_replace($regs[1], "<b>".$regs[1]."</b>", $url2);
                }
            }


            $num = $from + $i;

            $full_result['qry_results'][$i]['num'] =  $num;
            $full_result['qry_results'][$i]['weight'] =  $weight;
            $full_result['qry_results'][$i]['url'] =  $url;
            $full_result['qry_results'][$i]['title'] =  $title;
            $full_result['qry_results'][$i]['fulltxt'] =  $fulltxt;
            $full_result['qry_results'][$i]['url2'] =  $url2;
            $full_result['qry_results'][$i]['page_size'] =  $page_size;
            $full_result['qry_results'][$i]['domain_name'] =  $domain;
            $i++;
        }
    }



    $pages = ceil($rows / $results_per_page);
    $full_result['pages'] = $pages;
    $prev = $start - 1;
    $full_result['prev'] = $prev;
    $next = $start + 1;
    $full_result['next'] = $next;
    $full_result['start'] = $start;
    $full_result['query'] = $query;

    if ($from <= $to) {

        $firstpage = $start - $links_to_next;
        if ($firstpage < 1) $firstpage = 1;
        $lastpage = $start + $links_to_next;
        if ($lastpage > $pages) $lastpage = $pages;

        for ($x=$firstpage; $x<=$lastpage; $x++)
            $full_result['other_pages'][] = $x;

    }

    return $full_result;

}


?>
Avatar billede w13 Novice
08. april 2008 - 10:44 #6
750 linjer kode er nok lige i overkanten af, hvad jeg kan overskue at sætte mig ind i.
Sorry. =)
Avatar billede pcdl Nybegynder
08. april 2008 - 10:49 #7
ok bare iorden :)
Avatar billede pcdl Nybegynder
21. juni 2008 - 15:29 #8
lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester