• Code Review ядра сайта?

    @Flying
    Антон Р., Какой восхитительный пример кода, открытого всем возможным SQL injections....
  • Code Review ядра сайта?

    @Flying
    Иван Антонов, В той же Symfony это легко решается через собственные реализации UrlMatcherInterface и UrlGeneratorInterface, внутрь которых, в качестве fallback'а можно пробросить matcher и generator, создаваемые Symfony по-умолчанию.
  • Code Review ядра сайта?

    @Flying
    Иван Антонов, 60к маршрутов легко сводятся к паре десятков в случае использования параметризированных роутов, вам не стоит забывать о них.
  • Code Review ядра сайта?

    @Flying
    Иван Антонов, Зря вы так про Request и Response, ведь недаром же PSR-7 существует. Вообще для вас было бы прекрасным упражнением попробовать реализовать в вашем ядре поддержку всех имеющихся PSR, тогда действительно вы получите гибкий и расширяемый код. Попробуйте рассмотреть свою задачу в этом контексте.
  • Code Review ядра сайта?

    @Flying
    Антон Р., Я понимаю идею стоящую за этим. То на что я пытался указать - это то что вы не кэшируете эти результаты. Согласитесь что конфигурация роутинга на сайте меняется заведомо реже чем идут запросы на сайт. Таким образом получается что если на X изменений роутинга у вас приходится Y запросов то Y/X запросов к базе данных заведомо лишние поскольку дают идентичные результаты. При этом, уверен, вы понимаете что X будет иметь значение порядка десятков, а Y может быть многотысячным.

    Тем более что в данной задаче (вспоминаем Карлтона) критерий инвалидации кэша тривиальный.
  • Code Review ядра сайта?

    @Flying
    Иван Антонов,

    Сейчас (помимо целой кучи принципиально отсутствующих частей кода) у вас есть две большие проблемы:
    1. Ваш код жёстко связан между собой.
    2. Ваш код не разделяет код ядра и код пользователя

    Для решения первой проблемы необходимо использовать интерфейсы. Выделение интерфейсов позволит сделать компоненты заменяемыми, хотя и заставит вас принять решение о том как же именно выбирать конкретный класс для того или иного интерфейса что постепенно приведёт вас к какой-либо из реализаций DI контейнера. Подумайте над тем какие методы вы ожидаете от того или иного сервиса в вашем коде, выделите их в интерфейсы и напишите реализации по-умолчанию. Не забывайте что PHP поддерживает не только прямое наследование для расширения (через extends), но и горизонтальное (через traits), это позволяет сделать код ещё гибче.

    Также не пренебрегайте разделением функционально разного кода в разные namespaces, сейчас у вас всё лежит в одной куче.

    Для решения второй проблемы вам необходимо задуматься об организации вашего кода. Посмотрите на "взрослые" framework'и и то как они жёстко разделяют код своего ядра от кода пользователя. У вас же сейчас весь код лежит в одной куче что требует от пользователя вашего кода либо жёсткой дисциплины в понимании своего / чужого кода либо ставит перед необходимостью самому заниматься раскладыванием кода в предложенные места. Подумайте как в вашем текущем варианте можно обновить код ядра не затрагивая код самого сайта? Пока что ответ находится где-то недалеко от "никак" и это очень плохо.

    Но в целом, как я уже писал выше, сама идея попробовать написать что-то своё и разобраться - весьма полезна, получите хороший опыт и кучу шишек :)
  • Code Review ядра сайта?

    @Flying
    Антон Р., А зачем дёргать базу данных на каждый запрос? Ведь вы по сути на каждый запрос выполняете одинаковую операцию которую можно (и нужно) кэшировать. Кроме того ваше решение принципиально не поддерживает параметризированных запросов т.к. обработка $uri этого не содержит, а getURI() возвращает содержимое REQUEST_URI т.е. ставит крест на matching'е url'ей с query string. Попробуйте у себя сделать запрос на /book/1 или на /book?id=1

    Иван Антонов в этом плане подошёл более ответственно, он хотя бы query string отрезает.
  • Code Review ядра сайта?

    @Flying
    Видно определённое влияние того же Symfony, но пока что даже до версии 0.0.1 вам предстоит ещё долгий путь. Когда пройдёте его - тогда можно пробовать привлекать reviewer'ов
  • Code Review ядра сайта?

    @Flying
    Иван Антонов, Я быстренько глянул ваш код. Пока что это выглядит как первые шаги эксперимента в попытке разобраться как вообще можно написать framework. Т.е. review там пока делать рановато т.к. сейчас там по факту ничего нет.
  • Code Review ядра сайта?

    @Flying
    Думаю что такая задача в исполнении опытного разработчика будет стоить существенных денег. Опять же "громадный проект" - это какие порядки? Вы Facebook собираетесь на нём построить?
  • Как на php ставить задачи в очередь например при парсинге сайта?

    @Flying
    С Gearman не работал, так что ничего не скажу. По поводу связки RabbitMQ и Redis - странно слышать, Redis сам по себе более чем заменяет memcache, а RabbitMQ даже близко к ним не лежал, так что видимо есть какое-то недопонимание.

    Понятие "проще" субъективно, так что ответить на него без знания критериев простоты будет непросто :)

    На объёмах порядка тысяч элементов вполне можно обойтись банальным скриптом по cron'у, который будет каждую минуту запускать скрипт который будет брать из базы url с наименьшим временем последнего визита, забирать данные оттуда, складывая результат в базу и обновляя время последнего визита.

    Вот на объёмах в миллионы элементов и десятках / сотнях / тысячах потоков без серверов очередей уже сильно сложнее.
  • Как в PHP добавить переадресацию на другой сайт?

    @Flying
    Gambi Titto что вам мешает использовать готовые компоненты? К примеру тот же symfony/mailer, вот здесь есть документация
  • Gulp 4 выдает в «The following tasks did not complete... Did you forget to signal async completion». Как это исправить?

    @Flying
    Богдан, Ради теста скопировал 1:1 приведённый вами в тексте вопроса gulpfile, установил пакеты:
    {
      "name": "gulp-test",
      "version": "1.0.0",
      "main": "index.js",
      "dependencies": {
        "gulp": "^4.0.2",
        "gulp-load-plugins": "^2.0.1",
        "gulp-tinypng": "^1.0.2"
      }
    }

    и запустил gulp img:compress, всё отработало корректно, никакой ошибки:
    d:\gulp-test>gulp img:compress
    [17:05:06] Using gulpfile d:\gulp-test\gulpfile.js
    [17:05:07] Starting 'img:compress'...
    [17:05:07] Starting '<anonymous>'...
    [17:05:08] gulp-tingpng: [compressing] ? 1.jpg (done)
    [17:05:10] gulp-tingpng: [compressing] ? 2.jpg (done)
    [17:05:11] gulp-tingpng: [compressing] ? 3.jpg (done)
    [17:05:12] gulp-tingpng: [compressing] ? 4.jpg (done)
    [17:05:12] Finished '<anonymous>' after 5.44 s
    [17:05:12] Finished 'img:compress' after 5.44 s
  • Gulp 4 выдает в «The following tasks did not complete... Did you forget to signal async completion». Как это исправить?

    @Flying
    Богдан, А вы уверены что дело именно в этой задаче? Т.е. то что вы привели в вопросе - это полный скрипт или только часть?
  • Gulp 4 выдает в «The following tasks did not complete... Did you forget to signal async completion». Как это исправить?

    @Flying
    Важно не убрать вызов cb(), а убрать сам аргумент cb из функции т.к. gulp ориентируется по нему. Посмотрите соответствующую статью в документации.
  • Где посмотреть\почитать нормальные уроки по ООП в PHP?

    @Flying
    Антон Р., К примеру Объявление и Категория, Объявление и Пользователь
  • Где посмотреть\почитать нормальные уроки по ООП в PHP?

    @Flying
    Антон Р., вёрстку и внимание к деталям вам, судя по скриншотам, тоже стоит подтянуть :) Зато его наличие - прекрасная возможность одновременно изучать и framework'и и рефакторинг. Т.е. попробуйте не писать с нуля, а именно преобразовать ваш код в код, работающий на выбранном вами framework'е. Важность этого процесса состоит в том что вы будете не просто изучать как работает framework, а будете искать способы реализации тех механизмов которые уже есть у вас. В процессе будете лучше узнавать как они реализуются и сразу видеть изменения в своём проекте.
  • Где посмотреть\почитать нормальные уроки по ООП в PHP?

    @Flying
    Антон Р., Конечно, пробуйте :) Будет непросто, зато не скучно :) Успехов!