Как стать автором
Обновить

Комментарии 64

Тогда мы вынесли этот функционал в виде глобальной фунцкции в отдельный файл includes/sms.php и спокойно использовали в разных модулях в таком виде

На дворе 2016 год, уже 5 лет как существует Composer. Тут вам и избавление от include 'sms.php', и запуск функционала по необходимости.


В вашем примере с СМС вместо глобальных функций неплохо было бы сделать Helper-класс со статическими методами. А еще лучше — компонент приложения, зарегистрирован в Service Locator и доступный из экземпляра приложения — тогда будет и действительная гибкость настройки, и возможности для тестирования. А если заглянуть еще глубже, то отправку SMS сообщений нужно делать отложено через очереди, чтобы пользователь не ждал, пока ваше приложение сходит в чужое АПИ.


В Diafan.CMS всего один шаблон для построения ссылок: /строковоеЧПУ/числовойпараметр3/другойчисловойпараметр25

Очень плохо, что шаблон всего один и, скорее всего, прибит гвоздями к коду. Требования бизнеса поменяются и придётся переделывать код, вместо пары строк конфигурации.


Минимизируйте количество запросов к БД

А еще можно попробовать использовать ORM и решить многие описанные проблемы архитектурно. Кстати, все ваши примеры кода в этом блоке синтаксически неверны и жутко отформатированы (загляните в PSR).


Вещи говорите местами правильные, но пора переходить на следующий уровень. PHP уже давно не такой, каким вы его показываете ;)

Ну, кстати, ORM не всегда панацея от проблем — им тоже стоит с умом пользоваться, ибо есть вероятность достаточно сильно затормозить свой код.

Истину глаголите, сударь :) ORM — инструмент, а любой инструмент нужно использовать с умом

НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
На дворе 2016 год, уже 5 лет как существует Composer.
Ну ребята, если говорить о разработке чего-то нового, безусловно нужно использовать последние тенденции программирования, а когда продукт начинался в 2003-м, и в коробку сформировался в 2008-м, переписывать всю CMS раз в год под все новинки РНР нецелесообразно. Мы часто вынуждены обеспечивать и совместимость наших версий, и обновления для пользователей. И чаще стараемся дать людям функционал, чем подхватывать на лету всё новое, что выходит в РНР. Опять же, аудитория шире, программистов, понимающих классический РНР-код, больше ;).
даже примеры с ошибками… печально
В этих примерах стоит дисклеймер *здесь и ниже код условный, для наглядности. специально, чтобы не принимали код близко к сердцу, и даже специально чуть карикатуризировали его (приведенный код — не цитаты из DIAFAN.CMS, там всё несколько сложнее). Главное в статье — смысл, основы алгоритмизации при проектировании кода. А уже какими инструментами этого достигать — личное дело каждого.
Ну ребята

Ну ребята, если вы решили статью на хабру написать в 2016, то может использовать актуальный для этого года код? А то зайдут ребята зеленые, которые решат что иклюды и статичные методы это хорошо. И echo вызовы внутри кода тоже.

Да и в целом статья просто вода. Не делайте медленно, делайте быстро. Используйте кеш и индексы, не используйте некрасивые ссылки. Спасибо, теперь мой код станет лучше.
Я тут вашу CMS тестовую скачал, ну чтобы посмотреть код. В принципе, это конечно далеко от идеала, но для коммерческого проекта, наверно такой код можно даже назвать не плохим. Особенно в сравнении с тем же утекшим кодом fl.ru и прочего, типа вордпресса.

Но одна вещь меня все таки позабавила. Не уверен, что имею право приводить сюда этот кусок кода. Будем считать что я его сам написал.

	/**
	 * Кодирует пароль
	 * ...
	 */
	public function encrypt($text)
	{
		return md5($text);
	}
