<?php
//phpinfo(); die;
// var_dump($_SERVER, $_POST); die;
// var_dump(@$_SESSION['lang_id']); die;   
// http://ladyd.com.ua:8080/ - всегда с косой  ["QUERY_STRING"]=> string(0) "" ["REQUEST_URI"]=> string(1) "/" ["SCRIPT_NAME"]=>string(10) "/index.php"
// http://ladyd.com.ua:8080/dfvewrgvfwer  ["QUERY_STRING"]=> string(0) "" ["REQUEST_URI"]=> string(1) "/dfvewrgvfwer" ["SCRIPT_NAME"]=>string(10) "/index.php"
// http://ladyd.com.ua:8080/ua/dsfswfwe?ddd   ["QUERY_STRING"]=> string(0) "ddd" ["REQUEST_URI"]=> string(1) "/ua/dsfswfwe?ddd" 
// http://ladyd.com.ua:8080/ua/dsfswfwe?ddd/   ["QUERY_STRING"]=> string(0) "ddd/" ["REQUEST_URI"]=> string(1) "/ua/dsfswfwe?ddd/" 
// http://ladyd.com.ua:8080/ua/dsfswfwe/?ddd/   ["QUERY_STRING"]=> string(0) "ddd/" ["REQUEST_URI"]=> string(1) "/ua/dsfswfwe/?ddd/" 
// http://ladyd.com.ua:8080/ua/dsfswfwe?/ddd/   ["QUERY_STRING"]=> string(0) "/ddd/" ["REQUEST_URI"]=> string(1) "/ua/dsfswfwe?/ddd/" 
//  var_dump($_SERVER);die; 

$timeline = array(microtime_float());   // var_dump( date_format(date_add(date_create(), new DateInterval('PT2S')), 'D, j M Y H:i:s e')); die;

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

require_once "local/const-local.php";  //путь правится вручную  - миниммум установок 
require_once PHP_DEPS.'vendor/autoload.php'; 

require_once CORE.PHP.'very-common.php';                                                 
require_once CORE.PHP.'const-site.php'; 
require_once CORE.PHP.'functions-common-site.php'; 
require_once CORE.PHP.'functions-ajax-site.php'; 

mb_internal_encoding("UTF-8");
mb_regex_encoding("UTF-8");

if(
false && 
$_SERVER['REMOTE_ADDR'] == '10.10.1.4')
{     
    $mail = null;                                                                                
    //   $r = sendSMTPmail('reg@me.com', 'Запрос регистрации', 't@profi.com', 'me', 'Запрос регистрации', 'Линк на регистрацию', '', false, $mail, array());
    //   sendSMTPmail('wojtylad630@gmail.com', 'тест', 'wojtylad630@gmail.com', 'btk', 'тема', 'письмо', '', false, $mail, array(), $copy = 'wojtylad630@gmail.com', $copy_name = 'btk');

    var_dump($_SERVER, $_POST); 
    die;
}

//$kurs_site = CURR_RATE_UAH;
$qry = "SELECT (SELECT `value` FROM `m_setting` WHERE `key` LIKE 'Rate') AS rate, 
    (SELECT `value` FROM `m_setting` WHERE `key` LIKE 'currId') AS currId,
(SELECT `value` FROM `m_setting` WHERE `key` LIKE 'alt') AS alt";
$row = do_sql_query_ass($qry); 
$kurs_site = $row['rate']; // по умолчанию отображаем цены в курсе сайта
$kurs_id = $row['currId']; // код валюты - грн и курс ее к валюте учета
$alt = $row['alt'];
    //   var_dump($qry, $alt);
//$mail = new PHPMailer(true);    var_dump($mail);
// это только для сайта, чтобы прокинуть порт 80 на 8080. Для профи не использовать, чтобы не заходили извне
$js_vars = "portfolio='".($_SERVER['SERVER_PORT'] == '80' || $_SERVER['SERVER_PORT'] == '443' ? '' : ':'.$_SERVER['SERVER_PORT'])."';equal='".KEY_EQUAL_VAL_DELIM."';parm_delim='".PARM_DELIM."';";   // ДАЛЬШЕ $js_vars ТОЛЬКО ДОБАВЛЯТЬ  

