Задать вопрос
  • Mutex RWMutex отличия?

    RWMutex нужен, когда у нас есть объект, который нельзя параллельно писать, но можно параллельно читать. Например, стандартный тип map.
    Перед записью в защищаемый мьютексом объект делается .Lock(), а вызовы .Lock() и .RLock() в других горутинах будут ждать, пока вы не отпустите мьютекс через .Unlock().
    Перед чтением защищаемого объекта делается .RLock() и только вызовы .Lock() в других горутинах блокируются, вызовы .RLock() спокойно проходят. Когда отпускаете мьютекс через .RUnlock(), ждущие вызовы .Lock() по-очереди могут забирать мьютекс на себя.
    Таких образом обеспечивается параллельное чтение объекта несколькими горутинами, что улучшает производительность.
    Ответ написан
    4 комментария
  • Как работает Redis при одновременном доступе нескольких клиентов?

    tumbler
    @tumbler
    бекенд-разработчик на python
    Redis - однопоточный. Пока обрабатывается первый запрос, он принимает запросы от остальных клиентов и ставит их в очередь обработки. Поэтому не рекомендуется выполнять KEYS * на сервере с миллионом ключей.
    Ответ написан
    Комментировать
  • Как работает Redis при одновременном доступе нескольких клиентов?

    Softovick
    @Softovick
    программист, администратор
    Как уже сказали - Redis однопоточный, то есть запросы будут выполняться по очереди. Пока не сформирует данные для второго клиента, запрос первого не выполнится. Но следует понимать, что производительность Redis очень высокая. Настолько, что в случае 2 клиентов, один из которых 20 раз в сек пишет что-то в базу - вы просто не заметите задержки. Нормальная нагрузка для Redis это десятки и сотни тысяч запросов в сек, а то и млн.
    Ответ написан
    Комментировать
  • В чем разница тестов?

    kit_de
    @kit_de
    Моя... Твоя... Привет!
    Классика. Ответ кроется в вопросе.
    Unit test. Тестирование маленького кусочка кода. Атомарное тестирование.
    Feature test. Тестирование определенной фичи.

    ИТОГ
    Разница в охвате функционала: unit test - атомарно, feature test - глобально (в контексте фичи).

    PS:
    Маленький кусочек кода. Метод. Минимально самостоятельная единица.
    Ответ написан
    Комментировать
  • В чем разница тестов?

    @Yan-s
    Юнит тесты - для тестирования коротких изолированных фрагментов кода, отдельных методов. Проверяем, что элементарный метод работает корректно сам по себе.

    Функциональное тестирование - тестирование функционала системы. Тут проверятся что определенный запрос дает определенный ответ, приводит к определенным результам. Например, что переход пользователя по определенному адресу должен выдать HTML страницу с некими данными. Проверка работоспособности системы с точки зрения пользователя.

    https://ru.wikipedia.org/wiki/%D0%9C%D0%BE%D0%B4%D...

    https://ru.wikipedia.org/wiki/%D0%A4%D1%83%D0%BD%D...
    Ответ написан
    Комментировать
  • Куда размещать бизнес логику приложения laravel?

    @NubasLol
    Мое мнение, что в модельках должна быть логика только связанная с получением данных с базы. Бизнес логика, пишется в отдельных сервис классах, как у вас, например, класс фильтр.

    Иначе модель будет расти до тысяч строк кода, и будет мешаниной методов. Принцип же класса в ооп любого, это узкая специализация над одной задачей. Задача модели получать данные с базы, и туда их записывать.

    Контроллер же просто дерижер, который принимает запрос, обрабатывает, дергает нужные методы приложения, и отдает ответ. Сложной логики в нем писать не нужно
    Ответ написан
    9 комментариев
  • Как все время не писать print_r?

    @grinat
    Ответ написан
    Комментировать
  • Laravel. Что такое "eager loading" в двух словах на пальцах?

    @Inclusive
    В документации все просто расписано.
    Есть модель:
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class User extends Model
    {
        /**
         * Get the phone record associated with the user.
         */
        public function phone()
        {
            return $this->hasOne('App\Phone');
        }
    }


    Выбрали вы пользователей:
    $users = (new User())->newQuery()->get();

    Если вы сделаете так:
    foreach($users as $user){
       $phone = $user->phone;
    }

    То при каждом запросе к отношению - будет отдельный запрос.
    Вместо этого можно сделать либо:
    $users = (new User())->newQuery()->with('phone')->get();

    либо уже после получения:
    $users->load('phone');
    В первом случае при наличии 10 записей с пользователями произойдет 11 запросов, во втором и третьем всего 2 запроса.
    Ответ написан
    7 комментариев
  • Как сделать такой двойной box-shadow для кнопки?

    @sqrdeer
    Full-Stack JavaScript Developer
    Используй псевдо-элементы : before, after
    Ответ написан
    Комментировать
  • Какие проблемы могут быть с touch событиями?

    @Muvka Автор вопроса
    Нашел, в чем была проблема. Оказывается event.pageX нет в touch объектах событий. Нашел вот такой код
    let touch = undefined;
    if(e.originalEvent.touches) {
       touch = e.originalEvent.touches[0];
    }
    let pos_x = e.pageX || touch.pageX;
    Ответ написан
    Комментировать
  • Что такое webhook?

    Negezor
    @Negezor
    Senior Shaurma Developer
    Webhook — механизм оповещения системы о событиях.

    Допустим есть определённый сервис который должен оповещать о событиях когда они происходят.
    Как вариант постоянно запрашивать новые данные на сервере, минус будет скорее в скорости получения данных если на сервере например стоит задержка на получения новых оповещений.
    А вот webhook исправляет этот недочёт, когда происходит событие он запрашивает адрес сайта с параметрами, например example.com/webhook/notification и передаёт в теле POST запроса JSON (зачастую) и там будут свежие данные.

    Простой пример можно посмотреть: создание бота для telegram на webhooks.
    Ответ написан
    4 комментария
  • Какую взять ORM для своего проекта?

    @D3lphi
    Возьмем ORM из двух популярных PHP-фреймворков. Первая будет Eloquent ("Родная" для фреймворка Laravel), а вторая - Doctrine (Одна из доступных ORM в фреймворке Symfony). Кардинальным отличием этих двух "систем" является то, что первая разработана на основе паттерна Active Record, а вторая - с использованием паттерна Data mapper. Чем же они отличаются? Приведу абстрактные примеры кода для первого и второго паттерна:

    Active Record:
    $user = new User(); // Создаем "сущность" нового пользователя.
    $user->login = 'D3lph1'; // Устанавливаем его логин равным 'D3lph1'.
    $user->password = '123456'; // Устанавливаем пароль этому пользователю.
    $user->save(); // Сохраняем пользователя.


    Все, новый пользователь создан и находится в базе данных. Теперь, Data mapper:
    $user = new User();
    $user->login = 'D3lph1'; // Устанавливаем его логин равным 'D3lph1'.
    $user->password = '123456'; // Устанавливаем пароль этому пользователю.
    
    $manager = ... // получаем объект менеджера (Например, из DI контейнера).
    $manager->persist($user); // "Скармливаем" новоиспеченного пользователя нашему менеджеру.
    // $manager->persis($user1); // Мы можем создать еще одного пользователя и уведомить менеджер об этом.
    // $manager->persis($user2); // И еще одного...
    $manager->flush(); // После выполнения этого метода данные отправятся в базу данных.


    Очевидно, первый способ куда проще. Но не все так просто. Дело в том, что паттерн Active Record нарушает принцип единственной ответственности (Single responsibility SOLID). И поэтому, в какой-то степени, может считаться антипаттерном. (Но это ни в коем случае не значит, что его не нужно использовать, для большинства проектов "хватит" за глаза). Наша сущность пользователя делает слишком много. Она не только представляет данные, но и еще работает с ними. В больших проектах это может усложнить поддержку кода. Data mapper, напротив же, разделяет представление данных в сущность (user) и работу с данными (manager, в данном примере. Также, за работу с данными отвечает репозиторий. Вы столкнетесь с ним, как только вам потребуется получить данные из БД (Doctrine)). В небольших проектах вы не заметите особой разницы. Разве что во втором случае увеличится количество классов. Так, в Eloquent вы создаете 1 модель, а в Doctrine - сущность и репозиторий.

    Все современные ORM включают в себя также, так называемые, query builder'ы. Они помогают отказаться от языка запросов, такого как SQL. Вы будете составлять запросы таким образом:
    $result = $qb
          ->select(['id', 'login'])
          ->where('id', '<>', 3)
          ->get();


    Собственно, query builder'ы помогают абстрагироваться от конкретной СУБД. То бишь, вы написали запрос 1 раз, а затем от того, какую СУБД вы используете будет зависеть выходной sql код. Генерация этого кода будет произведена абсолютно прозрачно для вас.

    Обе ORM имеют работать с отношениями. Вам нужно будет указать, как таблицы относятся друг к другу, а затем вы сможете удобно обращаться к связанным сущностям.

    Теперь конкретно. Так как вы только начинаете осваивать ORM, я бы порекомендовал начать с Eloquent. Она гораздо проще, чем Doctrine, да и более производительная, к тому же. Как освоите Eloquent, смело учитесь работать с Doctrine. Она обязательно должна быть "в копилке" ваших скиллов, так как является самой мощной в "мире" PHP.

    Успехов!
    Ответ написан
    2 комментария
  • Как ускорить обработку запроса к бд?

    Adamos
    @Adamos
    Вам нужен список записей, у каждой из которых есть список связанных записей?
    Это делается двумя запросами:
    1. Загрузить нужные записи.
    1.1. В РНР пройти по ним и собрать id связанных записей.
    2. Загрузить все записи со связанными id.
    2.1. В РНР пройти по всем записям и приписать им подходящие связанные.
    И все. Никаких запросов в цикле и многосекундного дерганья одной жалкой тысячи записей.

    Собственно, если в Ларавеле прописать связь этого поля с той же таблицей и использовать lazy load, он, по-моему, вполне самостоятельно обходится теми же двумя запросами...
    Ответ написан
    Комментировать