Pull to refresh

Comments 64

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

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


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


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

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


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

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


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

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

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

UFO just landed and posted this here
UFO just landed and posted this here
На дворе 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 не раскрыть.
наверно такой код можно даже назвать не плохим
Искреннее спасибо :)
Еще раз повторюсь, мы — коммерческая система управления сайтами, где максимально выгодно, когда код понимает максимальное количество веб-разработчиков. Нам приходится балансировать.
У нас функция, кодирующая пароль, зашифрована

А зачем?

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

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

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

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

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

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

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

UFO just landed and posted this here
Статья явно написана не по приколу.

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

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


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

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

Безусловно, мы вообще не идеальны и работать нам есть куда, и мы будем развиваться. А за очередной стимул очередной раз спасибо сообществу Хабра :)
UFO just landed and posted this here

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

UFO just landed and posted this here
… вообще, это выглядит как обфусцированный код.

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

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

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

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


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

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

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

UFO just landed and posted this here
html + php, я точно в 2016 году?
UFO just landed and posted this here
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% компетентен в каких-то предметных вещах.

Тогда зачем вы пишете — да еще и с уверенным апломбом — о вещах, в которых вы не компетентны?

UFO just landed and posted this here
У программистов фантазии не хватило назвать этот метод по другому?

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


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

UFO just landed and posted this here
Sign up to leave a comment.