error_reporting(ERR_MESSAGE_LEVEL); 

$handler = new DbSession();
session_set_save_handler
(
    array($handler, 'sess_open'),
    array($handler, 'sess_close'),
    array($handler, 'sess_read'),
    array($handler, 'sess_write'),
    array($handler, 'sess_destroy'),
    array($handler, 'sess_gc')
); 

session_start(); 

$sid = session_id(); // первый вход после запрета куки, сгенерировать новый
//$_SESSION['SID'] = $sid;

// var_dump(@$_SESSION); 

$timeline['session'] = microtime_float();

if(!is_object($mysqli))    
{ 
    $mysqli = my_mysqli();
    $mysqli -> set_charset("utf8");
}                                         

/* сравнение пока пропустим
// ======================================== инфо о пользователе ==================================================================                                                                                                                         
$qry = "SELECT `fingerprint` FROM `fp` WHERE `sess_id`='$sid'"; 
$row = do_sql_query($qry, 0, 1); 

if(!($row === null || strlen(trim($row[0])) == 0)) // если записан  - передать его для сравнения 
$js_vars .= "fp='".$row[0]."';";  
*/
// ======================================== идентификация прежде всего ================================================================== 
if(($row = do_sql_query("SELECT `access_token`, `refresh_token` FROM `sessions` WHERE `id`='$sid'")) != null)
{   
    $tokens = "at='$row[0]';rt='$row[1]';";  // $tokens записывается отдельно от $js_vars 
    $parm = array('at' => $row[0], 'rt' => $row[1]); 
}
else
{
    $tokens = "at='';rt='';";  
    $parm = array('at' => '', 'rt' => ''); 
}

$timeline['ident'] = microtime_float();                         
// ======================================== разбор урла - переадресация старого ==================================================================
// проверяем старые запросы - сначала ставим раньше, т.к. их будет больше?
if($uri_new = old_requests_check())
{      
    header("HTTP/1.1 301 Moved Permanently");       
    header('Location: '.$uri_new); // если удалось переадресовать старый урл на новый
    die;
}

$timeline['old url'] = microtime_float();
// ======================================== разбор урла - проверка каноничности ==================================================================
// проверяем на неповторяемость - удаляем все лишние и сравниваем с оригиналом - только синтаксис, семантика, типа с языком или без - дальше
// http://ladyd.com.ua:8080/ua/dsfswfwe/?ddd - формат с косой, http://ladyd.com.ua:8080/ua/dsfswfwe?ddd - формат без косой

$uri = uri_canonical_check();      // ВОССТАНОВИТЬ ПРОВЕРКУ НА СУБДОМЕН

// var_dump(!($uri['uri'] == $uri['uri_canonized'] && $uri['redir_cond'] == 0) && count($_POST) == 0, $uri); die;                             
// все маленькими буквами запросы POST не трогаем
if(!($uri['uri'] == $uri['uri_canonized'] && $uri['redir_cond'] == 0) && count($_POST) == 0) 
{                                 
    header("HTTP/1.1 301 Moved Permanently");    
    header('Location: https://'.DOMAIN.($_SERVER['SERVER_PORT'] == '80' || $_SERVER['SERVER_PORT'] == '443' ? '' : ':'.$_SERVER['SERVER_PORT']).
        $uri['uri_canonized'].(strlen($uri['query_string']) == 0 ? '' : '?'.$uri['query_string']));         

    die;         
}

// ======================================== выбор языка и загрузка языковых пакетов==================================================================
lang_id_get($uri); // uri_canonized - без языковой составляющей! 

// если изменили LANG_HAS_SAME_PAGE = 1 - будут продолжаться запросы с /ua/ - их нужно переадресовывать
if(LANG_HAS_SAME_PAGE && mb_substr($uri['uri_canonized'], 0, 4) == '/'.$supported_lang[1].'/')
{                           
    $uri['uri_canonized'] = mb_substr($uri['uri_canonized'], 3); // обрезать языковую часть                                
    header("HTTP/1.1 301 Moved Permanently");    
    header('Location: '.$_SERVER['REQUEST_SCHEME'].'://'.DOMAIN.($_SERVER['SERVER_PORT'] == '80' || $_SERVER['SERVER_PORT'] == '443' ? '' : ':'.$_SERVER['SERVER_PORT']).
        $uri['uri_canonized'].(strlen($uri['query_string']) == 0 ? '' : '?'.$uri['query_string']));
    die;
}

