Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
А что не так с английским в статье?Это относится к
на русском языке почти нет достойный литературы на эту тему
Этому плохо учат в вузах, об этом молчат самоучители PHP и официальный мануал, хотя это самый важный момент при разработке программы — создание архитектуры.
Счетчики на все возможные сочетания группировок ?Это быстрее чем каждый раз пересчитывать всё заново.
А outer joinы почему долго?Потому что, обычно, это 100% full table scan. Обычно проще заменить на UNION ALL, или на CROSS JOIN, типа так.
Вид джоина никак не должен влиять на full table scanЭто почему-же?

В таблице 16 полей по которым мы хотим группировать в любых сочетанияхКакая-то прям утопически идеальная задачка — такого в реальной жизни не бывает. Чаще всего, всё приходится генерировать по требованию, и подчищать если давно не использовалось. А надеяться что пользователи будут равномерно пользоваться всеми существующими сочетаниями какого-либо функционала — очень наивно.
В случае с Outer Join'aми заполняется внешняя часть круга — соответственно для её формирования нужен full table scan, или fast full index scan.
просто потому что в этом обсуждении никто не собирается входить в моё положение
Там могут возникать весёлые моменты с join'aми, иногда проще отдельно заводить счётчик чем сталкиваться с таким
Потому что, обычно, это 100% full table scan. Обычно проще заменить на UNION ALL, или на CROSS JOIN, типа так.
Не понимаю, почему заминусовали статью. В ней говориться о правильных вещах, и она многим может быть полезна.
Определитесь, что на вашем сайте самое главное
Для блога — это, очевидно, записи. Для магазина — товары. Для сайта поликлиники — услуги.
Этому плохо учат в вузах
в страшной аббревиатуре MVC
composer create-project laravel/laravel awesome
К тому же, они резко усложняют архитектуру приложения, а также в десятки раз увеличивает время генерации одной станицы сайта.Ерунда.
Легкая миграция шаблонов? Это вообще что такое?) И зачем оно нужно?) Куда их мигрировать из приложения?Существуют другие ЯП, помимо PHP, и иногда возникает необходимость переписать часть на них.
Ну так зачем нужны эти тяжелые шаблонизаторы, когда и без них всё прекрасно работает?)Затем же за чем нужны фрэймворки.
<?php if ($items) {
foreach ($items as $item) { ?>
<li><?= strtoupper ($item) ?></li>
<?php }} else { ?>
Записей нет
<?php } ?>
// тоже самое, альтернативный синтаксис
<?php if ($items):
foreach ($items as $item): ?>
<li><?= strtoupper ($item) ?></li>
<?php endforeach;
else: ?>
Записей нет
<?php endif; ?>
или{% for item in items %}
<li>{{ item|upper }}</li>
{% else %}
Записей нет
{% endfor %}
Вообще, по-моему, Smarty и ему подобные шаблонизаторы действительно полезны в тех архитектурах, которые не были основаны на паттерне MVC, и, по сути, он просто реализует в них функционал представления. Но в современных PHP-фреймворках это ведь уже реализовано…Современные PHP-фреймворки предлагают использовать шаблонизаторы, а не plain PHP.
Какая разница, пробовал я другие шаблонизаторы или нет?)Потому что вы зациклены на «шаблонизаторы тяжелые».
Насчет скорости обработки шаблона — это вопрос оптимизации.Вам сюда.
И если я могу увеличить в несколько десятков раз скорость работы одного из уровней приложения, без особых потерь от этого — почему бы это не сделать?Уж не знаю где вы насчитали несколько десятков между 0.002 и 0.02.
Откуда вы вообще взяли эти цифры?)С тестов.
Мы сейчас говорим об общей архитектуре приложения и о том, насколько может быть полезно добавлять в него дополнительный шаблонизатор.Это вы об этом говорите, я лишь комментирую ваше заявление:
PHP уже изначально прекрасно приспособлен к генерации html-кода, и не так уж ему и нужны какие-то дополнительные шаблонизаторы.
он отличается в своём подходе от Смарти и Твига тем, что позволяет использовать в представлениях любой свой PHP-код1. Использование кода в представлении — прекрасный способ отстрелить себе или коллеге яйца. Не обязательно так и произойдет, но вероятность резко возрастает.
лично вёл разработку нескольких проектов, в которых не использовались никакие шаблонизаторы, и был очень доволен результатамиМожно не пользоваться фреймворками и прочими ништяками и также быть очень довольным. О чем разговор?
<?php if ($items) {
foreach ($items as $item) { ?>
<li><?= strtoupper ($item) ?></li>
<?php }} else { ?>
Записей нет
<?php } ?>
{foreach $items as $item}
<li>{$item|capitalize}</li>
{foreachelse}
Записей нет
{/foreach}
{% for item in items %}
<li>{{ item|upper }}</li>
{% else %}
Записей нет
{% endfor %}
или есть полные аналоги для других ЯП?
<?php if ($items) {
foreach ($items as $item) { ?>
<li><?= strtoupper ($item) ?></li>
<?php }} else { ?>
Записей нет
<?php } ?>
<?php
if ($items) {
foreach ($items as $item)
echo '<li>' , strtoupper ($item) ,'</li>';
} else {
echo 'Записей нет';
} ?>
Причем тут js и css вообще для этого есть отдельные файлы.При том, что они бывают и не в отдельных файлах.
Кому как удобно, тот так и пишет.«Если кому-то удобно говнокодить, пусть говнокодит дальше» — отличный аргумент.
Я считаю, что давно пора вынести работу с шаблонами из php и серверсайда в принципе.Речь о PHP, а не JS.
Для этого есть куча удобных JS библиотек от jq,backbone, angular и тп до ExtJs и подобным.
Я возьмусь утверждать, что использование шаблонизатора значительно уменьшает производительность приложнения, нежели использование php как нативного шаблонизатора.Чем-то подкрепите свое утверждение?
Я вот утверждаю обратное: шаблонизатор уменьшает производительность приложнения незначительно.
И готов/могу это доказывать цифрами.
Речь о PHP, а не JS.
Давайте не будем заниматься демагогией.Без проблем, если и вы сможете от нее отказаться.
Нужно исходить из особенностей конкретных проектов.Конечно нужно.
Совершенно очевидно, что парсинг шаблона средствами PHP дело накладное. Начиная от памяти на инициализацию парсера, заканчивая временем исполнения.Конечно очевидно. Также очевидно, что парсинг шаблона — операция одноразовая, после которой он автоматически превращается в plain-php код с разной степенью оверхэда.
Будь у вас оыт профилирования PHP кода шаблонизатора в каком нибудь cachegrind, вы бы так не утверждали.
На это я вам сразу возражу, натравите на свой скрипт 2000 rps рандомных запросов.Все это делалось и не раз.
Альтернатива должна иметь место быть. Прислушиваться к мнениям также стоит, даже если они кажутся глупыми. В них может скрываться потребность разработчика с которой вы еще сталкивались.Совершенно верно.
Ну затестил я ваш twig все не более, чем предсказуемо разница в 10 раз на одном запуске.Я предлагал вам тестить twig? o_O
<!DOCTYPE html>
<html>
<head>
<title>My Webpage</title>
</head>
<body>
<h1>My Webpage</h1>
<table>
<?php foreach ($records as $item) { ?>
<tr><td><?php echo $item['id']; ?></td><td> <?php echo $item['name']; ?> </td></tr>
<?php } ?>
</table>
</body>
</html>
Открываем кэш шаблона VoltПоздравляю, вы открыли принцип работы шаблонизатора (о которм я неоднократно писал выше).
Боже мой что это? Адовъ говнокод! :)Это код, с которым человеку работать не предстоит.
$ ab -t10 -c30 http://127.0.0.1/test/php/index.php
This is ApacheBench, Version 2.3 <$Revision: 1528965 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient)
Completed 5000 requests
Completed 10000 requests
Finished 14019 requests
Server Software: nginx/1.0.15
Server Hostname: 127.0.0.1
Server Port: 80
Document Path: /test/php/index.php
Document Length: 41464 bytes
Concurrency Level: 30
Time taken for tests: 10.001 seconds
Complete requests: 14019
Failed requests: 0
Total transferred: 582994134 bytes
HTML transferred: 581283816 bytes
Requests per second: 1401.76 [#/sec] (mean)
Time per request: 21.402 [ms] (mean)
Time per request: 0.713 [ms] (mean, across all concurrent requests)
Transfer rate: 56927.48 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.1 0 2
Processing: 5 21 1.2 21 48
Waiting: 5 21 1.1 21 43
Total: 5 21 1.2 21 48
Percentage of the requests served within a certain time (ms)
50% 21
66% 21
75% 22
80% 22
90% 22
95% 22
98% 24
99% 24
100% 48 (longest request)
$ ab -n10000 -c30 http://127.0.0.1/test/php/index.php
This is ApacheBench, Version 2.3 <$Revision: 1528965 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests
Server Software: nginx/1.0.15
Server Hostname: 127.0.0.1
Server Port: 80
Document Path: /test/php/index.php
Document Length: 41464 bytes
Concurrency Level: 30
Time taken for tests: 7.147 seconds
Complete requests: 10000
Failed requests: 0
Total transferred: 415860000 bytes
HTML transferred: 414640000 bytes
Requests per second: 1399.17 [#/sec] (mean)
Time per request: 21.441 [ms] (mean)
Time per request: 0.715 [ms] (mean, across all concurrent requests)
Transfer rate: 56822.26 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.1 0 2
Processing: 10 21 1.1 21 47
Waiting: 10 21 1.0 21 46
Total: 10 21 1.0 21 47
Percentage of the requests served within a certain time (ms)
50% 21
66% 21
75% 22
80% 22
90% 22
95% 22
98% 23
99% 24
100% 47 (longest request)
$ ab -t10 -c30 http://127.0.0.1/test/haanga/index.php
This is ApacheBench, Version 2.3 <$Revision: 1528965 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient)
Completed 5000 requests
Completed 10000 requests
Finished 13064 requests
Server Software: nginx/1.0.15
Server Hostname: 127.0.0.1
Server Port: 80
Document Path: /test/haanga/index.php
Document Length: 42977 bytes
Concurrency Level: 30
Time taken for tests: 10.000 seconds
Complete requests: 13064
Failed requests: 0
Total transferred: 563088435 bytes
HTML transferred: 561494505 bytes
Requests per second: 1306.39 [#/sec] (mean)
Time per request: 22.964 [ms] (mean)
Time per request: 0.765 [ms] (mean, across all concurrent requests)
Transfer rate: 54988.81 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.1 0 2
Processing: 7 23 1.3 23 52
Waiting: 6 22 1.3 22 49
Total: 7 23 1.3 23 52
Percentage of the requests served within a certain time (ms)
50% 23
66% 23
75% 23
80% 24
90% 24
95% 24
98% 25
99% 26
100% 52 (longest request)
$ ab -n10000 -c30 http://127.0.0.1/test/haanga/index.php
This is ApacheBench, Version 2.3 <$Revision: 1528965 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests
Server Software: nginx/1.0.15
Server Hostname: 127.0.0.1
Server Port: 80
Document Path: /test/haanga/index.php
Document Length: 42977 bytes
Concurrency Level: 30
Time taken for tests: 7.829 seconds
Complete requests: 10000
Failed requests: 0
Total transferred: 430990000 bytes
HTML transferred: 429770000 bytes
Requests per second: 1277.26 [#/sec] (mean)
Time per request: 23.488 [ms] (mean)
Time per request: 0.783 [ms] (mean, across all concurrent requests)
Transfer rate: 53758.44 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.1 0 1
Processing: 6 23 1.3 23 47
Waiting: 6 23 1.3 23 46
Total: 7 23 1.3 23 47
Percentage of the requests served within a certain time (ms)
50% 23
66% 24
75% 24
80% 24
90% 24
95% 25
98% 26
99% 27
100% 47 (longest request)
Тоесть при максимальной нагрузке сервера в вакуме мы за минуту только из-за шаблонизатора не дообслуживаем > 37 000 клиентских запросовДа там не ясно что и как он тестирует.
Так же было заявлено, что шаблонизатор незначительно влияет на производительнось, потом правда оказалось, что это должен быть особенный «тру» шаблонизатор на С.Глазки протираем и смотрим на habrahabr.ru/post/247495/?reply_to=8217855#comment_8217671

ob_start();
$t = microtime (true);
$records = array ();
for($i = 0; $i < 500; $i ++) {
$records [] = array ('id' => $i , 'name' => 'Name' , 'value'=>'Value');
}
include_once './Template.php';
$template = new Template();
echo $template->render('./phpTemplate.php' , array('records'=>$records));
echo microtime ( true ) - $t . '.s' . "\n";
echo ob_get_clean();
<?php
class Template
{
public $data = array();
public function render($path , $data){
$this->data = $data;
ob_start();
include $path;
return ob_get_clean();
}
public function get($key){
return $this->data[$key];
}
}
<!DOCTYPE html>
<html>
<head>
<title>My Webpage</title>
</head>
<body>
<h1>My Webpage</h1>
<table>
<?php
foreach ( $this->get('records') as $item )
echo '<tr><td>' , $item['id'] , '</td><td>' , $item['name'] , '</td><td>' , $item['value'] , '</td></tr>';
?>
</table>
</body>
</html>
<?php
try {
$t = microtime(true);
//Register an autoloader
$loader = new \Phalcon\Loader();
$loader->registerDirs(array(
'./controllers/',
'../app/models/'
))->register();
//Create a DI
$di = new Phalcon\DI\FactoryDefault();
//Setting up the view component
$di->set('view', function(){
$view = new \Phalcon\Mvc\View();
$view->setViewsDir('./volt/');
$view->registerEngines(array(
".phtml" => 'Phalcon\Mvc\View\Engine\Volt'
));
return $view;
});
//Handle the request
$application = new \Phalcon\Mvc\Application($di);
echo $application->handle()->getContent();
echo microtime(true) - $t.'.s';
} catch(\Phalcon\Exception $e) {
echo "PhalconException: ", $e->getMessage();
}
<?php
class IndexController extends \Phalcon\Mvc\Controller
{
public function indexAction()
{
$records = array ();
for($i = 0; $i < 500; $i ++) {
$records [] = array ('id' => $i , 'name' => 'Name' , 'value'=>'Value');
}
$this->view->setVar("records", $records);
}
}
<!DOCTYPE html>
<html>
<head>
<title>My Webpage</title>
</head>
<body>
<h1>My Webpage</h1>
<table>
{% for item in records %}
<tr><td>{{ item['id'] }}</td><td> {{ item['name'] }} </td> <td> {{ item['value'] }} </td></tr>
{% endfor %}
</table>
</body>
</html>
<?php
$t = microtime(true);
$records = array ();
for($i = 0; $i < 500; $i ++) {
$records [] = array ('id' => $i , 'name' => 'Name' , 'value'=>'Value');
}
require_once './Twig/lib/Twig/Autoloader.php';
Twig_Autoloader::register();
$loader = new Twig_Loader_Filesystem('./TwigTpl');
$twig = new Twig_Environment($loader, array(
'cache' => './TwigCache',
));
$template = $twig->loadTemplate('index.html');
echo $template->render(array(
'records'=>$records
));
echo microtime(true) - $t.'.s';
<!DOCTYPE html>
<html>
<head>
<title>My Webpage</title>
</head>
<body>
<h1>My Webpage</h1>
<table>
{% for item in records %}
<tr><td>{{ item.id }}</td><td> {{ item.name }} </td> <td> {{ item.value }} </td></tr>
{% endfor %}
</table>
</body>
</html>
Это альтернатива для крикливых троллей комментаторов с чсв > 9000Не стоит мне приписывать своих фантазий.
Было утверждение, что шаблонизатор незначительно сокращает время обработки, оно опровергнутоОпровергнуто чем?
Но вот незадача Blitz не захотел компилироваться по 5.6 64bit
PHP Version 5.6.2-1
System Linux www 3.16.0-4-amd64 #1 SMP Debian 3.16.7-2 (2014-11-06) x86_64
Blitz support enabled, Version 0.8.14
Пошаговый алгоритм создания архитектуры PHP-сайта