Comments 64
Тогда мы вынесли этот функционал в виде глобальной фунцкции в отдельный файл includes/sms.php и спокойно использовали в разных модулях в таком виде
На дворе 2016 год, уже 5 лет как существует Composer. Тут вам и избавление от include 'sms.php'
, и запуск функционала по необходимости.
В вашем примере с СМС вместо глобальных функций неплохо было бы сделать Helper-класс со статическими методами. А еще лучше — компонент приложения, зарегистрирован в Service Locator и доступный из экземпляра приложения — тогда будет и действительная гибкость настройки, и возможности для тестирования. А если заглянуть еще глубже, то отправку SMS сообщений нужно делать отложено через очереди, чтобы пользователь не ждал, пока ваше приложение сходит в чужое АПИ.
В Diafan.CMS всего один шаблон для построения ссылок: /строковоеЧПУ/числовойпараметр3/другойчисловойпараметр25
Очень плохо, что шаблон всего один и, скорее всего, прибит гвоздями к коду. Требования бизнеса поменяются и придётся переделывать код, вместо пары строк конфигурации.
Минимизируйте количество запросов к БД
А еще можно попробовать использовать ORM и решить многие описанные проблемы архитектурно. Кстати, все ваши примеры кода в этом блоке синтаксически неверны и жутко отформатированы (загляните в PSR).
Вещи говорите местами правильные, но пора переходить на следующий уровень. PHP уже давно не такой, каким вы его показываете ;)
На дворе 2016 год, уже 5 лет как существует Composer.Ну ребята, если говорить о разработке чего-то нового, безусловно нужно использовать последние тенденции программирования, а когда продукт начинался в 2003-м, и в коробку сформировался в 2008-м, переписывать всю CMS раз в год под все новинки РНР нецелесообразно. Мы часто вынуждены обеспечивать и совместимость наших версий, и обновления для пользователей. И чаще стараемся дать людям функционал, чем подхватывать на лету всё новое, что выходит в РНР. Опять же, аудитория шире, программистов, понимающих классический РНР-код, больше ;).
даже примеры с ошибками… печальноВ этих примерах стоит дисклеймер *здесь и ниже код условный, для наглядности. специально, чтобы не принимали код близко к сердцу, и даже специально чуть карикатуризировали его (приведенный код — не цитаты из DIAFAN.CMS, там всё несколько сложнее). Главное в статье — смысл, основы алгоритмизации при проектировании кода. А уже какими инструментами этого достигать — личное дело каждого.
Ну ребята
Ну ребята, если вы решили статью на хабру написать в 2016, то может использовать актуальный для этого года код? А то зайдут ребята зеленые, которые решат что иклюды и статичные методы это хорошо. И echo вызовы внутри кода тоже.
Да и в целом статья просто вода. Не делайте медленно, делайте быстро. Используйте кеш и индексы, не используйте некрасивые ссылки. Спасибо, теперь мой код станет лучше.
Но одна вещь меня все таки позабавила. Не уверен, что имею право приводить сюда этот кусок кода. Будем считать что я его сам написал.
/**
* Кодирует пароль
* ...
*/
public function encrypt($text)
{
return md5($text);
}
decrypt()
meta name="GENERATOR" content="Microsoft FrontPage 1.0"
на сайте artlebedev.ru ;)Вы в этом убедитесь, если возьмете ХЕШ пароля из БД, его простым md5 не раскрыть.
наверно такой код можно даже назвать не плохимИскреннее спасибо :)
Еще раз повторюсь, мы — коммерческая система управления сайтами, где максимально выгодно, когда код понимает максимальное количество веб-разработчиков. Нам приходится балансировать.
У нас функция, кодирующая пароль, зашифрована
А зачем?
2) писал в самой статье:
… такой подход нас привел еще к одной особенности. Мы очень мало используем внешний код, плагины и библиотеки. Вопреки «велосипедной» ошибке, мы считаем, что лучше написать одну функцию под свои задачи, чем включить огромную стороннюю библиотеку.
Когда не спросишь, а что вы написали, покажите примеры своих работ, они ничего привести не могут.
То ли дело программировать ради решения задачи, забыв в том, что к коду еще придётся вернуться. Тогда гарантировано можно показать примеры своих работ, но главное — не показывать код :)
То есть, если для какого-то материала нужно ограничить доступ, достаточно отметить настройку и запросы к БД усложняются. Если нет, то запросы простые.
Получается, вам для каждого материла нужно запросить систему, есть для для него настройка доступа. Получается +n (количество материалов) запросов?
Я только еще раз попытаюсь напомнить, что все вышенаписанное возникло не на пустом месте в формате «вот какие мы изниоткуда», а по факту https://roem.ru/14-04-2015/192219/cms-highload/
Победителем безоговорочно оказалась DIAFAN.CMS. Она успешно выдержала нагрузку в 1000 посетителей, причем со скоростью ответа как у html-страницы.оставив далеко позади даже всенародно любимые Битрикса и Юми.
Безусловно, мы вообще не идеальны и работать нам есть куда, и мы будем развиваться. А за очередной стимул очередной раз спасибо сообществу Хабра :)
… вообще, это выглядит как обфусцированный код.
Шта?
1000 посетителей, это конечно мего трафикЕдиновременных? Т.е., грубо говоря, 1000 в секунду — это по-вашему тьфу? :)
Тем не менее, из всех коммерческих систем управления сайтами этот «меготраф» выдержали только мы, причем с хорошим запасом.
Единовременных? Т.е., грубо говоря, 1000 в секунду — это по-вашему тьфу?
А в тесте где-то сказано, что это тысяча пользователей в одну секунду?
(ну и да, в "секунду" обычно меряют не пользователей, а запросы)
Допустим, Вашему проекту понадобились SMS-уведомления. Код отправки SMS достаточно простой, в несколько строк: это просто валидация телефона и GET-запрос к серверу отправки SMS — прямо так его и интегрируйте. Например, когда в Diafan.CMS потребовались SMS-уведомления администратору на поступление заказов, мы поместили этот простой код прямо в модуле «Магазин», в функции, формирующей заказ.
Простой вопрос: и как вы это протестировали?
Тогда мы вынесли этот функционал в виде глобальной фунцкции в отдельный файл includes/sms.php и спокойно использовали в разных модулях в таком виде: Sms::send($message, $to);
… и тот же самый вопрос.
Как обычно тестируют, так и мы протестировали
У всех свое собственное "обычно". Какое у вас?
А какие здесь подводные камни?
Лично мне в глаза бросается невозможность юнит-тестирования. Я неправ?
Код из пары простых строк, что там тестировать?
Например, факт его наличия (т.е., тот факт, что смс отправляется в нужный момент) и факт передачи корректных параметров (т.е., что смс отправляется тому, кому надо, и с нужным текстом).
Я конечно не удивлюсь, если и это окажется «по приколу» или «заглушка», а не деле где-то в недрах системы лежит отлаженный и «зашифрованный» идеальный код для отправки SMS.
Вот типичный пример использования.
Custom::inc("includes/sms.php");
Sms::send($_POST["text"], $row["phone"]);
Да ладно реализация, фиг с ней, реализацию можно и поправить при правильной декомпозиции. Вопрос декомпозиции...
1. Полностью согласен. Разве что некоторые вещи очевидны сразу и можно выделить предположительно популярные функции в отдельные файлы заранее.
2. А как вы поступаете, если строковоеЧПУ содержит цифры? Например, /пятница13/
В CMS «Движок» мы используем альтернативный вариант, 3 вида строковых ЧПУ на выбор:
— /news_page_12 — где, news — адрес раздела, 12 — номер страницы
— /Nazvanie_novosti/ — транслит
— /Название новости/ — русский адрес, в частности для русскоязычных доменов.
А все дополнительные параметры пишутся как в обычном запросе, передаются через GET или куки.
3. Солидарен. Но если модуль сверхмал и практически равен по времени выполнения проверке — можно его не проверять.
4. По сути повторяет 3й пункт.
5 — 8. Капитан Очевидность.
жаль что ТС слился и не пишет больше=(
А что писать? Хабр как сообщество весьма специфичен, всем известно. Если статья не зашла, её минусуют резонансно и всё. Сражаться с этим явлением бесполезно: защищаешь свою точку зрения — плохо, оправдываешься — плохо, соглашаешься со всеми — плохо, что не делай — все плохо, заклюют безусловно и всё. Будут цепляться к словам, к опечаткам, к коду, к отступам — всё, это называется именно «не зашло». Ничего, бывает. :)
html + php, я точно в 2016 году?Вы так говорите, как будто DIAFAN.CMS написана на Basic-е… А на чем написаны другие CMS? Не на PHP? Покажите коммерческую цмс из топа систем на другом языке http://www.cmsmagazine.ru/catalogue/platnye/
class DB_mysql
no comments… хорошо что хоть есть альтернатива mysqli
Наоборот. Приоритет mysqli, но бывает крайне редко, что mysqli не включено на хостинге, тогда используется mysql. И это лучше, чем не давать ставить цмс вообще.
Ну это только гении могут думать, что с помощью htmlspecialchars, stripslashes, strip_tags защищаются от sql-иньекций :)
Эти функции не борятся с sql-иньекциями, а борятся с html, что подразумевает маска h. Используется в тех случаях, когда надо html код исключить.
https://roem.ru/14-04-2015/192219/cms-highload — читайте первый комментарийСмотрим автора комментария и смотрим результаты Битрикса. Вы думаете, если бы Битрикс занял первое-третье место, этот комментарий был бы?
Но зачем приводить легаси-говнокод как совет?В очередной раз повторяю, мы советуем алгоритм, а не код. Используйте любой код, к которому привыкли. А у нас какой бы ни был код, легаси или самый современный, он работает и в своей области (среди других коммерческих цмс) весьма результативно. У нас не спортивное программирование, у нас взрослая универсальная система управления, и я еще раз повторю, чем проще и ближе к классике будет код, тем больше веб-мастеров его поймут, это закон коммерческой системы.
Конечно некомпетентен, пару сообщений выше автор предлагает нам:
«раскрыть» хеш с помощью md5
На самом деле да, я не ведущий разработчик системы, я простой руководитель компании, поэтому я не 100% компетентен в каких-то предметных вещах. Здесь не буду ничего доказывать. По поводу «раскрыть хеш» я согласен, это некорректная фраза, но поясню все-таки, что имел ввиду: есть множество сервисов, типа http://raz0r.name/obzory/top-10-luchshix-onlajn-servisov-po-rasshifrovke-xeshej/ где можно простым перебором популярных паролей получить их хеши и сравнить с искомым. Нередко получается выяснить исходный пароль, зашифрованный обычным md5. Так вот если взять наш хеш пароля из таблицы с администратором, стандартными md5 его так же не свернуть, т.е. не подобрать.
А как вы поступаете, если строковоеЧПУ содержит цифры? Например, /пятница13/У нас есть разрешенные переменные для строковых параметров, глобальные системные и модульные. Если разрешенной переменной «пятница» в системе нет, значит «пятница13» — это строка ЧПУ, и мы ее сразу смотрим в базе.
В очередной раз повторяю, мы советуем алгоритм
… содержащий те же ошибки, что и ваш код.
я еще раз повторю, чем проще и ближе к классике будет код
Вопрос только в вашем определении "классики".
На самом деле да, я не ведущий разработчик системы, я простой руководитель компании, поэтому я не 100% компетентен в каких-то предметных вещах.
Тогда зачем вы пишете — да еще и с уверенным апломбом — о вещах, в которых вы не компетентны?
<?php echo $this->get('delivery', 'cart', $result); // Вызывает вьюху ?>
можно так же было view(), render() и т.п…
И в самой вьюхе:
echo '<div class="payments">';
foreach ($result as $i => $row)
{
echo '<div class="payment">
<input name="payment_id" id="payment'.$row['id'].'" value="'.$row['id'].'" type="radio" '.(! $i ? 'checked' : '').'>
// И так везде...
А лицензия стоит денег…
Как сделать быстрое веб-приложение или 8 советов разработчикам по оптимизации кода