Оптимизация плагина e107

Тема в разделе "Как сделать...", создана пользователем beonard6, 21 авг 2009.

Статус темы:
Закрыта.
  1. beonard6

    beonard6 Постоялец

    Регистр.:
    1 июн 2009
    Сообщения:
    57
    Симпатии:
    3
    попробовал написать плагин "последние сообщения с DC-хаба".
    наваял. работает. красиво. одно но - время исполнения скрипта примерно минута. реально ли как нибудь упростить?
    временно использовал фреймы что б не весь сайт полчаса грузился, по этому на выходе страница скромная:
    PHP:
    <?
    require_once(
    "../../class2.php");
    function 
    unhtmlentities ($string)
    {
        
    $trans_tbl get_html_translation_table (HTML_ENTITIES);
        
    $trans_tbl array_flip($trans_tbl);
        return 
    strtr ($string$trans_tbl);
    }
    if(
    $_GET['emotics']==1){
    $path "F:/www/leosrv/images/fldcsmilies";
    if(
    $dir = @opendir($path)){
    $i=0$files = array();
    while ((
    $file readdir($dir)) !== false)
        if(
    substr($file,-4)==".xml"){
            
    $files[$i] = $file;
            
    $i++;
        }
        
    closedir($dir);
    }
    unset(
    $i);
    foreach(
    $files as $i => $file){
        
    $data[$i] = implode(" ",file($path."/".$file));
        if(
    $file=="PeerWeb.xml"){
            
    $data[$i] = str_ireplace('<?xml version="1.0" encoding="windows-1252"?>',"",$data[$i]);
            
    $data[$i] = str_ireplace('<Emoticons CaseSensitive="0" PreferHintText="1">',"",$data[$i]);
            
    $data[$i] = str_ireplace('</Emoticons>',"",$data[$i]);
            
    $data[$i] = str_ireplace('<Emoticon HintText=" ',"/+++/",$data[$i]);
            
    $data[$i] = str_ireplace('<Emoticon HintText="',"/+++/",$data[$i]);
            
    $data[$i] = str_ireplace('" PasteText="',"/---/",$data[$i]);
            
    $data[$i] = str_ireplace('" Expression="',"/---/",$data[$i]);
            
    $data[$i] = str_ireplace('" Bitmap="',"/---/",$data[$i]);
            
    $data[$i] = str_ireplace('"/>',"/+++/",$data[$i]);
            
    $smilies[substr($file,0,strlen($file)-4)] = explode("/+++/",$data[$i]);
            foreach(
    $smilies[substr($file,0,strlen($file)-4)] as $key => $value){
                if((
    $key%2==or $key==0) and false)
                    unset(
    $smilies[substr($file,0,strlen($file)-4)][$key]);
                else{
                    
    $tmp explode("/---/",$smilies[substr($file,0,strlen($file)-4)][$key]);
                    unset(
    $smilies[substr($file,0,strlen($file)-4)][$key]);
                    
    $smilies[substr($file,0,strlen($file)-4)][$key]['code'] = unhtmlentities($tmp[2]);
                    
    $smilies[substr($file,0,strlen($file)-4)][$key]['path'] = "/images/fldcsmilies/".str_replace("\\","/",$tmp[3]);
                }
            }
        }elseif(
    $file=="RadoX-EmoPack.xml" or $file=="FlylinkSmiles.xml" or $file=="Kolobok.xml"){
            
    $data[$i] = str_ireplace('<?xml version="1.0" encoding="windows-1252"?>',"",$data[$i]);
            
    $data[$i] = str_ireplace('RadoX-Pack v.2.2',"",$data[$i]);
            
    $data[$i] = str_ireplace('<Emoticons>',"",$data[$i]);
            
    $data[$i] = str_ireplace('</Emoticons>',"",$data[$i]);
            
    $data[$i] = str_ireplace('<Emoticon PasteText="',"/+++/",$data[$i]);
            
    $data[$i] = str_ireplace('" Bitmap="',"/---/",$data[$i]);
            
    $data[$i] = str_ireplace('"/>',"/+++/",$data[$i]);
            
    $smilies[substr($file,0,strlen($file)-4)] = explode("/+++/",$data[$i]);
            foreach(
    $smilies[substr($file,0,strlen($file)-4)] as $key => $value){
                if(
    $key%2==or $key==0)
                    unset(
    $smilies[substr($file,0,strlen($file)-4)][$key]);
                else{
                
    $tmp explode("/---/",$smilies[substr($file,0,strlen($file)-4)][$key]);
                unset(
    $smilies[substr($file,0,strlen($file)-4)][$key]);
                
    $smilies[substr($file,0,strlen($file)-4)][$key]['code'] = unhtmlentities($tmp[0]);
                
    $smilies[substr($file,0,strlen($file)-4)][$key]['path'] = "/images/fldcsmilies/".str_replace("\\","/",$tmp[1]);
                }
            }
        }
    }
    }
    if(!
    file_exists("D:/DC_Hub/PtokaX_RUS/scripts/chathistory.dat"))
        
    $text .= "Нет данных.";
    else{
        
    $data file("D:/DC_Hub/PtokaX_RUS/scripts/chathistory.dat");
        unset(
    $data[0]);
        unset(
    $data[count($data)]);
        
    $text implode("",$data);
        
    $text[0] = " "$i 0;
        
    $text[strlen($text)-3] = " ";
        
    $text[strlen($text)-4] = " ";
        
    $text str_replace('","[',"/+/+/+/[",$text);
        
    $data explode("/+/+/+/",$text);
        
    $text "";
        foreach(
    $data as $key => $value){
            if(
    ereg("\[([0-9]{2}:[0-9]{2})\] \<(.*)\> (.*)",$value,$tmp)){
                unset(
    $tmp[0]);
                
    $tmp2 explode(" ",$tmp[3]);
                
    $tmp[3] = "";
                foreach(
    $tmp2 as $key2 => $value2){
                    
    $value3 $value2;
                    if(
    strlen($value2)>72){
                        
    $value2 substr($value2,0,72)."...";
                    }else
                        
    $value2 $value2;
                    if(
    substr($value2,0,7)=='http://' or substr($value2,0,6)=='ftp://'){
                        
    $value2 "<a href='".$value2."' target='_blank'>".$value3."</a>";
                        
    $spec true;
                    }else
                        
    $spec false;
                    if(
    $spec==false and $_GET['emotics']==1)
                        foreach(
    $smilies as $pack => $packdata)
                            foreach(
    $packdata as $smileid => $smiledata)
                                if(
    file_exists("F:/www/leosrv".$smiledata['path']))
                                    
    $value2 str_replace($smiledata['code'],"<img src='".$smiledata['path']."'/>",$value2);
                    
    $tmp[3] .= $value2.($key2==count($tmp2)?"":" ");
                }
                
    $tmp[3] = str_replace("\\r\\","<br/>",$tmp[3]);
                
    $sql->db_Select("user""*""user_name='".$tmp[2]."'");
                
    $row $sql->db_Fetch();
                if(!empty(
    $row))
                    
    $tmp[2] = "<a href='/user.php?id.".$row['user_id']."'>".$tmp[2]."</a>";
                
    $text .= "[".$tmp[1]."] &lt;<b>".$tmp[2]."</b>&gt; ".$tmp[3]."";
            }else
                
    $text .= $value;
            if(
    $key != count($data))
                
    $text .= "<br/>";
        }
    }
    echo 
    "<html><head>
    <link rel='stylesheet' href='"
    .THEME."style.css' type='text/css' media='all' />
    <link rel='stylesheet' href='/files/e107.css' type='text/css' /></head><body>"
    ;
    echo 
    "<span class='mediumtext'>".$text."</span>";
    echo 
    "</body></html>";
    ?>
    поясню логику:
    сначало загрука класса для выполнения "родных" функций системы
    затем функция обратная htmlentities()
    потом загрузка файлов со информацией о смайликах
    парсинг файлов с генерацией массива смайликов
    загрузка и обработка файла с историей чата
    обработка ссылок и ников и преобразование в текст
    вывод текста

    возможное решение:
    (придумал пока писал пост) делать генерацию массива со смайлами и записывать его в файл .php (код в нём будет $smilies = array(...)) и если файлаа этого нет или изменилось количество файлов с данными о смайла то его генерировать файл иначе читаь из него переменную
     
  2. tostrss

    tostrss

    Регистр.:
    16 окт 2007
    Сообщения:
    771
    Симпатии:
    217
    PHP:
    str_ireplace
    довольно медленная функция, а вообще просто тупо сделай профилирование или воткни счетчики и посмотри, что вызывает у тебя такой затрат времени.
     
  3. beonard6

    beonard6 Постоялец

    Регистр.:
    1 июн 2009
    Сообщения:
    57
    Симпатии:
    3
    испробовал свой вариант генерации инклюд-файла, содержимое которого - задание массива смайликов. затем убрал проверку существования файла и всё стало отлично)
     
  4. t3s

    t3s

    Регистр.:
    16 фев 2008
    Сообщения:
    719
    Симпатии:
    290
    PHP:
    foreach($smilies as $pack => $packdata
    foreach(
    $packdata as $smileid => $smiledata)
    цикл внутри цикла?
     
Статус темы:
Закрыта.