// выбрать языковые тексты                                               
require_once CORE.PHP."lang-".$supported_lang[$lang_id].".php"; // из lang_id_get($uri);

$js_vars .= "lang_id=$lang_id;";

basket_num_cur(); // index.php - для вывода надписи в корзине

if(!isset($_SESSION['basket_txt'])) // надпись на корзине
{                    
    $discount_info = discount_get();
    basket_txt($discount_info); // index.php
}    

// ======================================== запрос поиска ==================================================================   
if(@$_POST['search_txt'])  // переадресуем, как страницу с параметрами, чтобы отбиться от формы !!! формат /poisk/?s=запрос (маленькая s - выделение искомого)
{
    // var_dump($_POST['search_txt'], $_SERVER); die; // сохранить строку поиска $_SESSION['search_txt']

    header("HTTP/1.1 301 Moved Permanently"); 
    // переадресуем, чтобы отбиться от формы и сделать линк   
    header('Location: '.$_SERVER['REQUEST_SCHEME'].'://'.DOMAIN.($_SERVER['SERVER_PORT'] == '80' || $_SERVER['SERVER_PORT'] == '443' ? '' : ':'.$_SERVER['SERVER_PORT']).
        '/'.POISK.END_SLASH.'?'.SEARCH_PREFFIX.KEY_EQUAL_VAL_DELIM.base64_encode($mysqli -> real_escape_string(@$_POST['search_txt'])).'&t='.my_time()); 
    die;
}

$timeline['main'] = microtime_float();
// ========================================================================================================== 
//                                  основной алгоритм - переадресаций больше не будет          
// ==========================================================================================================    
// выбрать все категории - только sql запрос
category_tree_get();   //  var_dump($categories, $uri); die;

from_seo_url: ////////////////////////////////////////////////////////

$categories_for_search = array_merge(array_filter(explode('/', $uri['uri_canonized']), 'strlen' )); // удалить пустые элементы
//  var_dump($categories_for_search, $uri); die;
$found = category_tree_html_get($category_searched = urldecode((count($categories_for_search) > 0 ? $categories_for_search[0] : '')), count($categories_for_search) == 1);    
//  var_dump($found, $category_searched, urldecode($category_searched), $categories_for_search); die;

// строим код для header.html  
$timeline['category'] = microtime_float(); 

if(isset($_SESSION['user_id'])) 
    $html_reg_href = '<span class="exit-icon" title="'.HDR_VYCHOD.'" onclick="leave(this)"></span>'.(strlen($_SESSION['user_nm']) == 0 ? HDR_MI_RADI_VAM : '').'<a href="/'.($lang_id == DEFAULT_LANG ? '' : $supported_lang[$lang_id].'/').PRIMEROCHNAYA.END_SLASH.'">'.$_SESSION['user_nm'].'</a>';
else
    $html_reg_href = '<a href="/'.($lang_id == DEFAULT_LANG ? '' : $supported_lang[$lang_id].'/').REG.END_SLASH.'">'.HDR_VCHOD.'</a>';

// первая часть урла может указывать на категорию или подкатегорию. Проверим это
if(count($categories_for_search) > 0)  
    $category_searched = $categories_for_search[0];        
else // это главная страница 
{         // линк на изменение языка
    //lang_change($uri, @$found['lang_other']);  
    lang_change($uri, null);       //  var_dump($html_lang_href);die;

    $js_vars .= "price_href='/';"; // для сохранения урла
    $html_logo_href = ''; // на главной нет цикличного линка на лого
    include CORE.HTML.'index.html';

    die;  
}

