1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Оптимизация кода

Тема в разделе "Оффтопик", создана пользователем W_0rld, 21 мар 2017.

  1. Автор темы
    W_0rld

    W_0rld Активный участник Пользователь

    Баллы:
    61
    Имя в Minecraft:
    World
    С каждым днем стараюсь оптимизировать весь код.

    И дело в том что мой код работает так:
    PHP:
    if ($_GET['..'] == ......
    {
    $title '...';
    $content '......';
    }
    if (
    $_GET['..'] == ......
    {
    $title '...';
    $content '......';
    }
    if (
    $_GET['..'] == ......
    {
    $title '...';
    $content '......';
    }
    if (
    $_GET['..'] == ......
    {
    $title '...';
    $content '......';
    }
    if (
    $_GET['..'] == ......
    {
    $title '...';
    $content '......';
    }
    if (
    $_GET['..'] == ......
    {
    $title '...';
    $content '......';
    }
    if (
    $_GET['..'] == ......
    {
    $title '...';
    $content '......';
    }
    и только потом:

    PHP:
    if(!empty($title) AND !empty($content))
    {
    ....
    exit();
    }
    и я подумал - получается что сервер каждый раз перебирает эти if один за одним даже если первый был "true", а это дополнительная нагрузка на сервер, а если у меня тэсячи if?

    и я решил искать решение, в результате сделал пока так:

    PHP:
    if ($_GET['..'] == ......
    {
    $title '...';
    $content '......';
    html();
    }
    if (
    $_GET['..'] == ......
    {
    $title '...';
    $content '......';
    html();
    }
    if (
    $_GET['..'] == ......
    {
    $title '...';
    $content '......';
    html();
    }
    if (
    $_GET['..'] == ......
    {
    $title '...';
    $content '......';
    html();
    }
    if (
    $_GET['..'] == ......
    {
    $title '...';
    $content '......';
    html();
    }
    if (
    $_GET['..'] == ......
    {
    $title '...';
    $content '......';
    html();
    }
    if (
    $_GET['..'] == ......
    {
    $title '...';
    $content '......';
    html();
    }
    if (
    $_GET['..'] == ......
    {
    $title '...';
    $content '......';
    html();
    }
    if (
    $_GET['..'] == ......
    {
    $title '...';
    $content '......';
    html();
    }
    if (
    $_GET['..'] == ......
    {
    $title '...';
    $content '......';
    html();
    }
    if (
    $_GET['..'] == ......
    {
    $title '...';
    $content '......';
    html();
    }
    if (
    $_GET['..'] == ......
    {
    $title '...';
    $content '......';
    html();
    }
    if (
    $_GET['..'] == ......
    {
    $title '...';
    $content '......';
    html();
    }
    if (
    $_GET['..'] == ......
    {
    $title '...';
    $content '......';
    html();
    }
    if (
    $_GET['..'] == ......
    {
    $title '...';
    $content '......';
    html();
    }
    if (
    $_GET['..'] == ......
    {
    $title '...';
    $content '......';
    html();
    }
    if (
    $_GET['..'] == ......
    {
    $title '...';
    $content '......';
    html();
    }
    if (
    $_GET['..'] == ......
    {
    $title '...';
    $content '......';
    html();
    }
    if (
    $_GET['..'] == ......
    {
    $title '...';
    $content '......';
    html();
    }
    и потом идет:

    PHP:
    function html()
    {
    global 
    $title;
    global 
    $content;
    .....
    exit()
    }
    и таким образом получается что сервер перебирает все if до нужного if'а и запустив функцию закрывает скрипт, не обрабатывая следующие "не нужные" if'ы, оптимизируя код?

    Мне интересно а нельзя ли как-то по другому оптимизировать код, ибо получается что в каждом if нужно запускать функцию, а это куча новых строк.
     
  2. Meon

    Meon Участник

    Баллы:
    30
    Делай так:
    Код:
    if ($_GET['..'] == ......
    {
    $title = '...';
    $content = '......';
    }
    else if ($_GET['..'] == ......
    {
    $title = '...';
    $content = '......';
    }
    
    А еще лучше так:
    Код:
    switch($_GET['..'])
    {
    case "......":
      $title = '...';
      $content = '......';
    break;
    
    case "......":
      $title = '...';
      $content = '......';
    break;
    }
    
     
  3. Cames

    Cames Старожил Пользователь

    Баллы:
    153
    Skype:
    sky_meg
    Такую херню пишут с помощью ассоциативных массивов
     
  4. Автор темы
    W_0rld

    W_0rld Активный участник Пользователь

    Баллы:
    61
    Имя в Minecraft:
    World
    Спасибо всем. Все переписал на switch.
     
  5. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    А разве не проще так?
    $get = $_GET['..']
    $title = 'title/'.$get;
    $content = 'content/'.$get;
     
  6. Negezor

    Negezor Активный участник Пользователь

    Баллы:
    78
    Насколько я понял это твой роутинг, ужасно... Делай аналог enum-а.

    PHP:
    <?php

        $enum 
    = [
            
    'main' => [
                
    'title' => 'Main',
                
    'content' => '...'
            
    ],
            
    'submain' => [
                
    'title' => 'Sub main',
                
    'content' => '...'
            
    ],
            
    'what' => [
                
    'title' => 'WHAT?',
                
    'content' => '...'
            
    ],
            
    '404' => [
                
    'title' => 'Not Found',
                
    'content' => '...'
            
    ]
        ];

        
    $route $enum[$_GET['action'] ?? 'main'] ?? $enum['404'];

     
  7. Автор темы
    W_0rld

    W_0rld Активный участник Пользователь

    Баллы:
    61
    Имя в Minecraft:
    World
    У меня идет такая структура кода (это для форм):
    PHP:
    switch ($response) {
    case 
    '404':
    $title "Страница не найдена.";
    $content Alert("Похоже, что такой страницы не существует.",$title);
    break;
    case 
    'registration':
    if (!
    $auth)
    {
    if (!isset(
    $_POST['login']) AND !isset($_POST['password']))
    {
    $title "Создать аккаунт";
    $content '<div class="block">
    <div class="title">'
    .$title.'</div>
    <div class="text">
    <form action="/?r=registration" method="POST" reload="none">
    <input name="login" type="text" placeholder="Логин...">
    <input name="password" type="password" placeholder="Пароль...">
    <input type="submit" value="Создать аккаунт">
    </form>
    </div>
    </div>'
    ;
    }
    else
    {
    ........
    $blocked = array('admin','hr','user','test','cicada 3301','cicada','3301','suka','blyat','csgo');
    $error false;
    if (empty(
    $post1) OR empty($post2))
    {
    $error "<p>Регистрация невозможна без ввода логина и/или пароля.</p>";
    }
    else
    {
    if (
    check($post1,2,32,"|^[A-Z0-9]+$|i") AND check($post2,6,32,"|^[A-Z0-9]+$|i"))
    {
    $error "<p><b>Логин и/или пароль должны:</b></p><p>Быть не меньше 6 и не больше 32 символов.</p><p>Содержать только буквы и цифры.</p>";
    }
    else if (
    in_array(mb_strtolower($post1),$blocked))
    {
    $error '<p>Логин "'.$post1.'" является зарезервированным логином.</p>';
    }
    else if (
    $verify)
    {
    $error "<p>Аккаунт с таким логином уже существует!</p>";
    }
    else if (
    $check)
    {
    $error "<p>Вы уже регистрировали аккаунт под этим IP адресом!</p>";
    }
    }
    if (
    $error)
    {
    $message $error;
    }
    else
    {
    sql('INSERT INTO `Users`(`login`, `password`, `ip`) VALUES (?, ?, ?)',array($post1$secured$_SERVER["REMOTE_ADDR"]));
    $message "<p>Успешная регистрация!</p>";
    $redirect '/orders';
    }
    }
    }
    break;
    case 
    'authorize':
    if (
    $auth)
    {
    $message "<p>Вы уже авторизованы!</p>";
    }
    else
    {
    Ну а это уже например кейсы самих страниц:
    PHP:
    switch ($_GET['m']) {
    case 
    'news':
    $title 'Новости';
    $news sql("SELECT * FROM `News` ORDER BY `id` DESC LIMIT 100",false);
    foreach(
    $news as $new)
    {
    $content.= '<div class="block" id="'.$new['id'].'">
    <div class="title"><a href="/news/'
    .$new['id'].'" id="ajax" class="link">'.htmlspecialchars_decode($new['title']).'</a></div>
    <div class="new">'
    .htmlspecialchars_decode($new['content']).'</div>
    </div>'
    ;
    }
    if (!
    $content)
    {
    $content Alert("Новостей нет.",false);
    }
    break;
    }
     
  8. Cames

    Cames Старожил Пользователь

    Баллы:
    153
    Skype:
    sky_meg
    Какой же ужасный говнокод. Не хочешь все переписать?
     
  9. Автор темы
    W_0rld

    W_0rld Активный участник Пользователь

    Баллы:
    61
    Имя в Minecraft:
    World
    И как же его переписать?
    Подскажите свой вариант, я только за.
     
  10. Автор темы
    W_0rld

    W_0rld Активный участник Пользователь

    Баллы:
    61
    Имя в Minecraft:
    World
    Насчёт шаблонов я считаю не обязательно ибо каждая страница на сайте уникальна, и если бы я делал шаблоны то они бы использовались только один раз.

    include не хочу, ибо есть цель все компактно и удобно поместить в один php файл, ибо у меня сайт маленький.
    Буду благодарен если покажите пример использования шаблона.
    Вот мой пример:
    PHP:
    $title 'Новости';
    $news sql("SELECT * FROM `News` ORDER BY `id` DESC LIMIT 100",false);
    foreach(
    $news as $new)
    {
    $content.= '<div class="block" id="'.$new['id'].'">
    <div class="title"><a href="/news/'
    .$new['id'].'" id="ajax" class="link">'.htmlspecialchars_decode($new['title']).'</a></div>
    <div class="new">'
    .htmlspecialchars_decode($new['content']).'</div>
    </div>'
    ;
    }
    или даже проще:
    PHP:
    $title "Создать аккаунт";
    $content '<div class="block">
    <div class="title">'
    .$title.'</div>
    <div class="text">
    <form action="/?r=registration" method="POST" reload="none">
    <input name="login" type="text" placeholder="Логин...">
    <input name="password" type="password" placeholder="Пароль...">
    <input type="submit" value="Создать аккаунт">
    </form>
    </div>
    </div>'
    ;
    А как бы вы сделали?
     
  11. Cames

    Cames Старожил Пользователь

    Баллы:
    153
    Skype:
    sky_meg
    Причем тут один или несколько раз? Нужно разделять представление от логики.
     
  12. Автор темы
    W_0rld

    W_0rld Активный участник Пользователь

    Баллы:
    61
    Имя в Minecraft:
    World
    Для чего?
     
  13. Etro

    Etro Активный участник Пользователь

    Баллы:
    78
    Как минимум, шаблон легче поправить, чем копаться в коде. Да и заведено так, что "котлеты отдельно, мухи отдельно".
     
  14. Автор темы
    W_0rld

    W_0rld Активный участник Пользователь

    Баллы:
    61
    Имя в Minecraft:
    World
    Теперь соглашусь, гораздо лучше.
    Сделал так:
    PHP:
    $lang = array(
    '404'=>'Страница не найдена.',
    'NEWS'=>'Новости',
    'NEWS_NOT_FOUND'=>'Новостей нет.',
    'NEW_NOT_FOUND'=>'Данная новость не найдена.',
    'COMMENTS'=>'Комментарии',
    'COMMENTS_NOT_FOUND'=>'Комментариев к данной новости нет.',
    'COMMENTS_SUCCESS'=>'Ваш комменатрий был добавлен.',
    'COMMENTS_INVALID'=>'Ваш комментарий слишком короткий, или наоборот слишком длинный.',
    'COMMENTS_INVALID_LIMIT'=>'Вы достигли лимита отправки комментариев.',
    'REGISTRATION'=>'Создать аккаунт',
    'REGISTRATION_INVALID'=>'Регистрация невозможна без ввода логина и/или пароля.',
    'REGISTRATION_INVALID_CHECK'=>'<p><b>Логин и/или пароль должны:</b></p><p>Быть не меньше 6 и не больше 32 символов.</p><p>Содержать только буквы и цифры.</p>',
    'REGISTRATION_INVALID_BLOCKED'=>'Логин "%login%" является зарезервированным логином.',
    'REGISTRATION_INVALID_EXIST'=>'Аккаунт с таким логином уже существует!',
    'REGISTRATION_INVALID_IP'=>'Вы уже регистрировали аккаунт под этим IP адресом!',
    'REGISTRATION_SUCCESS'=>'Вы успешно зарегестрировались.',
    'AUTHORIZE'=>'Авторизация',
    'AUTHORIZE_ALREADY_AUTHORIZED'=>'Вы уже авторизованы!',
    'AUTHORIZE_INVALID'=>'Не правильный логин и/или пароль.',
    'AUTHORIZE_SUCCESS'=>'Вы успешно авторизовались.'
    );
    $template = array(
    "NEWS" =>
    '<div class="block">
    <div class="title"><a href="/news/{ID}" id="ajax" class="link">{TITLE}</a></div>
    <div class="new">{CONTENT}</div>
    </div>'
    ,
    "COMMENTS_ADD_FORM" =>
    '<form action="?r=comment&id={ID}" method="POST">
    <input type="text" name="comment" placeholder="Ваш комментарий...">
    <input type="submit" value="Отправить">
    </form>
    </div>'
    ,
    "REGISTRATION" =>
    '<div class="block">
    <div class="title">'
    .$lang['REGISTRATION'].'</div>
    <div class="text">
    <form action="/?r=registration" method="POST" reload="none">
    <input name="login" type="text" placeholder="Логин...">
    <input name="password" type="password" placeholder="Пароль...">
    <input type="submit" value="Создать аккаунт">
    </form>
    </div>
    </div>'

    switch ($_GET['m'])
    {
    case 
    'news':
    $title $lang['NEWS'];
    $news sql("SELECT * FROM `News` ORDER BY `id` DESC LIMIT 100"false);
    foreach(
    $news as $new)
    {
    $data $template['NEWS'];
    $data str_replace("{ID}"$new['id'], $data);
    $data str_replace("{TITLE}"htmlspecialchars_decode($new['title']), $data);
    $data str_replace("{CONTENT}"htmlspecialchars_decode($new['content']), $data);
    $content .= $data;
    }
    break;
    }
    HTML:
    <!DOCTYPE HTML>
    <html>
    <head>
    <title><?=$title?></title>
    <meta charset="utf-8">
    <meta name="google-site-verification" content="3e8FWro3hiZsYZI6NezpAFT0miAzTwjcswIDRAhhk-8" />
    <meta name="yandex-verification" content="0333dadd3dd71d8f" />
    <meta name=viewport content="width=device-width, initial-scale=1">
    <link href="/files/css/style.css" rel="stylesheet" type="text/css">
    </head>
    <body>
    <div class="header">
    <div class="menu">
    <div class="logo">
    HR
    </div>
    <div class="list">
    <a href="/news">Новости</a>
    </div>
    </div>
    </div>
    <div class="sidebar">
    <?php if ($auth): ?>
    <div class="side">
    <div class="title">Привет, <?=$user?>!</div>
    <a href="/orders" id="ajax" class="sideLink">Мои заказы</a>
    <a href="/?r=exit" class="sideLink">Выйти из аккаунта</a>
    </div>
    <?php endif; if ($admin): ?>
    <div class="side">
    <div class="title">Управление сайтом</div>
    <a href="/admin/users" id="ajax" class="sideLink">Пользователи</a>
    <a href="/admin/comments" id="ajax" class="sideLink">Комментарии</a>
    <a href="/admin/news" id="ajax" class="sideLink">Новости</a>
    <a href="/admin/orders" id="ajax" class="sideLink">Заказы</a>
    </div>
    <?php else: ?>
    <div class="side">
    <div class="title">Войти в аккаунт</div>
    <div class="block">
    <form action="/?r=authorize" method="POST" reload="none">
    <input name="login" type="text" placeholder="Логин...">
    <input name="password" type="password" placeholder="Пароль...">
    <input type="submit" value="Войти в аккаунт">
    <center>
    <p>Хотите сделать заказ?</p>
    <a href="/?r=registration" id="ajax">Создайте аккаунт.</a>
    </center>
    </form>
    </div>
    </div>
    <?php endif; ?>
    </div>
    <div class="content">
    <?=$content?>
    </div>
    <div class="footer"></div>
    </body>
    <script type="text/javascript" src="/files/js/jquery/jquery.js"></script>
    <script type="text/javascript" src="/files/js/scripts.js"></script>
    </html>
    Тему можно считать закрытой.
     
  15. corndan

    corndan Активный участник Пользователь

    Баллы:
    88
    upload_2017-3-25_16-34-58.png
    Чет страшно
     
  16. Cames

    Cames Старожил Пользователь

    Баллы:
    153
    Skype:
    sky_meg
    Почти бесплатная и почти нерабочая
     
  17. Автор темы
    W_0rld

    W_0rld Активный участник Пользователь

    Баллы:
    61
    Имя в Minecraft:
    World
    После советов в этой теме, услуги на уровне.
    Вот недавно чувак заказал регистрацию и смену пароля на свой проект, пока не жаловался)
     

Поделиться этой страницей