опять md5, сколько уже было статей на эту тему, что md5 не пригоден для хранения паролей, даже статья была целая, кстати вот и она https://habrahabr.ru/post/210760/
жду реализации decrypt()
Именно для забавы эта вещь там и стоит. Это заглушка. У нас функция, кодирующая пароль, зашифрована, а эта выведена для прикола, как и
meta name="GENERATOR" content="Microsoft FrontPage 1.0"
на сайте artlebedev.ru ;)
Вы в этом убедитесь, если возьмете ХЕШ пароля из БД, его простым md5 не раскрыть.
наверно такой код можно даже назвать не плохим
Искреннее спасибо :)
Еще раз повторюсь, мы — коммерческая система управления сайтами, где максимально выгодно, когда код понимает максимальное количество веб-разработчиков. Нам приходится балансировать.
У нас функция, кодирующая пароль, зашифрована

А зачем?

Тут, наверное, нужно сначала ответить на вопрос, зачем шифровать пароль?

Да нет, не обязательно. То есть, в принципе, это тоже любопытно — но не обязательно.

НЛО прилетело и опубликовало эту надпись здесь
1) чем шифруем, тем и расшифровываем.
2) писал в самой статье:
… такой подход нас привел еще к одной особенности. Мы очень мало используем внешний код, плагины и библиотеки. Вопреки «велосипедной» ошибке, мы считаем, что лучше написать одну функцию под свои задачи, чем включить огромную стороннюю библиотеку.
НЛО прилетело и опубликовало эту надпись здесь
Конечно некомпетентен, пару сообщений выше автор предлагает нам:
Вы в этом убедитесь, если возьмете ХЕШ пароля из БД, его простым md5 не раскрыть.

«раскрыть» хеш с помощью md5
composer вышел в 2012. Сколько должно пройти времени прежде чем вы будет использовать нормальную технологию?
Он только недавно стал стабильным… :)
Минусуюют программисты, которые программируют не ради решения задачи, а ради самого программирования.
Когда не спросишь, а что вы написали, покажите примеры своих работ, они ничего привести не могут.

То ли дело программировать ради решения задачи, забыв в том, что к коду еще придётся вернуться. Тогда гарантировано можно показать примеры своих работ, но главное — не показывать код :)

Говнокод, конечно, писать не стоит.
Просто нужно понимать, что у старых проектов может быть куча легаси-кода.
Не переписывать же его ради моды каждый год.
Работает? Ну так пусть работает.
Работает? Ну так пусть работает.

Но зачем приводить легаси-говнокод как совет?

НЛО прилетело и опубликовало эту надпись здесь
Статья явно написана не по приколу.
Какой совет?

"Как сделать быстрое веб-приложение"

А, я думал, вы о том, что я давал где-то совет писать легаси-говнокод :)
То есть, если для какого-то материала нужно ограничить доступ, достаточно отметить настройку и запросы к БД усложняются. Если нет, то запросы простые.


Получается, вам для каждого материла нужно запросить систему, есть для для него настройка доступа. Получается +n (количество материалов) запросов?
Нет, все настройки модуля забираются один раз при его исполнении
Я рад, что статью не проигнорировали и она вызвала какой-то отклик в сердцах. :) Даже если все только утвердились в мыслях, что они далеко впереди нас в разработке и все делают правильно — и то не зря.

Я только еще раз попытаюсь напомнить, что все вышенаписанное возникло не на пустом месте в формате «вот какие мы изниоткуда», а по факту https://roem.ru/14-04-2015/192219/cms-highload/
Победителем безоговорочно оказалась DIAFAN.CMS. Она успешно выдержала нагрузку в 1000 посетителей, причем со скоростью ответа как у html-страницы.
оставив далеко позади даже всенародно любимые Битрикса и Юми.

Безусловно, мы вообще не идеальны и работать нам есть куда, и мы будем развиваться. А за очередной стимул очередной раз спасибо сообществу Хабра :)
НЛО прилетело и опубликовало эту надпись здесь

… вообще, это выглядит как обфусцированный код.

НЛО прилетело и опубликовало эту надпись здесь
… вообще, это выглядит как обфусцированный код.

Именно. Небольшая заноза для путаницы и забавы, привлекающая внимание, как псевдообфусцированная функция. Это для любителей нуллить, один из приколов.
Там у вас одни приколисты сидят? :)
>htmlspecialchars, stripslashes, strip_tags… господи, да заюзайте же подготовленные выражения