// линк на изменение языка
//lang_change($uri, @$found['lang_other']);  
lang_change($uri, $found);  
//var_dump($html_lang_href); die;
// лого для остальных страниц
$html_logo_href = '<a href="/'.($lang_id == DEFAULT_LANG ? '' : $supported_lang[$lang_id].END_SLASH).'"></a>';
// var_dump($found, $category_searched, $categories_for_search, $uri); die;
if($found === null) // продолжаем поиск
{    
    $qry = "SELECT `old_url`, `query`, catnum FROM `m_seo_urls` 
    WHERE `seo_url` LIKE '$category_searched' AND langID=$lang_id";

    if(($row = do_sql_query_ass($qry)) !== null)
    { 
        // восстановить подкатегорию, т.к.ее не храним    
        foreach($categories as $c)
            if($c['subcat_id'] == $row['catnum'])
            {
                $category_searched = $c["Translit_$lang_id"];
                break;
            }

            // сформировать классический запрос вместо сео 
            $uri['uri'] = $uri['uri_canonized'] = '/'.$category_searched.(strlen($row['old_url']) == 0 ? '' : '/'.$row['old_url']).END_SLASH;
        $uri['query_string'] = $row['query'];                                                           

        goto from_seo_url;
    }                                                                                

    // если название страницы начинается с большой буквы в $fixed_pages - такая страница существует в разных языковых версиях с суфиксом -ru или -ua
    $uc = in_array(ucfirst($category_searched), $fixed_pages);   // var_dump($uc, $category_searched); die;  
    if(($lc = in_array($category_searched, $fixed_pages)) || $uc) // если страница ДОЛЖНА БЫТЬ, с маленькой или большой
    {                     
        if($category_searched == PRIMEROCHNAYA) // для личного кабинета - убедиться, что пользователь авторизовался
        {  //    var_dump($uc, $lc, $category_searched, tokens_refresh($parm)); die;  
            if(($user_data = tokens_refresh($parm)) === false) // НЕ БЛОКИРОВАТЬ ВЫПОЛНЕНИЕ  http404_send!!!!!
                http404_send("index.php - попытка доступа к персональной странице неавторизированого пользователя");     //  var_dump($user_data);
                
                $qry = "SELECT accID AS id FROM `accounts` WHERE `accID`=".$user_data['id'];
                $row = do_sql_query($qry);
                $uri['query_string'] = $row == null ? 0 : $row[0];
        }
        //  var_dump($uc, $lc, $category_searched); die;   
        // если д. существовать страницы в разных языках, их вид - имя-ru или имя-ua, иначе просто имя                 
        if(file_exists(ROOT_PATH.DOMAIN_TRANSLIT.'/'.CORE.HTML.$category_searched.($uc ? '-'.$supported_lang[$lang_id] : '').'.html')) 
        {                    
            service_pages($category_searched.($uc ? '-'.$supported_lang[$lang_id] : ''), @$uri['query_string']); // готовит соответствующую страницу  https://ladyd.com.ua/poisk/?s=aGpraGpraGpr&t=1698035848
            die;
        }
        else 
            http404_send("index.php - нет фиксированной страницы $category_searched".'.html');
    } 
    else // остается проверить товар и специальные запросы - они все однокомпонентные
    {            
        // урл товара: транслит его имени и код prop4id. Код будет в QUERY или через разделитель (только если транслит неоднозначный)  
        // линк на товар в виде https://ladyd.com.ua/<транслитерация имени товара_типкод> или https://ladyd.com.ua/<транслитерация имени товара?типкод>
        // brazilianki-julimex-tanga-morskaya-volna/?t2345  - дописать возможность не добавлять цвет 
        if(GOODID_IN_QUERY == 0) // когда код товара в урле
        {
            $good = ($p = strrpos($category_searched, GOODID_SEPARATOR)) === false ? $category_searched : substr($category_searched, 0, $p); // нет кода товара в урле - весь урл это название товара
            $gt = substr($category_searched, $p + 1, 1);
            $nabor = $p === false ? 0 : ($gt == TOVAR_IN_QUERY_STRING ? 0 : ($gt == NABOR_IN_QUERY_STRING || $gt == M_NABOR_IN_QUERY_STRING ? 1 : 2)); 
            $item_id = $p === false ? 0 : substr($category_searched, $p + 2);                                                                      
        }
        else // иначе весь урл - название товара, а код товара в query_string
        {   
            $good = $category_searched;
            $gt = substr($uri['query_string'], 0, 1);                                    
            $nabor = $gt == TOVAR_IN_QUERY_STRING ? 0 : ($gt == NABOR_IN_QUERY_STRING || $gt == M_NABOR_IN_QUERY_STRING ? 1 : 2);
            $item_id = strlen($uri['query_string']) == 0 || $nabor == 2 ? 0 : substr($uri['query_string'], 1); // в query_string - НЕ КОД ТОВАРА
        }
        //   var_dump($uri, $item_id); die;
        if($item_id != 0) // если товар найден
        {
            $goods = goods_search($good, $item_id, $nabor); // учитываем к-во купленых
                     
            if($goods != null) // товар найден
            {  
                $html_tovar = tov_prepare_html($goods);        // vd($html_tovar);
                include CORE.HTML.'tovar.html';
            }
            else // товар не найден, но он должен был быть по кодировке - найти его в проданных 
                http404_send("index.php - Товар не найден");
        }
        else // товар не найден, сначала проверим спецзапрос, потом загрузку файла, чтобы не нагружать файловую систему
        {                 
            $r = ask_special($uri); // array(1) { ["err"]=> string(9) "not found" } array(4) { ["uri"]=> string(10) "/test.txt/" ["uri_canonized"]=> string(10) "/test.txt/" ["query_string"]=> string(0) "" ["redir_cond"]=> int(0) }
             //  var_dump($r, $uri); die;
            if($r['err'] == 'not found')
            //    http404_send("index.php - Спецзапрос не найден или просрочен");
            //elseif($r['err'] == '')
            //    echo $r['txt'];
            //else  // спецзапрос не найден, проверяем загрузку файла, формат запроса https://ladyd.com.ua/<имя файла>, который должен находиться в папке reports>
            {                               
                $filename_to_download = 'reports/'; // имя постоянное, т.к. передать не получится
                           
                if (strlen($filename_to_download) != 0 && file_exists($filename_to_download.$category_searched)) {
                    header('Content-Description: File Transfer');
                    header('Content-Type: application/octet-stream');
                    header('Content-Disposition: attachment; filename="'.basename($filename_to_download.$category_searched).'"');
                    header('Expires: 0');
                    header('Cache-Control: must-revalidate');
                    header('Pragma: public');
                    header('Content-Length: ' . filesize($filename_to_download.$category_searched));
                    readfile($filename_to_download.$category_searched);
                    exit;
                } 
                else 
                    http404_send("index.php - Файл не найден");                                                              
            } 
        }   
    }
}
else  // найдена категория или подкатегория
{                   
    // получить массив заголовков ВСЕХ фильтров с самими фильтрами - ДЛЯ ДАННОЙ КАТЕГОРИИ
    // при этом запросе пидорский myAdmin показывает неправильное количество записей 
    $filtersset_uniqie_name = filtersset_get($found);   //  var_dump($filtersset_uniqie_name, $filtersset_uniqie); 

    if(count($categories_for_search) > 1) // кроме категории, есть еще урл-фильтры и эта часть не пустая  
        if(filters_seo_parse($categories_for_search[1]) === false) // разобрать сео фильтры - не удалось разобрать 
            die;//   http404_send();

        filters_query_string_parse($uri); // разобрать фильтры из query_string, типы фильтров - $filter_type
    // добавлено значение $debug=ключ, можно использовать для временного включения контекстного меню

    //var_dump($found, $categories_for_search, $filters_all, $filters_all_extra, count($filters_all)); // $filters_all - null, $filters_all_extra - array(0)

    $html_breads_cr = '<a href="/">'.BR_GLAV.'</a>'; //' - Эротическое белье - [стиль | марка | цвет | стиль - марка | стиль - марка - цвет] [страница 2 из 5]';
    $link_breads_cr = '/'.$categories_for_search[0];
    // вывести H1 - можно заменить при наличии SEO
    if(isset($found['this_cat'])) // создать линк только, если есть еще фильтры
    {
        $html_h1 = $found['this_cat'];                                                                                             
        $html_breads_cr .= count($categories_for_search) <= 1 ? ' -&gt; '.$found['this_cat'] : ' -&gt; <a href="/'.$categories_for_search[0].END_SLASH.'">'.$found['this_cat'].'</a>'; // выводит, только если есть категория - не наш случай
    }
    elseif(isset($found['this_subcat'])) // создать линк только, если есть еще фильтры
    {
        $html_h1 = $found['this_subcat'];
        $html_breads_cr .= count($categories_for_search) <= 1 ? ' -&gt; '.$found['this_subcat'] : ' -&gt; <a href="/'.$categories_for_search[0].END_SLASH.'">'.$found['this_subcat'].'</a>';  
    }
    else
        $html_h1 = '';                  

    // строим хлебные крошки из фильтров - они всегда упорядочены
    $i = 0;    
    $last_f = '';
    $last_l_f = array();
    $last_l_fn = array();
    // создаем фильтры в виде линков и не линков для всего фильтра (не для его значений) - тип белья а не бюстгальтер
    foreach($filtersset_uniqie as $f)
        if(count($categories_for_search) > 1 && isset($filters_all[$f]))
        { 
            $split_f = '';
            foreach($filters_all[$f] as $flt) // для фильтра с линком - соберем его линк
                //  if(isset($flt["flt_translit_$lang_id"]))
                $split_f .= @$flt["flt_translit_$lang_id"];

            $last_f = ' -&gt; '.$filtersset_uniqie_name[$f]; // фильтр без линка - он будет последним - отображаем только названием 
            $last_fn = $f; // последний номер фильтра(любого)                                                     

            if(strlen($split_f) != 0)
            { 
                $last_l_f[] = ' -&gt; <a href="'.$link_breads_cr.'/'.$split_f.END_SLASH.'">'.$filtersset_uniqie_name[$f].'</a>';
                $last_l_fn[] = $f; // номера сео фильтров
            }
        }                                            
        //  var_dump($filtersset_uniqie, $filtersset_uniqie_name, $last_l_fn, $last_fn, $split_f);
        // записываем в хлебные крошки каждый раздел
        // если номер в $last_fn равен последнему номеру в $last_l_fn - это сео фильтр, выводим только его название, иначе выводим все сео фильтры линком плюс название
        for($i = 0; $i < count($last_l_f); $i++)
        if($i == count($last_l_f) - 1) // для последнего         
        {
            if($last_l_fn[$i] != $last_fn) 
                $html_breads_cr .= $last_l_f[$i];
            $html_breads_cr .= $last_f;
        }
        else 
            $html_breads_cr .= $last_l_f[$i];        

    // текущее значение урла не должно совпадать с каноническим значением категории (подкатегории), тогда можно добавить линк для текущей категории  
    $cat_current = $uri['uri'] == $cat_current && strlen($uri['query_string']) == 0 ? '' : ' href="'.$cat_current.'"';
    $subcat_current = $uri['uri'] == $subcat_current && strlen($uri['query_string']) == 0 ? '' : ' href="'.$subcat_current.'"';
    //  var_dump($uri['uri'], $cat_current, $uri['query_string']);
    $html_header_categories_menu = str_replace('~cat~', $cat_current, 
        str_replace('~subcat~', $subcat_current, $html_header_categories_menu));

    // ПОСТРОЕНИЕ КАТАЛОГА ТОВАРОВ ПО ЗАДАННЫМ ФИЛЬТРАМ
    // построение фильтров
    $qry_tov = array();           
    if(FILTERS_AJAXED)  
        ; // вряд-ли будет использовано
    else 
        $qry_tov = filters_prepare($found, $categories_for_search[0]);  // обычное построение фильтров 
    //vd($qry_tov);                   
    $timeline['filters'] = microtime_float();         

    // задание стартовой страницы
    $start_page = isset($filters_all_extra[PAGE_PREFFIX]) ? ($filters_all_extra[PAGE_PREFFIX]) : 1;
    $js_vars .= "start_page=$start_page;page_pref='".PAGE_PREFFIX."';";        

    $start_page = is_numeric($start_page) ? +$start_page : 1;
    $start_page = is_int($start_page) ? $start_page : 1; // не выбивает php, но все еще Uncaught ReferenceError: jhbv is not defined <anonymous> https://ladyd.com.ua/spidnia-bilyzna/?page=jhbv:2440
 //   basket_num_cur(); // index.php 2 - для вывода товаров
                          //    vd($start_page);
    // построение каталога                                        
    cat_prepare_html($qry_tov, max(1, $start_page)); // построение каталога
         
    include CORE.HTML.'catalog.html'; 
    $timeline['end'] = microtime_float();    

    if( substr($_SERVER['REMOTE_ADDR'], 0, 10) == '176.100.5.')
        echo "\nсессия: ".round($timeline['session'] - $timeline[0], 3)." мс, идент: ".round($timeline['ident'] - $timeline['session'], 3)." мс, старые урлы: ".round($timeline['old url'] - $timeline['ident'], 3).
        " мс, главная: ".round($timeline['main'] - $timeline['old url'], 3)." мс, категории: ".round($timeline['category'] - $timeline['main'], 3)." мс, фильтры: ".round($timeline['filters'] - $timeline['category'], 3).
        " мс, товары: ".round($timeline['end'] - $timeline['filters'], 3)." мс, ВСЕГО: ".round($timeline['end'] - $timeline[0], 3)." мс";

    die;
}
// ======================================== вход пользователя ==================================================================


