За последние 24 часа нас посетили 17643 программиста и 1655 роботов. Сейчас ищут 950 программистов ...

Шаблоны eval vs include

Тема в разделе "Прочие вопросы по PHP", создана пользователем dreammaster, 15 янв 2014.

  1. dreammaster

    dreammaster Новичок

    С нами с:
    15 янв 2014
    Сообщения:
    3
    Симпатии:
    0
    Задался вопросом оптимизации подключения шаблонов на сайте и столкнулся с отсутствием нужной информации.
    Сколько уже было сказано про eval и include, но для подключения большого количества шаблонов, include пожирает много времени и ресурсов, с помощь eval, в свою очередь, можно получив все шаблоны разом обработать.
    Полной информации по конкретному вопросу я найти не смог. При синтетических тестах eval оказывался быстрее.
    В связи с этим встал вопрос, может кто нибудь, опираясь на более глубокие знания движка php, сможет помочь решить данный вопрос.
    include'/path' vs eval(readfile('/path')) ?
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Акселератор может кешировать файлы.а ивал не кешируется.
     
  3. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Сделал по 1000 файлов для include $fname; и 1000 для eval(file_get_contents($fname)); с одинаковым содержимым (кроме <?php для eval), получил среднее время:
    Код (Text):
    1. eval        0.359 сек.
    2. include 0.478 сек.
    Не на много быстрей. Стоит ли заморачиваться? Позже попробую с акселератором.
     
  4. dreammaster

    dreammaster Новичок

    С нами с:
    15 янв 2014
    Сообщения:
    3
    Симпатии:
    0
    Если учитывать что file_get_contents медленнее чем readfile, то у меня получается разница в 2 и больше раза в пользу eval.
    На счет кэширования в данном случае вопрос спорный. Поскольку информация постоянно меняется, то кэширование, по моему, будет не целесообразно.
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Попробуй обязательно, там большая разница будет.
    Т.е. инклуд vs eval это только акслератор, ибо инклуд файлов очень небыстрый при перекомпиляции.

    Добавлено спустя 35 секунд:
    кешируется код пхп
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    шаблоны у тебя постоянно меняются? ))) т.е. сравнимо с частотой чтения соотв. страницы? не смеши!

    eval проиграет при наличии опкешера. а он стопудово должен быть! вывод однозначный, п.м.с.м.
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    он имел в виду стандартный кеш результатов работы скрипта
    а я имел в виду кеш результатов компилятора пхп
     
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    я понимаю. ты успел отправить свою мессагу пока я писал свою.

    автор не знает про опкешеры. тем чудеснее будет открытие.
     
  9. dreammaster

    dreammaster Новичок

    С нами с:
    15 янв 2014
    Сообщения:
    3
    Симпатии:
    0
    Что же надо будет поставить XCache и с ним тестировать.
     
  10. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Попробовал с XCache. Те же условия, подключается по 1000 файлов.
    Код (Text):
    1. eval      0.37 сек.
    2. include   0.201 сек.
    То есть с инклудом время уменьшилось более, чем в 2 раза.

    Не пойму, а как ты выводишь через readfile? Как в первом посте eval(readfile('/path')) ?
     
  11. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    внутри что?
    у меня время с кешем и без отличается на порядок и более.
     
  13. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Только это:
    Код (PHP):
    1. <?php
    2. $abc0 = 123;
    3. $abc1 = 123;
    4. $abc2 = 123;
    5. $abc3 = 123;
    6. $abc4 = 123;
    7. $abc5 = 123;
    8. $abc6 = 123;
    9. $abc7 = 123;
    10. $abc8 = 123;
    11. $abc9 = 123; 
    Ещё нужно учитывать, что у меня PHP работает через FastCGI под Виндой.

    Добавлено спустя 3 минуты 29 секунд:
    Если кому лень набирать:
    Код (PHP):
    1. <?php
    2.  
    3. $type = 'evl';//evl|inc
    4.  
    5. $_tstart=microtime(true);
    6. for ($i=1; $i<=1000; $i++){
    7.     $fname = "$type/$i.php";
    8.     //1000 files creation
    9.     /*$data = '';//for eval
    10.     $data = '<?php'."\n";//for include
    11.     $data .= '$abc0 = 123;'."\n";
    12.     $data .= '$abc1 = 123;'."\n";
    13.     $data .= '$abc2 = 123;'."\n";
    14.     $data .= '$abc3 = 123;'."\n";
    15.     $data .= '$abc4 = 123;'."\n";
    16.     $data .= '$abc5 = 123;'."\n";
    17.     $data .= '$abc6 = 123;'."\n";
    18.     $data .= '$abc7 = 123;'."\n";
    19.     $data .= '$abc8 = 123;'."\n";
    20.     $data .= '$abc9 = 123;'."\n";
    21.     file_put_contents($fname, $data);*/
    22.     
    23.     switch ($type) {
    24.      case 'inc':
    25.          include $fname;
    26.          break;
    27.      case 'evl':
    28.          eval(file_get_contents($fname));
    29.          break;
    30.      default:
    31.          die('type?');
    32.          break;
    33.     }
    34. }
    35. $_tm = microtime(true)-$_tstart;
    36.  
    37. if(isset($_SESSION[$type])){
    38.     $_SESSION[$type] += 1;//counter
    39.     $_SESSION[$type.'t'] += $_tm;//time sum
    40. }else{
    41.     $_SESSION[$type] = 1;
    42.     $_SESSION[$type.'t'] = $_tm;
    43. }
    44.  
    45.  
    46. echo number_format($_tm,'4','.',''),' s';
    47. echo '<br/>type: ',$type;
    48. echo '<br/>count: ',$_SESSION[$type];
    49. echo '<br/>time sum: ',number_format($_SESSION[$type.'t'],'4','.',''),' s';
    50. echo '<br/>time sum / count = ',number_format($_SESSION[$type.'t']/$_SESSION[$type],'4','.',''),' s'; 
    Перед тестом нужно удалять куки из браузера.
     
  14. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    у меня нет сложного кода, которым можно проверить это дело, и времени сейчас тоже. Но если вы подключаете классы по несколько килобайт, то там разница заметна и очень ощутима.