• Почему возникает утечка памяти в php-fmp?

    @Vitsliputsli
    Утечка - это когда процесс не пользуется памятью, но и не высвобождает. По вашему описанию, php-fpm прекрасно использует память для других скриптов, а также высвобождает при необходимости. Т.е. это не утечка.

    Чтобы утечка проявила себя более явно установил memory_limit = 1G

    Выделение памяти операционкой это медленный процесс, поэтому при возможности выгоднее запросить побольше, вы выставили лимит в 1G, почему бы не зарезервировать сразу 18%.

    В общем, если без перезапуска php-fpm рано или поздно получите ошибку недостатка памяти, тогда можно будет говорить об утечке.
    Ответ написан
    6 комментариев
  • Как проверить, что прислан валидный отпечаток FingerprintJS?

    @Vitsliputsli
    Надим Закиров, никак, клиентские данные генерируются клиентом, а значит он может сгенерить все что ему вздумается. Если отправляемые данные будут генерироваться особым образом, то это лишь немного усложнит задачу, клиент сгенерирует и такие данные.
    Ответ написан
  • Как правильно организовать поиск по большому кол-во бд?

    @Vitsliputsli

    Есть несколько больших postgresql таблиц(по ≈ 1млн строк в каждой).

    Слейти их все в одну таблицу и не нужен вам никакой параллелизм.
    Ответ написан
    Комментировать
  • Как безопасно раздать пользователям веб-ресурс из частной сети?

    @Vitsliputsli
    1. Как раздать доступ к этому вебресурсу своим пользователям без установки "лишней мишуры" (типа VPN-клиента), чтобы от пользователя требовалось только перейти по ссылке в браузере.
    2. Как обезопасить подсеть организации от этого возможного вектора атак?

    Чтобы для пользователей подключение было прозрачно, чтобы не давать им креды от VPN, чтобы они не творили, что вздумается в этом VPN, а пользовтели с другой стороны в вашей сети, в любом случае нужен шлюз, который будет контролировать подключение. На нем:
    Запретите все входящие пакеты из подсети VPN по всем протоколам, кроме tcp (но не установление соединения), по icmp пусть отвечает только шлюз.
    Запретите все исходящие пакеты в эту сеть, кроме icmp и нужного ip по протоколу tcp на нужный порт (или даже протоколу http/https, если есть такая возможность).

    Есть ли решение элегантнее и проще?

    Проще, шлюз без форвардинга, на нем nginx как proxy. При желании и его можно закрыть от сети VPN.
    Ответ написан
    2 комментария
  • Как проверить параметр в объекте не нулл?

    @Vitsliputsli
    method_exists
    property_exists

    По-хорошему, объект определенного типа всегда должен иметь метод или свойство.
    Ответ написан
    Комментировать
  • Почему использование оператора '??' убирает ошибку об неопределенной переменной?

    @Vitsliputsli
    По мне так странное поведение, по логике оно должно обезопасить от index offset в массиве а не скрывать не определенные переменные

    Что в php, что в js, он делает одно и тоже, а именно проверяет, что левое выражение определено и отлично от null. Только вот в js, неопределено undefined бывает 2х видов, одно вызывает ошибку, а другое нет.
    Поэтому вся ваша логика строится на том, что вы так привыкли, при взгляде со стороны: 2 вида одного и того же, но с разным поведением - вот это действительно странно.
    Ответ написан
    Комментировать
  • Найти наиболее узкую* маску подсети для IP-адресов 1.2.3.4 и 5.6.7.8. *узкая маска – с максимально возможным префиксом подсети?

    @Vitsliputsli
    Все верно, если сомневаетесь откройте калькулятор для подсетей. Как и написано, считаете по битам, где начинаются изменения, получаем 5, а это и есть маска 248.0.0.0. Т.е. у нас подсеть 0.0.0.0/5
    Где первый адрес: 0.0.0.1 00000000.00000000.00000000.0000001
    Последний адрес: 7.255.255.254 00000111.11111111.11111111.11111110

    Быть может вы спутали маску с обратной маской, обратная здесь 7.255.255.255
    Ответ написан
    Комментировать
  • Откуда программа должна знать id для поиска обьекта c его помощью?

    @Vitsliputsli
    Именно поэтому поиск в бд возможен не только по id, но и по любому другому полю. Да и id необязательно суррогатен, он может быть натуральным, т.е. отображать идентификатор из реальной жизни.
    Ответ написан
    2 комментария
  • Как отправить сигнал из одного PHP процесса в другой без использования БД?

    @Vitsliputsli
    Все тоже как для любого процесса. Если это просто сигнал без данных, то можно использовать сигналы linux. Если нужно передавать данные, то разного рода сокеты tcp, udp, unix, web. Либо именнованные каналы-конвейеры linux.
    Если про специфичное, как уже сказали, есть shared memory.
    Все зависит от задачи, по вашим требованиям и запись в файл подойдет, если /tmp в оперативе.
    Ответ написан
    Комментировать
  • Калькулятор возвращает неправильный результат?

    @Vitsliputsli
    Для создания калькулятора самый простой и быстрый способ это перевести в обратную польскую нотацию и вычислять по ней. Это упростит парсинг в разы, и решит текущие проблемы. В том числе решит проблему разного приоритета операций.
    Ответ написан
  • Зависит ли производительность базы данных от количества записей?

    @Vitsliputsli
    Изменится, но не значительно. И дело не в сетевом лаге, это вообще другой вопрос, а в других расходах на запрос.
    Не понял, почему здесь пишут про использование/не использование индекса, в вопросе вы пишите про обращение по id, это надеюсь primary key, а значит в любом случае у нас поиск по этому индексу. Скорее всего как primary key вы используете число (int, bigint и т.п.), а значит у нас индекс BTree (с hash там вообще будет печально с производительностью). Сложность поиска по BTree - это log(n), где n - это порядок дерева. Только вот сложность и производительность не сильно коррелируют. Ведь когда вы будете менять высоту дерева это не просто обратиться к другому адресу в памяти, это нужно как минимум узнать загружена ли эта страница и получить ее адрес. Все это очень усложняет выбор дерева, теоретически не ответишь, нужно смотреть реализацию в MySQL.
    Ответ написан
    Комментировать
  • Как забрать все строки из таблицы?

    @Vitsliputsli
    Судя по слову current и доке, ваш $results - это итератор. Т.е. скорее всего, даже не нужно получать массив, просто идите foreach по $results, или используйте другие свойства итератора.
    Ответ написан
  • Получение запроса с php в python?

    @Vitsliputsli
    Передать данные на вход как аргументы запуска, либо прямо во входящий поток. Через внешнее хранилище, начиная с переменных окружения, заканчивая СУБД. Через отдельный канал, tcp, unix, web socket.
    Примерно так, с учетом как сформулирована задача. Потому как языки программирования это хорошо, но куда важнее как запускаются и работают процессы. И, если пишите не страшные костыли, то не нужно передавать весь массив post.
    Ответ написан
  • Как выглядит пример задачи по SCRUM?

    @Vitsliputsli
    Главное понять зачем вам Scrum, если потому что это "модно и молодежно", то тупо следуйте традициям. Как правило, Scrum внедряется именно для этого.
    Если же вам действительно нужно планироваться на некий интервал времени, т.е. бизнес должен быть уверен, что в большинстве случаев к концу спринта будет готов функционал, который был оговорен в начале спринта, то это правильный выбор.
    Если вам не принципиально четкое планирование на интервал спринта, то Scrum добавит лишь много накладных расходов, которые отсутствуют например в Kanban. С другой стороны, если вы не планируете краткие интервалы, то будет очень сложно проводить оценки для долговременного планирования.
    Все это лишь моя точка зрения, agile-coach продаст вам другое видение, но человек который не отвечает за результат, не входит в команду и бездумно внедряет лишь традиции приведет команду к краху. Scrum это про планирование, сам по себе он не увеличит производительность и стабильность работы проекты, но это дает любой Agile, подразумевающий что ваша команда самоорганизующаяся. Если же разработка только перекладывает вину на бизнес, тестирование на разработку, фронт на бек и т.д. все будет печально.
    пример

    Прям пример конкретный расписать очень затратно, но как некий базис, с опиcанием ошибок упрощения, пожалуйста.
    Product Owner (PO) заводит Epic для создания форума типа этого, с описанием нужного функционала (не обязательно ТЗ, достаточно функциональных требований).
    Проводится грумминг беклога проекта, не суть важно каким составом и как вы будете это делать, главное что в результате в беклоге проекта должны быть созданы Stories - это разбитый на подзадачи Epic, каждая Story - это законченная бизнес-ценность, т.е. никаких разработческих задач, только то, что можно будет "потрогать" бизнесу.
    Каждая Story должна быть оценена в Story Points (SP) (надеюсь, понятно, что SP - это не трудозатраты и не часы разработки). Декомпозиция на dev-задачи это уже развлекухи разработки, на доске Scrum они не нужны.
    "Страница логина пользователя" 3SP
    "Создание нового вопроса пользователем" 13SP
    "Отображение ленты вопросов для пользователя" 8SP
    "Создание ответов на вопросы" 8SP
    "Создание тегов-тем для вопросов" 21SP
    Следующий этап - планирование спринта. Зная velocity команды мы можем спланировать сколько задач поместится в планируемый спринт, разумеется задачи могут зависить друг от друга - это тоже надо учитывать. Например, при Velocity=30SP, мы можем взять в беклог спринта:
    "Страница логина пользователя" 3SP
    "Создание нового вопроса пользователем" 13SP
    "Отображение ленты вопросов для пользователя" 8SP
    Итого 24SP, остальные уже не помещаются. Здесь видно, что при velocity=24SP, задача в 21SP занимает почти целый спринт, это очень опасная ситуация. Когда у нас в спринте несколько десятков задач, то ошибка в их оценке может быть в плюс, а может в минус, в среднем одно другое компенсирует, а вот с нашим делением будут большие проблемы. Поэтому Story также нужно дробить сильнее, чтобы задач в спринте было много.
    На daily meeting кроме всего прочего не лишним будет смотреть на метрики спринта, одна из важнейших - график сгорания, отклонения в нем позволяют нам сделать вывод, что мы не успеваем реализовать все к концу спринта, а значит надо понять какие задачи не будут сделаны и предупредить бизнес. Стоит ли говорить, что если PO не появляется на ежедневных встречах и не следит за прогрессом, он не сможет вовремя скорректировать работу. Если PO не является реальным владельцем продукта и по каждому чиху будет брать время, чтобы уточнить у реального, то гибкость (agile) будет очень сомнительной.
    В конце спринта на проде у нас должны быть 3 вышепреечисленные задачи. Пользователь сможет зайти, создать вопрос и просмотреть созданные им и не только им вопросы. Т.е. вроде как мы доставили определенный бизнесовый функционал, но на MVP это не тянет, отвечать на вопросы еще нельзя, поэтому для использования проект не готов. Не всегда за 1 спринт получается выкатить MVP, но благодаря тому что мы уже чтото выкатили, на это можно посмотреть вживую и получить обратную связь с корректировками, а значит это agile.
    А далее, все тоже самое, регулярный грумминг, в начале спринта - планирование.
    Баги и неожиданные срочные задачи идут параллельным потоком, оценке подвергаются только business stories, т.к. важно сколько вы сделали бизнесового функционала в спринт. Поэтому баги нужно решать отдельно, крупные изменения в инфраструктуре отдельно, старайтесь это делать параллельно основным задачам в спринте, но кто-то прибегает даже к выделенным "техническим" спринтам.
    SP - это относительная величина, сравнивать их между командами бессмысленно, поэтому Velocity это тоже умозрительная эфимерная величина, она может меняться, подстраивайте ее исходя из того, сколько команда реально делает за последние спринты, а не год назад. Попытка улучшать производительность ориентируясь на Velocity печальна, как только мы вводим контроль на основе правильной метрики, метрика перестает быть таковой, поэтому введение KPI очень сложно и не везде осуществимо.
    Ответ написан
    Комментировать
  • Как работает блокировка в Postgresql?

    @Vitsliputsli
    Да, блокировка осуществляется только для выбранных записей, они блокируются до выполнения update. Пока они заблокированы, другие select for update skip locked их не увидят.
    Ответ написан
    Комментировать
  • Как называется такая практика и является ли она приемлемой?

    @Vitsliputsli
    Последний коммит в ветке сегодня, завтра уже может и не быть таковым.
    Merge коммиты не "затирает" - пишите команды, которые используете.
    Ответ написан
    2 комментария
  • Можно ли считать большинство ошибок в PHP исключениями?

    @Vitsliputsli
    Из-за исторического наследия в php получается такая неоднозначность. В данной цитите вы все верно поняли, здесь под исключением понимаются все выбрасываемое, т.е. реализующее интерфейс Throwable и затем идет уточнение, что не все, а только то, что реализует класс Error (кроме Error интерфейс Throwable реализует также класс Exception). Т.е. есть класс Exception, а есть устоявшийся термин исключение, в который в php входят Exception и Error.
    Обработчик ошибок позволит вам не писать прямо в коде обработку исключений в catch, а вынести это в отдельный блок кода. Т.е. нужно обработать конкретную ошибку - пишите catch и делайте это сразу, нужно обрабатывать похожие ошибки в различных участках кода - лучше вынести это в обработчик.
    Ответ написан
    Комментировать
  • Зачем именно нужны связи в бд?

    @Vitsliputsli
    Как уже правильно написали, ваш вопрос больше не про связи, а про ограничения (связь у вас присутствует: message.user_id -> user.id). Чаще всего, для контроля целостности базы данных используют ограничения на стороне этой же базы данных. Вы можете сделать этот контроль и в приложении: в этом простом случае, при удалении записи в user нужно будет чтото делать и с зависимыми записями message и все это нужно будет описывать (а ведь связь может быть не прямая, но и через другие записи). Когда база разрастется, появится много новых и сложных связей, вам придется все это контролировать, причем если вы забыли добавить контроль нового элемента вы сразу можете и не заметить, что консистентность нарушена.
    При определенных условиях контроль действительно переносят в приложение, но когда понимают чем рискуют, а выигрыш перевешивает. Но это не тот случай, добавить ограничение будет эффективнее.
    Ответ написан
    Комментировать
  • Не могу вывести переменные из объекта php?

    @Vitsliputsli
    options это массив из 2х объектов, а уже у этих объектов есть свойство value.
    Ответ написан
    Комментировать