// ======================================== выход пользователя ==================================================================
/* это реализовано через ajax
if(@$_POST['exit']=='1') 
{  
session_regenerate_id(true);// удаляет старую сессию
session_destroy(); 

header('Location: '.$_SERVER['REQUEST_SCHEME'].'://'.DOMAIN.($_SERVER['SERVER_PORT'] == '80' || $_SERVER['SERVER_PORT'] == '443' ? '' : ':'.$_SERVER['SERVER_PORT']).
$uri['uri_canonized'].$uri['query_string']); // сразу наступает переадресация
die;
}
*/
//$sent = sendSMTPmail(SMTP_FAKE_USERNAME, 'SMTP_FROM_NICK', 'btk@ladyg.com.ua', 'VOSSTANOVLENIJE_DOSTUPA', 'REG_LETTER_TITLE_REGISTER', '$body', 'ROOT_PATH.DOMAIN_TRANSLIT', $mail); 
//var_dump($sent['sent'], $sent['err']); 

/* 
хуйня была !!!!

ДЛЯ СЛУЧАЯ, КОГДА В ДИРЕКТОРИИ ВИРТУАЛЬНЫХ ХОСТОВ (ИМЕННО ТАМ) УКАЗАНО AllowOverride All
после header("HTTP/1.1 404 Not Found") нельзя отдавать Location, это сбивает все заголовки, поэтому сразу же выводим текст страницы - в этом случае линк не меняется

1.  header('HTTP/1.0 404 Not Found', true, 404);  // один из вариантов
//  http_response_code(404);        // другой из вариантов
header("HTTP/1.1 404 Not Found");   // третий из вариантов 
и вывести текст страницы include CORE.HTML.'catalog.html';

2. если нужно изменить линк, тогда адресуем на  страницу с линком (404.html), которой не должно быть, и через ErrorDocument 404 /core/php/404.php подключаем обработчик
header('Location: 404.html');  

3. ЕСЛИ УКАЗАНО AllowOverride None, ТОГДА ЗАПРОСЫ К НЕСУЩЕСТВУЮЩЕМУ ЛИНКУ АДРЕСУЮТСЯ ОБРАТНО НА КОРНЕВУЮ СТРАНИЦУ И ИХ МОЖНО ОБРАБОТАТЬ ТАМ    
header('Location: 404.html'); 
*/  
//header("HTTP/1.1 404 Not Found");                 
// header('Location: 404.html'); 
//include CORE.HTML.'catalog.html';
//echo "<!DOCTYPE html><html><head></head><body>1111111111</body></html>";

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