PHP, скрипт который жрет лишние ресурсы

sanu0074

Новичок
Ребята, мне нужна помощь в оптимизации скрипта сайта. Данный скрипт является авто-загружаемой либой в CodeIgniter, т.е. это основной скрипт который выполняется на каждой странице сайта.
Мне не нравится как этот скрипт работает, где-то я накосячил, особенно в определении языкового предпочтения юзера, ну и в общем, тоже всё плохо. Помогите правильно все сделать чтобы его прожорливость стала меньше.
PHP:
<?php
class User {

    public $dbh,  //соединение
          $metaTags = array('meta_t'=>NULL,'meta_d'=>NULL,'meta_k'=>NULL),
          $langs = array(
                'ru' => array('ru','be','uk','kk','ka','lt','lv','et','mo','az','tg','uz','tk'),    //русский
                'de' => array('de','sl','hu','rm','nl'),                                            //немецкий
                'fr' => array('fr','lb','bi','cm','br'),                                            //французкий
                'sv' => array('sv','fi'),                                                          //шведский
                'zh' => 'zh',                                                                      //китайский
                'es' => array('es','gn','qu','ay'),                                                //испанский
                'it' => array('it','la','sc','sl'),                                                //итальянский
                'pl' => array('pl','cs','sk','ro'),                                                //польский
                'pt' => 'pt',                                                                      //португальский
                'da' => array('da','fo')                                                            //датский
            ), 

            $langs_text = array(
                'en' => 'English',
                'ru' => 'Русский',
                'de' => 'Deutsch',
                'fr' => 'Français',
                'sv' => 'Svenska', 
                'zh' => '中國',
                'es' => 'Español', 
                'it' => 'Italiano', 
                'pl' => 'Polski',
                'pt' => 'Português',
                'da' => 'Dansk'
            );