Шта?
НЛО прилетело и опубликовало эту надпись здесь
Ну это только гении могут думать, что с помощью htmlspecialchars, stripslashes, strip_tags защищаются от sql-иньекций :)
1000 посетителей, это конечно мего трафик
Единовременных? Т.е., грубо говоря, 1000 в секунду — это по-вашему тьфу? :)

Тем не менее, из всех коммерческих систем управления сайтами этот «меготраф» выдержали только мы, причем с хорошим запасом.
Единовременных? Т.е., грубо говоря, 1000 в секунду — это по-вашему тьфу?

А в тесте где-то сказано, что это тысяча пользователей в одну секунду?


(ну и да, в "секунду" обычно меряют не пользователей, а запросы)

Ну это уже к loaddy.com — как они нагружают я в деталях не знаю. Может пользователи, может хиты. Мы лишь гордимся тем, что выдержали эту нагрузку заметно лучше других участников теста.

Но если вы не знаете в деталях, то и ссылаться надо осторожно. Ну да, выдержали лучше, этим можно гордиться.

НЛО прилетело и опубликовало эту надпись здесь
html + php, я точно в 2016 году?
НЛО прилетело и опубликовало эту надпись здесь
https://roem.ru/14-04-2015/192219/cms-highload — читайте первый комментарий
Допустим, Вашему проекту понадобились SMS-уведомления. Код отправки SMS достаточно простой, в несколько строк: это просто валидация телефона и GET-запрос к серверу отправки SMS — прямо так его и интегрируйте. Например, когда в Diafan.CMS потребовались SMS-уведомления администратору на поступление заказов, мы поместили этот простой код прямо в модуле «Магазин», в функции, формирующей заказ.

Простой вопрос: и как вы это протестировали?


Тогда мы вынесли этот функционал в виде глобальной фунцкции в отдельный файл includes/sms.php и спокойно использовали в разных модулях в таком виде: Sms::send($message, $to);

… и тот же самый вопрос.

В смысле? Как обычно тестируют, так и мы протестировали. А какие здесь подводные камни? Код из пары простых строк, что там тестировать?
Как обычно тестируют, так и мы протестировали

У всех свое собственное "обычно". Какое у вас?


А какие здесь подводные камни?

Лично мне в глаза бросается невозможность юнит-тестирования. Я неправ?


Код из пары простых строк, что там тестировать?

Например, факт его наличия (т.е., тот факт, что смс отправляется в нужный момент) и факт передачи корректных параметров (т.е., что смс отправляется тому, кому надо, и с нужным текстом).

А вы скачайте и сами посмотрите. Там забавно, сперва открывают сокет на bytehand.com:3800 и если сокет открылся, то используя file_get_contents (!) уже отправляют сообщение. А забавное то что, результат выполнения file_get_contents не проверяется, не используется и даже не возвращается. Ну и сокет не зарывается.

Я конечно не удивлюсь, если и это окажется «по приколу» или «заглушка», а не деле где-то в недрах системы лежит отлаженный и «зашифрованный» идеальный код для отправки SMS.
Хотя, ради интереса посмотрел, везде этот странный класс и используется. Может это конечно демка такая, лол, но никаких кастомизаций этого «модуля» там и в теории нет. URL захардкожен, условий минимум — только проверки на ввод.

Вот типичный пример использования.

Custom::inc("includes/sms.php");
Sms::send($_POST["text"], $row["phone"]);
Sms::send($_POST["text"]...)

Эээ, это правда, серьезно?

Да ладно реализация, фиг с ней, реализацию можно и поправить при правильной декомпозиции. Вопрос декомпозиции...

Ну проблем там с этим быть не может. Ибо один статичный метод, который возвращает либо ничего, либо строку — ошибку.

Я выше уже написал, какие проблемы могут быть с вызовом статического метода. А если он еще и ошибку возвращает в виде строки — так тем более.

Я про то, что реализацию поменять дело пяти минут.
По пунктам:

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' : '').'>
// И так везде...


А лицензия стоит денег…

НЛО прилетело и опубликовало эту надпись здесь
Зарегистрируйтесь на Хабре, чтобы оставить комментарий