• Как изменить формат логгирования Monolog Symfony?

    @djon_pulse Автор вопроса
    Да, ответ оказался действительно проще чем казалось.

    Достаточно было использовать форматер Monolog\Formatter\LineFormatter в конфиге и убрать лишние аргументы в нем.

    attribute.logger.formatter:
        class: Monolog\Formatter\LineFormatter
        arguments: [ "%%message%% %%context%%\n" ]
    Ответ написан
    Комментировать
  • Почему я получаю ошибку 500?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Это написано в логе ошибок веб-сервера.
    Ответ написан
    Комментировать
  • Как передавать данные из одного докер контейнера в другой?

    karabanov
    @karabanov Куратор тега Docker
    Системный администратор
    Объедини контейнеры одно виртуальной сетью. Можешь конечно и вручную всё настроить но это не целесообразно.
    Воспользуйся docker-compose.

    docker-compose.yml может выглядеть, например, так:
    version: "3.2"
    services:
      my_db:
        image: mysql:8.0.26
        restart: always
        container_name: mysql8
        command: --default-authentication-plugin=mysql_native_password
        environment:
          MYSQL_ROOT_PASSWORD: superpassword
        ports:
        working_dir: /var/lib/mysql
        volumes:
          - "./mysql:/var/lib/mysql:rw"
    
      app:
        build: ./app/
        command: >
              python3 app.py
        depends_on:
          - my_db


    Обращаться к безе данных из приложения можно по имени сервиса, в данном случае my_db
    Ответ написан
    Комментировать
  • Рынок UX/UI дизайнеров заполнен?

    Natebash
    @Natebash
    React, Vue, Angular, Navite JS, Python / Node JS
    Я думаю все намного проще.

    Как и в любой IT профессии - на первом уровне(джуны), всё очень туго, на каждого работодателя по 200 откликов джунов, на втором уровне (мидлы), уже работодатель начинает бегать за программистом, на третьем уровне всё очень плохо - рынок почти пуст(очень мало хороших сеньоров, а если и есть - во первый они ищут свою место под солнцем - если не выгорели еще)

    Я думаю с дизайнерами такая же проблема, хороших дизайнеров с опытом 5-6+ лет очень мало, так как по мимо того что бы просто рисовать в фигме, или продуктах адобе - нужно отлично уметь в аналитику и видение продукта, а не просто перерисовывать дизайны из behance.
    Ответ написан
    2 комментария
  • Где в Chrome, нужно смотреть JS-события, применённые к элементу во время какого-либо действия с этим элементом?

    @alexalexes
    F12. Раздел "Элементы", выбираете элемент, на котором нужно посмотреть обработчик события. В области интерфейса для просмотра свойств элемента выбираете вкладку "Прослушиватели событий". Выбираете вид события, и выбираете точку входа в JS коде на это событие. Далее, при просмотре кода JS на вкладке "Источники" выбираете, где вам поставить точки останова, чтобы словить остановку выполнения обработки события.
    PS: Такой метод исследования работает только на ванильном или слабо прототипированном коде, написанный без применения библиотек и фреймворков. При использовании библиотек и фреймворков точки привязки событий будут указывать, как правило, на одну единственную функцию в этой библиотеке, отвечающей за высокоуровневый байндинг событий. В этом случае нужно изучать, какие инструменты для отладки есть в самой библиотеке или фреймворке.
    Ответ написан
    Комментировать
  • Какой Линукс пойдет на слабый ноутбук?

    justhostRU
    @justhostRU
    Любой. Ну выжмете вы 50-150 мб озу. а потом придёт браузер и выжрет 850.
    самое прожорливое не ОС, а современные сайты.
    linux тут не спасёт.
    если надо экономить озу, то ищите нетребовательные сайты, а не дистрибутив.
    Ответ написан
    1 комментарий
  • PSR6 и PSR16: в чем отличие?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Написано же в самом PSR-16:
    PSR-6 solves this problem already, but in a rather formal and verbose way for what the most simple use cases need. This simpler approach aims to build a standardized streamlined interface for common cases. It is independent of PSR-6 but has been designed to make compatibility with PSR-6 as straightforward as possible.


    Грубо говоря, 16 - это синтаксический сахар к 6.
    Ответ написан
    Комментировать
  • Как организовать отправку большого количества писем с помощью очередей?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    вы, наверно,пишите на чем-то скриптовом, ибо 50к коннекшинов в сутки - вообще плевая задача
    не плевая задача - организовать их доставку
    даже не знаю, как покороче
    гуглите , наверно, PowerMTA для начала https://www.sparkpost.com/powermta/
    ну и чтобы два раза не вставать - сразу закупайтесь тут , тем более скидка на пятницу есть вроде еще

    а так - в целом все правильно видите - насыпайте в очередь и обрабатываете, меняя доставщики в зависимости от...
    Ответ написан
    4 комментария
  • Resource: что из себя представляю потоки в php?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Я значительно переработал этот ответ, поскольку мне самому не нравились некоторые моменты плюс я обратил внимание на конкретные примеры из вопроса.

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

    Например, когда мы вызываем функцию fopen, то в результате мы получаем ресурс, который в себе содержит дескриптор файла, и далее мы уже можем работать с этим файлом не считывая его полностью в память.
    Как я понимаю, через потоки.. но что это за потоки ? где именно про них почитать ? это какие-то механизмы операционной системы ?

    Вот даже здесь, поскольку fopen работает поверх абстракции, нельзя говорить о едином подходе.
    Если у нас самый простой случай - локальный файл - то РНР оборачивает функции для работы с файлами языка С в свою собственную абстракцию. Но ниже - на уровне этих самых функций языка С - никаких потоков нет. Есть обращение к функциям операционной системы, которые просто позволяют прочитать выбранный кусок файла.
    Тут никаких вопросов нет, всё честно - если мы прочитали из файла 5 килобайт - значит потратили ровно 5 килобайт памяти.
    Но работаем мы с файлом не считывая его весь в память не потому что поток, а потому что так устроена файловая система. А поток этой возможностью только пользуется.

    Если же мы открываем не файл, а URL, то РНР начинает извращаться, пытаясь предоставить те же самые инструменты, какие мы используем для работы с файлами, для доступа к ресурсам совершенно другого типа.
    И здесь возможны нюансы. Я не знаю, как реализован HTTP wrapper, но в теории HTTP позволяет чтение произвольного объема данных через заголовок Range:. То есть РНР вполне может читать и из НТТР кусками, а не целиком.

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

    А упомянутый в вопросе PSR-7 вообще никакого отношения к потокам в РНР не имеет. Это совершенно отдельная реализация принципа потоков, которая не имеет отношения к потокам в РНР.
    Ответ написан
    Комментировать
  • Почему большой/объемный pull request это плохо (или хорошо)?

    было много ПР в промежуточную ветку, их ревьюила команда, к которой принадлежит разраб который сделал ПР;
    далее эти все коммиты/изменения были объединены в один ПР и он стал похож на страницу с содержанием книги с десятками коммитов, в то же время к ревью подключились разрабы из других комманд и ревью затягивается еще на несколько дней;

    Вам нужно решить, где чья ответственность. В большой команде не может каждый разработчик читать код каждого другого разработчика. Поэтому нужно просто делать адекватные коммиты/мелкие ПР и ревьюить их, а если они уже поревьюены - то не обращать на них внимания, т.к. это теперь не ваша ответственность.

    Почему вы повторно ревьюите этот же код, ещё и теперь объединённый в один большой ПР? Какой смысл? У вас что-то не так с организацией ответственности.
    Ответ написан
    4 комментария
  • Как сделать почасовой аккаунт?

    Вместо того чтобы делать почасовую проверку - просто записывай время покупки, и время действия премиума.
    А когда чел делает запрос какой-нибудь штуки, которая требует премиум - проверяй, не истекло ли время.
    Можно ещё кэшировать результат в какой-нибудь другой базе, чтобы не вычислять постоянно, - в том же редисе, например.
    Ответ написан
  • Как сделать дамп большой базы данных?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Ответ написан
    Комментировать
  • Как сделать дамп большой базы данных?

    @rPman
    у mysql нет адекватных методов управления приоритетами (есть low-priority yно оно действует на не все engines) поэтому исторически распределение нагрузки делают с помощью репликации.

    Поднимаешь второй сервер (физически файлы базы должны быть размещены на другом диске или даже сервере) и настраиваешь между основным и этим второстепенным master-slave репликацию, требования к этому среверу сильно ниже (зависит от нагрузки само сабой, но в основном там будут только записи) и уже на эту базу натравливаешь mysqldump

    p.s. альтернатива, запилить свой/подправить исходники mysqldump, в своем приложении скорость получения данных можно контролировать принудительными sleep-ами (например запрашиваешь табличку, а в цикле получения данных вставляешь раз на тысячу строк sleep).
    первый же нагугленный код mysqldump на php, вставь слип в этот цикл

    upd. не нужно править код штатной утилиты, более чем достаточно просто использовать штатный механизм потоков linux и замедлить запись итогового дампа с помощью к примеру cstream
    mysqldump ... | cstream -t $((1024*1024)) | zstd --ultra -T0 -o backup.sql.zstd


    p.p.s. тупо, останаливаешь базу, копируешь файлы с таблицами как есть, переносишь на свою машину, поднимаешь там ту же версию mysql, делаешь дамп
    Ответ написан
    1 комментарий
  • Как сделать дамп большой базы данных?

    rozhnev
    @rozhnev Куратор тега MySQL
    Fullstack programmer, DBA, медленно, дорого
    Добавьте ключ --single-transaction

    mysqldump -u root -p basename --single-transaction > path/to/file.sql
    Ответ написан
    1 комментарий
  • Почему PMA не дает приконнектиться?

    Pma и mysql в разных сетях. У pma так же должно быть
    networks:
          - app-network

    Или другая общая с mysql сеть
    Ответ написан
    1 комментарий
  • Как реализовать в MySQL топики форума, которые участвуют сразу в нескольких разделах?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Мне почему-то кажется, что 'поиск Fulltext' должен подойти для такой задачи,
    Вам кажется. Кроме того что фуллтекст вообще не для этого, он еще и работать будет относительно медленно, так как вариативность значений будет низкая. Про "удобство" работы со строкой вместо нормального индекса вообще молчу.

    Нужно, чтобы можно было быстро находить все темы (топики) для одного заданного раздела (искать тему, которая относится сразу к двум и более разделам не нужно).
    м2м, это надежно и быстро, достаточно знать индекс раздела.

    Как такое реализовать максимально просто?
    Совет: Не гонитесь за кажущейся простотой, вы хапнете гораздо больше гемора от неправильной архитектуры, нежели от еще 15 минут, потраченных на создание таблицы справочника, пивот таблицы и написания 2 джоинов в запросе. Важнее сделать правильно, а не проще.
    Ответ написан
    3 комментария
  • Как реализовать в MySQL топики форума, которые участвуют сразу в нескольких разделах?

    solotony
    @solotony
    покоряю пик Балмера
    если количество разделов постоянное и небольшое (т.е не будет проблем с индексами) то можете для каждого раздела завести отдельное BOOL поле в таблице

    но это конечно изврат и единственное нормальное решение - это M2M (использование таблицы).

    а Fulltext по своей сути это такое-же создание M2M индекса, только скрытое с недрах mysql
    Ответ написан
    8 комментариев
  • Уточнение типа в ООП. Где ошибка?

    @galaxy
    Парсер такое воспринимать не научен (да и писателю я бы по рукам надавал).
    return $x[0]::{$x[1]}();
    (это помимо того, что очевидно $x и $m перепутаны были после четвероточия)
    Ответ написан
    2 комментария
  • Как отрефакторить классы с неоднородными конструкторами?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Обычно делают REgistry

    FooInterface

    Service1Foo
    Service2Foo
    Service3Foo

    FooRegistry через теги или через call регаются конкретные сервисы, в фабрике получаем через type (если через call регали с нужным ключом) или в цикле прогоняя каждую зависимость и вызывая supports($type) у каждого из сервиса
    Ответ написан
    Комментировать
  • Как отрефакторить классы с неоднородными конструкторами?

    @Flying
    Я бы использовал service locator для формирования списка сервисов и передавал его в конструктор фабрики.

    Альтернативно можно определить фабрику как service subscriber, тогда формирование service locator'а будет, возможно, ещё проще.

    Если же каким-то образом (например через общий интерфейс или статический метод класса-фабрики), определить список сервисов, которые умеет создавать фабрика, то можно создать compiler pass, который будет формировать service locator на этапе компиляции контейнера через анализ их зависимостей. Это чуть сложнее, но не потребует править код при расширении списка создаваемых фабрикой классов.
    Ответ написан
    Комментировать