Задать вопрос
  • Как правильно обновить OpenSSH server на ubuntu?

    ky0
    @ky0
    Миллиардер, филантроп, патологический лгун
    Уверены, что в инструкции для Убунты сказано качать сорсы от OpenBSD?

    Почему просто пакет из репозитория не скачать, зачем все эти пляски с самостоятельной сборкой (особенно если неуверенно себя в ней чувствуете)?
    Ответ написан
    Комментировать
  • Можно ли настроить запросы к php через вебсокет и http одновременно?

    3. Вебсокет и unix сокет - это совершенно разные вещи. Websockets - это протокол обмена информацией по TCP/IP.
    Как работают websockets:
    - Клиент начинает с простого HTTP запроса с просьбой апгрейднуться до websockets.
    - Сервер соглашается, и тогда между Клиентом и Сервером устанавливается постоянное TCP/IP соединение, по которому данные могут ходить туда-обратно по протоколу websockets уже без кучи церемониальных ритуалов, как принято в обычном HTTP.

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

    2. Что можно использовать:
    - Ratchet
    - Swoole / OpenSwoole
    - Workerman

    У каждой из этих асинхронных библиотек/фреймворков есть свои особенности и нюансы. Но это всё очень хорошо описано в их документации, так что просто следуйте тому, что там написано, и не волнуйтесь. Советовать что-то одно не буду, потому что на вкус и цвет все фломастеры разные, и выберете то, что будет отвечать вашим конкретным задачам.
    Ответ написан
  • Как двумерный массив записать в одномерный php?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    $result = array_merge(
        $arrayOne,
        array_combine(
            array_column($arrayTwo, 'Field'),
            array_column($arrayTwo, 'info'),
        ),
    );
    Ответ написан
    Комментировать
  • Как называется паттерн, который добавляет объекту новый функционал?

    Adamos
    @Adamos
    По описанию - одному объекту наваливается куча ответственности, да еще динамически - больше похоже на нарушение S в SOLID и антипаттерн "Божественный объект".
    Ответ написан
    3 комментария
  • Как называется паттерн, который добавляет объекту новый функционал?

    GavriKos
    @GavriKos
    Программисты делятся на два типа - те которые знают и используют паттерны, и те которые не знают но все равно используют.

    С учетом впецифики юнити, которая не допускает вообще нормального new компонентам, и специфики шарпа с отсутствием мультинаследования - какая разница что это? Читая заголовок я бы вообще сказал что это наследование (а что, добавление функционала).

    Билдер - это как фабрика - это то что КОНСТРУИРУЕТ объект, а не сам объект. ИМХО.
    Пилите игру. пофиг на имена.
    Ответ написан
    2 комментария
  • Могла ли Ubuntu обрубить интернет на Windows?

    Adamos
    @Adamos
    Как-то сумбурно и без упоминания очевидных первых шагов:
    1. Выдернуть и вставить кабель - банально мог вылететь, пока ставил линь с флешки. Если сетевая карта не интегрированная, то ее вылет из PCI - вообще самое вероятное, что произошло.
    2. Залезть в БИОС и проверить, не отключена ли там сетевуха. Особенно если влезал туда при установке.
    3. Рассмотреть возможности подключить к кабелю что-то другое или к сетевухе - другой шнурок.
    4. Подключить мобилу модемом через USB, наконец. Что уж без интернета-то сидеть ;)
    Ответ написан
    1 комментарий
  • Что такой общий вклад во вкладке пользователей?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    3 комментария
  • Как настроить проброс портов 80 и 443 на роутере?

    NeiroNx
    @NeiroNx
    Программист
    Если роутер не хочет настраиваться как надо - его лучше заменить. Не у всех вменяемые прошивки. Ну или перешить на OpenWRT если поддерживает.
    Ответ написан
  • Почему возникает ошибка (T_VARIBLE)?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Когда пишет unexpected '$sql' (T_VARIABLE) это значит, что проблема в конце предыдущего выражения.
    Поднимаем глаза, смотрим на конец предыдущего выражения, и видим, что с ним не так.
    Ответ написан
    Комментировать
  • Сыпится (пикселится) картинка на мониторе?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Отвал памяти либо чипа видеокарты. Лечится перепайкой чипов в СЦ. Меньшая вероятность - выход из строя памяти или чипа, в этом случае тогда только замена неисправного чипа. Если видеокарта старая или из дешёвых затычек - выкидывается и заменяется новой, т.к. дешевле купить новую или б/у (с проверкой, само собой), чем заниматься некромантией.
    Ответ написан
    2 комментария
  • Какой процессор посоветуете?

    xez
    @xez Куратор тега Железо
    TL Junior Roo
    Lga1700 мёртвый сокет же. Если хочется на интеле - то лучше на 1851. Ну и 13-14 серии лучше обходить стороной.
    Насчёт процессоров АМД - никаких «нежданичков» там давно нет.
    Ответ написан
    5 комментариев
  • Почему PHP считает int числа после математических операций как float?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Так как в выражении одним из операндов присутствует деление, результатом которого будет число с десятичной частью, естественно все дальнейшие действия будут переводить операнды в совместимый формат - с плавающей запятой. Читать про неявные преобразования в языках со слабой типизацией.
    Ответ написан
    Комментировать
  • Почему не включается компьютер?

    SignFinder
    @SignFinder
    Wintel\Unix Engineer\DevOps
    Как минимум судя по фото, у вас обе планки памяти рядом во втором канале стоят. Стоит почитать инструкцию по эксплуатации материнской платы.
    В ней даже красным воскликательным знаком выделено про то, что установка важна в определенные слоты.
    Ответ написан
    1 комментарий
  • Откуда на маркетплейсах новые ноутбуки с процами 5-6 летней давности?

    @Drno
    скупают БУ и рефабают..
    либо ноуты не новые а после майнинга, например теже Hasee TX9 на интеле + 3070 )
    Ответ написан
    Комментировать
  • Как добавить русский текст в fpdf?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    У меня иероглифы, там где русские буквы

    Как распознать кракозябры:
    670d4c201254a086434124.png
    Ответ написан
    Комментировать
  • Как добавить русский текст в fpdf?

    Adamos
    @Adamos
    FPDF официально не поддерживает Unicode.
    Выкиньте ее и забудьте, просто используйте mPDF.
    Ответ написан
    9 комментариев
  • Как исключить первую запись в базе данных?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    offset 1 при небольших значениях offset самое адекватное

    PS: mysql_query? перепроверил какой нынче год в календаре
    Ответ написан
    1 комментарий
  • Как объединить запросы в транзакцию?

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

    Сначала общая информация:

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


    Самым простым вариантом будет заключить запросы между вызовами beginTransaction() и commit(), как показано например в документации к последнему.
    $db->beginTransaction();
    $db->prepare("UPDATE `tab1` SET `col` = ?")->execute($data1);
    $db->prepare("UPDATE `tab2` SET  `col` = ?")->execute($data2);
    $db->prepare("UPDATE `tab3` SET  `col` = ?")->execute($data3);
    $db->commit();

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

    Соответственно, при ошибке в любом из запросов транзакция автоматически откатится. А при успешном выполнении всех запросов транзакция, соответственно, закоммитится.

    В редких случаях, когда после отката транзакции предполагается дальнейшее выполнение кода, можно заключить код транзакции в try-catch и откатить её вручную.

    Важно помнить некоторые особенности.
    • в mysql не все движки таблиц поддерживают транзакции. впрочем ,учитывая что innodb является движком по умолчанию уже лет 20, это вряд ли будет проблемой
    • запросы на изменение страктуры таблиц автоматически коммитят стартовавшую транзакцию, то есть их следует избегать. Кажется, в новых версиях какие-то уже не коммитят, но я предпочитаю избегать всё равно.


    Также желательно помнить, что в любом более-менее сложном коде очень быстро появляются вложенные транзакции, а PDO при попытке стартовать транзакцию при уже открытой, выбросит исключение, что, соответственно, приведёт к откату родительской (и это гораздо лучше поведения MySQL по умолчанию, которая автоматически коммитит старую). И имеет смысл накидать простой кодик, который считает вложенные транзакции, и не стартует, если уже был старт, а при коммите вычитает вложенность, а реально коммитит только если вложенности не осталось. Что-то вроде кода из комментариев к beginTransaction(), подравняв его напильником
    class \MyPDO extends \PDO
    {
        protected $transactionCounter = 0;
    
        public function beginTransaction()
        {
            if($this->transactionCounter++ === 0) {
                return parent::beginTransaction();
            }
        }
        public function commit()
        {
            $this->transactionCounter--;
            if($this->transactionCounter === 0) {
                return parent::commit();
            }
        }
        public function rollback()
        {
            $this->transactionCounter = 0;
            return parent::rollback();
        }
    }

    разместив его либо прямо в PDO, либо в своем враппере.
    Ответ написан
    3 комментария
  • БД для дискорд-бота?

    @Everything_is_bad
    А что именно ты там хранишь нам угадывать, да? Ок, хрустальный шар говорит, что надо сменить на нормальную sql базу.
    Ответ написан
    3 комментария
  • Разбивка на страницы?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Чтобы ограничить количество выводимых страниц требуется знание арифметики в пределах начальной школы.
    Чтобы вместо 1 и $num_pages использовать заранее рассчитанные значения, укладывающиеся в определённый интервал. Например 10 страниц.
    То есть надо всего лишь определить начальную и конечную цифры, которые подставлять в for вместо 1 и $num_pages.
    Например, если мы хотим выводить только 10 страниц, а текущую выводить посередине то для получения первой цифры надо отнять от текущей 4. Затем к ней надо прибавить 9 - так мы получим второе число.
    При этом, разумеется, надо проверить, чтобы первое не было меньше 1, а последнее - больше $num_pages.
    А дальше просто подставить их в for. Вот и всё.
    Ответ написан
    2 комментария