Задался вопросом оптимизации подключения шаблонов на сайте и столкнулся с отсутствием нужной информации. Сколько уже было сказано про eval и include, но для подключения большого количества шаблонов, include пожирает много времени и ресурсов, с помощь eval, в свою очередь, можно получив все шаблоны разом обработать. Полной информации по конкретному вопросу я найти не смог. При синтетических тестах eval оказывался быстрее. В связи с этим встал вопрос, может кто нибудь, опираясь на более глубокие знания движка php, сможет помочь решить данный вопрос. include'/path' vs eval(readfile('/path')) ?
Сделал по 1000 файлов для include $fname; и 1000 для eval(file_get_contents($fname)); с одинаковым содержимым (кроме <?php для eval), получил среднее время: Код (Text): eval 0.359 сек. include 0.478 сек. Не на много быстрей. Стоит ли заморачиваться? Позже попробую с акселератором.
Если учитывать что file_get_contents медленнее чем readfile, то у меня получается разница в 2 и больше раза в пользу eval. На счет кэширования в данном случае вопрос спорный. Поскольку информация постоянно меняется, то кэширование, по моему, будет не целесообразно.
Попробуй обязательно, там большая разница будет. Т.е. инклуд vs eval это только акслератор, ибо инклуд файлов очень небыстрый при перекомпиляции. Добавлено спустя 35 секунд: кешируется код пхп
шаблоны у тебя постоянно меняются? ))) т.е. сравнимо с частотой чтения соотв. страницы? не смеши! eval проиграет при наличии опкешера. а он стопудово должен быть! вывод однозначный, п.м.с.м.
он имел в виду стандартный кеш результатов работы скрипта а я имел в виду кеш результатов компилятора пхп
я понимаю. ты успел отправить свою мессагу пока я писал свою. автор не знает про опкешеры. тем чудеснее будет открытие.
Попробовал с XCache. Те же условия, подключается по 1000 файлов. Код (Text): eval 0.37 сек. include 0.201 сек. То есть с инклудом время уменьшилось более, чем в 2 раза. Не пойму, а как ты выводишь через readfile? Как в первом посте eval(readfile('/path')) ?
, слона то мы и не заметили — readfile! теоретик блин Добавлено спустя 17 минут 47 секунд: http://stackoverflow.com/questions/951373/when-is-eval-evil-in-php он же гуглетранслейт
Только это: Код (PHP): <?php $abc0 = 123; $abc1 = 123; $abc2 = 123; $abc3 = 123; $abc4 = 123; $abc5 = 123; $abc6 = 123; $abc7 = 123; $abc8 = 123; $abc9 = 123; Ещё нужно учитывать, что у меня PHP работает через FastCGI под Виндой. Добавлено спустя 3 минуты 29 секунд: Если кому лень набирать: Код (PHP): <?php session_start(); $type = 'evl';//evl|inc $_tstart=microtime(true); for ($i=1; $i<=1000; $i++){ $fname = "$type/$i.php"; //1000 files creation /*$data = '';//for eval $data = '<?php'."\n";//for include $data .= '$abc0 = 123;'."\n"; $data .= '$abc1 = 123;'."\n"; $data .= '$abc2 = 123;'."\n"; $data .= '$abc3 = 123;'."\n"; $data .= '$abc4 = 123;'."\n"; $data .= '$abc5 = 123;'."\n"; $data .= '$abc6 = 123;'."\n"; $data .= '$abc7 = 123;'."\n"; $data .= '$abc8 = 123;'."\n"; $data .= '$abc9 = 123;'."\n"; file_put_contents($fname, $data);*/ switch ($type) { case 'inc': include $fname; break; case 'evl': eval(file_get_contents($fname)); break; default: die('type?'); break; } } $_tm = microtime(true)-$_tstart; if(isset($_SESSION[$type])){ $_SESSION[$type] += 1;//counter $_SESSION[$type.'t'] += $_tm;//time sum }else{ $_SESSION[$type] = 1; $_SESSION[$type.'t'] = $_tm; } echo number_format($_tm,'4','.',''),' s'; echo '<br/>type: ',$type; echo '<br/>count: ',$_SESSION[$type]; echo '<br/>time sum: ',number_format($_SESSION[$type.'t'],'4','.',''),' s'; echo '<br/>time sum / count = ',number_format($_SESSION[$type.'t']/$_SESSION[$type],'4','.',''),' s'; Перед тестом нужно удалять куки из браузера.
у меня нет сложного кода, которым можно проверить это дело, и времени сейчас тоже. Но если вы подключаете классы по несколько килобайт, то там разница заметна и очень ощутима.