    function __construct() {
        $CI =& get_instance();
        define('MODULE_DIR',APPPATH.'views/modules/');  //корневой каталог модулей
        define('ROOTCDIR', 'd/');
        define('TMP_DIR', 'd/tmp/');
        define('CHACHEDIR', 'd/c/');
        define('ROOTFILESDIR', '../f/');
        define('HOST', $CI->config->base_url(''));       
        define('DBNAME', 'test-db');
                                                    //извлечение первого параметр урла - предполож языковой индекс
        $this->dbh = new PDO("mysql:host=localhost;dbname=".DBNAME,'test','1111',
                                array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
       
        /***
        * проверка параметра обновления сессии
        ****/
        if(!empty($_SESSION['ID'])){
            $q = $this->dbh->prepare("SELECT COUNT(*) FROM `usr` WHERE `id`=? AND `r`=?");
            $q->execute(array(xss($_SESSION['ID']),1));
            if($q->fetchColumn()>0){
                //exit('x');
                $q = $this->dbh->prepare("UPDATE `usr` SET `r`=? WHERE `id`=?");
                $q->execute(array(0,xss($_SESSION['ID'])));
                $_SESSION = NULL;
                session_destroy();
            }
        }

        require_once APPPATH.'libraries/db.php';    // библиотека для работы с БД
       
        $id = NULL;  //ид юзера
        $login = NULL;  //логин
        $lvl = NULL;  //ост данные
        $avatar = NULL;
        $prp = NULL;
        $prm = NULL;
        $cmtp = NULL;
        $cmtm = NULL;
        $reg = NULL;
        $first_name = NULL;
        $last_name = NULL;
        $sex = NULL;
        $format = FALSE;
        $mobile = FALSE;
       
        if (isset($_SESSION['FORMAT'])) { //если авторизация была
            $id = $_SESSION['ID'];
            $login = $_SESSION['LOGIN'];
            $lvl = $_SESSION['LVL'];
            $reg = $_SESSION['R'];
            $avatar = $_SESSION['AVATAR'];
            $prp = $_SESSION['PRP'];
            $prm = $_SESSION['PRM'];
            $cmtp = $_SESSION['CMTP'];
            $cmtm = $_SESSION['CMTM'];
            $sex = $_SESSION['SEX'];
            $first_name = $_SESSION['F_NAME'];
            $last_name = $_SESSION['L_NAME'];
            $format = $_SESSION['FORMAT'];
            $mobile = $_SESSION['MOBILE'];
        }
       
        if(!isset($_SESSION['R']) && !empty($_COOKIE['HS']) && !empty($_COOKIE['ID']) ){
            $q = $this->dbh->prepare("SELECT COUNT(*) FROM `usr` WHERE `id`=? AND `hs`=?");
            $q->execute(array(xss($_COOKIE['ID']),xss($_COOKIE['HS'])));
            if($q->fetchColumn()>0){
                $q = $this->dbh->prepare("SELECT `id`,`login`,`lvl`,`first_name`,`last_name`,`sex`,`opt_avatar`,`op`,`om`,`opp`,`opm` FROM `usr` WHERE `id`=? AND `hs`=?");
                $q->execute(array(xss($_COOKIE['ID']),xss($_COOKIE['HS'])));
                $r = $q->fetch();
                $id = $r['id'];
                $login = $r['login'];
                $lvl = $r['LVL'];
                $sex = $r['sex'];
                $avatar = $r['opt_avatar'];
                $reg = TRUE;
                $first_name = $r['first_name'];
                $last_name = $r['last_name'];
                $prp = $r['op'];
                $prm = $r['om'];
                $cmtp = $r['opp'];
                $cmtm = $r['opm'];
            }
        }
           
        if(!isset($_SESSION['MOBILE']) ){
            $userData = $this->getUserData();
            $format = FALSE;
            $mobile = 0;
            if($userData['mobile']){
                $mobile = 1;
            }
            if($userData['android']){
                $mobile = 1;
                if((int)$userData['android_version']>=4){
                    $format = TRUE;
                }
            }
            if($userData['browser']=='chrome' || $userData['browser']=='opera'){
                $format = TRUE;
            }
        }

        if(empty($_SESSION['LANG'])){  //если нет в сессии языка то присвоим его по AccepLng
            $lang = $this->setHL($CI);
            $_SESSION['LANG'] = $lang;
        }else {
            $lang = $_SESSION['LANG'];
        }
       
        $_SESSION['LANG'] = $lang;
        $_SESSION['FORMAT'] = $format;
        $_SESSION['MOBILE'] = $mobile;
        $_SESSION['ID'] = $id;
        $_SESSION['LOGIN'] = $login;
        $_SESSION['LVL'] = $lvl;
        $_SESSION['R'] = $reg;
        $_SESSION['AVATAR'] = $avatar;
        $_SESSION['F_NAME'] = $first_name;
        $_SESSION['L_NAME'] = $last_name;
        $_SESSION['SEX'] = $sex;
        $_SESSION['PRP'] = $prp;
        $_SESSION['PRM'] = $prm;
        $_SESSION['CMTP'] = $cmtp;
        $_SESSION['CMTM'] = $cmtm;
     
        define('LANG',$lang);
        define('ID',$id);
        define('LOGIN', $login);
        define('lvl', $lvl);
        define('REG', $reg);
        define('F_NAME', $first_name);
        define('L_NAME', $last_name);
        define('AVATAR', $avatar);
        define('PRP', $prp);
        define('PRM', $prm);
        define('CMTP', $cmtp);
        define('CMTM', $cmtm);
        define('SEX', $sex);
        define('FORMAT', $format);
        define('MOBILE', $mobile);
        define('C_LINES', 50);
        define('LM_SEC', 51);
        define('LM_EL', 52);
        define('DATE_FORMAT', "Y-m-d G:i:s");
        define('SUPPORT_MAIL', '[email protected]');
       
        /***
        ***если зареганный то обновим последнее посещение
        ***/
       
        if(REG){
                $q = $this->dbh->prepare("UPDATE `usr` SET `last_visit`=? WHERE `id`=?");
                $q->execute(array(date(DATE_FORMAT),ID));           
                define('NOTIFY', $this->getCountNotify());
        }else{
                define('NOTIFY',FALSE);
        }
    }
   
    public function getCountNotify() {
        $q = $this->dbh->prepare("SELECT COUNT(*) FROM `ntf` WHERE `u_id`=?");
        $q->execute(array(ID));
        return $q->fetchColumn();
    }
   
    public function setHL($CI) {                                //получает язык юзера
        $CI->load->library('lang_detect');
        $lang = $CI->lang_detect->getBestMatch('en', $this->langs);
        return $lang;
    }
   
    private function getUserData() {
        if(preg_match('/Opera Mini/',$_SERVER['HTTP_USER_AGENT'])){$browser='opera_mini';}
        else if(preg_match('/Opera/',$_SERVER['HTTP_USER_AGENT'])){$browser='opera';}
        else if(preg_match('/Firefox/',$_SERVER['HTTP_USER_AGENT'])){$browser='mozilla';}
        else if(preg_match('/Chrome/',$_SERVER['HTTP_USER_AGENT'])){$browser='chrome';}
        else if(preg_match('/(MSIE)|(rv)/',$_SERVER['HTTP_USER_AGENT'])){$browser='msie';}
        else if(preg_match('/AppleWebKit/',$_SERVER['HTTP_USER_AGENT'])){$browser='safari';}
        else{$browser='chrome';}
        $data['browser'] = $browser;
        require_once APPPATH.'libraries/mobile_detect.php';
        $detect = new Mobile_Detect;
        $data['android']=$detect->isAndroidOS();
        $data['android_version']=$detect->version('Android');
        if($detect->isMobile() || $detect->isTablet()){
            $data['mobile'] = TRUE;
        }else{
            $data['mobile'] = FALSE;
        }
        return $data;
    }

    //to do more actions....

}

?>
 

antson

Новичок
Партнер клуба
проверить, что созданы/используются индексы .
излишне, сперва вызов count() и после значения. можно просто один раз запрашивать сразу данные.

И архитектурно засовывать этот функционал в класс пользователя не логично.
так как запросов от не авторизованных больше
если мультиязычность делается без разделения по урлам,
то я бы сделал так
1. есть кука языка ? выбрали закончили
- при авторизации посадили ее из профиля.
- без регистрации сажается через js как выбор языка.

2 нет куки
анализируем в чем отдать или просто дефолт

базу не насилуем .
 

antson

Новичок
Партнер клуба
еще замечание твой код идет в разрез с идеологией CodeIgniter . сейчас не могу сформулировать точно, но общее впечатление как бельмо на глазу.
А больше всего режут глаз definы это вообще против ООП

а getUserData вместо ожидаемого профиля пользователя возвращает черте-что
 

Sufir

Я не волшебник, я только учусь
Вопрос о качестве кода открыт, но поскольку речь о "жратве" и "оптимизации"... Есть такой вопрос, как ты узнал что именно этот скрипт жрет лишние ресурсы, и насколько лишние?
 

Luge

Нестандартное звание
PHP:
$time_start = microtime(true);
// тело метода
$time_end = microtime(true);
$time = $time_end - $time_start;
echo __METHOD__.' работал '.$time.'c';
 

AmdY

Пью пиво
Команда форума
еспользуй профайлинг. например xdebug, сшененрированный в таком случае файл можно прикрепить, чтобы было видно где именно тормоза.
 

Дмитрий Беляев

Местный клоун
почему xdebug может не встать? через визард тебе скажут что качать и куда класть http://xdebug.org/wizard.php
А вот представь, бывает не встает )) Да и он скоро уже не нужен будет, когда на 5.6 все перейдут. Так же, как php-apc отваливается по-тихоньку за ненадобностью.
 

AmdY

Пью пиво
Команда форума
У мужика программиста всегда должен вставать. Автор не вносу колупается, а проверяет сборки под все системы и даже для особо упоротых сделал этот визард. И с чего это в 5.6 он не нужен будет?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
@AmdY товарища забанили, все хорошо)
 
Сверху