• Что стоит использовать для защиты PHP-кода на текущий момент?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Сообщество считает, что всё это бессмысленные ужимки, которые в 99% случаев используются только для того, чтобы прикрыть крайнее убожество кода. Серьёзные продукты никто не шифрует. Чем, в частности, объясняется заброшенность всех этих, на первый взгляд многочисленных, проектов, которые не выходят из стадии "мы тут с одноклассниками придумали крутую штуку". потом одноклассники либо умнеют и перестают теребить ерунду, либо находят занятие более интересное, чем пхпе.

    Сам по себе код мёртв. Он устарел ещё до релиза. В работе софта важна не дискетка с исходниками, а поддержка. Вот поддержку и надо продавать. И не дрожать над каждым вором. Потому что защита от одного вора отпугивает 10 честных покупателей.

    Плюс всегда есть SAAS.
    Ответ написан
    4 комментария
  • Оптимизация сайта под высокие нагрузки (php,nginx, mysql). Какие критерии доработок? Что необходимо сделать в первую очередь?

    ThunderCat
    @ThunderCat Куратор тега Веб-разработка
    {PHP, MySql, HTML, JS, CSS} developer
    Как уже заметили коллеги - первое что нужно выяснить - что тормозит.

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

    Что конкретно надо делать:
    1) Взять за шкирку самого разбирающегося в коде (если таковой существует в проекте), и дать задание описать базовый стек вызовов, если это какой-то самопис, или сразу расставить код замера времени с метками в случае понятной архитектуры. Что то типа такого(класс - древний костыль, но работает, так что матом не ругаться):
    Class Timer.php:
    class Timer {
    
        static $start;
        static $end;
        static $marks = [];
        static $formats = [1=>''];
    
        static function init(){
            if(empty(self::$start)) self::$start = microtime(true);
        }
    
        static function setMark($markName = ''){
            $time = microtime(true);
            if($markName == '')$markName = $time;
            $data['name'] = $markName;
            $data['time'] = $time;
            $res['time'] = $time;
            if(count(self::$marks) > 1)$res['diff'] = $time - self::$marks[count(self::$marks)-2]['time'];
            else $res['diff'] = 0;
            $data['diff'] = $res['diff'];
            self::$marks[] = $data;
            return $res;
        }
    
        static function timeFormat($number,$format = ''){
            if(empty($format)) $format = 3;
            return number_format ($number,$format,'.','');
        }
    
        static function report(){
            self::$end = microtime(true);
            self::$marks['start'] = self::$start;
            self::$marks['end'] = self::$end;
            self::$marks['all_time'] =  self::$end - self::$start;
            if(!empty(self::$marks)) return self::$marks;
        }
    }


    In code:
    \Timer::init()
    //some code block 1
    \Timer::setMark('after block 1');
    //some code block 2
    \Timer::setMark('after block 2');
    ...
    //some code block n
    \Timer::setMark('after block n');
    //near end of code 
    \Timer::setMark('end');
    var_dump(\Timer::report());
    exit;

    2) Смотрите на блоки жрущие время, делите их до атомарных операций путем деления блоков пополам таймерами.
    3) Смотрите что там происходит - оптимизируете*. И так по кругу.
    4) Профит.

    * Оптимизация
    Запросы:
    1) Смотреть план запроса (use explain, Luke!).
    2) Расставить индексы которых явно не хватает
    3) Смотреть не вызывается ли 50 запросов в цикле? Если да - выписать пенделя писавшему, затем переписать в 1 запрос с нормальным джоином.

    Код:
    Иногда запрос сложно оптимизировать, он вытаскивает много данных, хотя эти данные не часто обновляются. Такие запросы нужно кешировать, для чего используют быстрые ин-мемори хранилища типа редис или мемкеш. В крайнем случае в файлах...
    Чаще всего код тормозит на регулярках, хотя "хороший" программист может придумать и более креативные способы погреть процессор.

    Что нужно сделать обязательно кроме тестов и как тогда лучше спрашивать с разработчиков, если они предлагают размытые предложения? Хочется понять в какую сторону копать
    Бить палкой не вариант? Тогда берите других, эти испортились. Если разработчик не знает как выявить узкие места кода - нахрена он нужен? Код написать сегодня любой чат может... Ну, на крайняк дайте им вышеприведенный вариант решения проблемы...

    PS: Кстати, сервер может банально не выдерживать наплыв сетевых соединений, пните адимна, пусть глянет логи.

    PPS:
    достаточно 2000-4000 человек, заходящих в течение 20 минут на сайт
    это равномерные 3-4 рпс, ну или пусть в пике 50 рпс, должно держать даже на несложной конфигурации... Копайте код.
    Ответ написан
    Комментировать
  • Не могу удалить элемент input из списка - всегда удаляется последний?

    0xD34F
    @0xD34F Куратор тега Vue.js
    v-for="(address, i) in form.addresses_to" :key="i"

    всегда удаляется последний

    Конечно последний. Индекс в качестве ключа - хуже, чем ничего. Индекс ключом быть не может, думаете, что ключи есть, а на самом деле их нет. А если ключей нет, то

    Vue использует алгоритм, который минимизирует перемещение элементов

    Т.е., было в массиве N значений, на основе которых создано N элементов. Одно значение из массива выкидывается, значит, и элементов должно остаться N - 1. Какой удалить проще всего? - последний, не надо будет перемещать элементы, расположенные за ним.

    Сделайте нормальные ключи - добавьте объектам address свойства id, имеющие уникальные значения, и используйте их в качестве ключей.
    Ответ написан
    Комментировать
  • Нужно ли обычную форму обратной связи лендинга защищать от спам-ботов?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Нужно ли обычную форму обратной связи лендинга защищать от спам-ботов?

    Нужно.
    Если да, что можете посоветовать?

    От самопала, вроде скрытых полей, которые человек не увидит, зато увидит глупый спам-бот, до нормальных решений вроде reCAPTCHA или Yandex SmartCaptcha.

    Я использую именно reCAPTCHA (но не показываю ее, чтобы народ не злить), затем проверяю, если риски спама велики - шлю письма с высокими рисками на email с дополнительной пометкой (спам), письма автоматом сортируются в почтовом ящике по наличию спам метки, где приоритетные обрабатываются приоритетно (внезапно), а все остальные - если успеем.
    Ответ написан
    3 комментария
  • Как не ожидать выполнения функции?

    yesbro
    @yesbro
    Думаю, помогаю думать
    Запускать через очереди https://laravel.com/docs/10.x/queues
    Ответ написан
    Комментировать
  • Macbook Pro 16 M1Pro или Pro 14.2 М3?

    xez
    @xez
    TL Junior Roo
    Из этих двух - MacBook Pro 16.2" M1 Pro , 16 ГБ, 512 ГБ однозначно.
    8Гб - это слишком мало ОЗУ.

    Вообще рассмотрите вариант чтобы ОЗУ 32Гб было.
    Ответ написан
    4 комментария
  • Macbook air как рабочий ноут для системного администратора?

    @dronmaxman
    VoIP Administrator
    Петр, Как человек который работает на m1

    1с нужна

    Только через виртуализацию, лучше вынести на RDP.
    AnyDesk RDP.

    Работает, так же TeamViewer и RustDesk и VNC.
    Есть в пользовании и DGSы длинковские, где для настройки часто я использую консольный кабель.

    Работает через minicom. Кабель использую Viewcon VEN24, другие тоже работали.

    Winbox

    Работает, глюки бывают, но жить вполне можно. https://github.com/nrlquaker/winbox-mac

    x86 эмуляция крайне медленно работает, window 7 на M2 max еще терпимо, но windows 10 это как вернуться на HDD. M1 крайне тяжело эмулирует x86. Так же нет драйверов для Windows 11 arm который можно запустить в виртуализации, соответственно какие-то принтера, usb адаптеры - все идет в лес.

    В целом, я вынес приложение которые сложно или не возможно запустить под MAC на стационарный ПК и подключаюсь к нему по RDP. Использую VPN ZeroTier который не требует сервера и позволяет связать два ПК в одну сеть.

    С каждым годом софта на m1 все больше и жить все легче) В целом рекомендую, но стоит подготовиться, выписать на листочек нужный софт и найти аналоги под m1.
    Ответ написан
    Комментировать
  • Как повысить уровень создания проектов на чистом php?

    @koder_1
    Битрикс программист
    В 2005-2010 была мода, каждая веб-студия даже из одного программиста писала свою собственную cms, обычно на чистом php.
    По опыту написания своей цмс, могу сказать что со временем все равно это переходило в подобие своего фреймворка со своими классами, хелперами, со своими правилами в каких папках что хранить, как что называть, со своими общими функциями постраничного вывода, маршрутизации.

    Какой здесь вывод? На чистом php все равно никто не пишет, все равно создаётся свое ядро, свои наработки, которые используются от проекта к проекту. Всё равно создаётся свой фреймворк.

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

    На собеседовании поэтому можно так и спрашивать, а зачем писать на чистом php, если есть инструменты, которые ускоряют разработку?
    Ответ написан
    3 комментария
  • Laravel queue проблема с timeout, как исправить?

    @bavial
    Попробуй в config/queue.php в своем драйвере увеличить retry_after, например до 1800. Этот параметр отвечает за timeout, а не за то как он назван.
    Ответ написан
    2 комментария
  • Зачем уничтожать сессии после logout'а?

    DMGarikk
    @DMGarikk
    Lead Software Developer
    Ну в статье правильно написано, если вы будете менять в сессии пользователя, есть большая вероятность, да даже не вероятность, вы 100% на это наткнетесь, что другой пользователь получит доступ к данным и права другого пользователя. по этому проще сессию целиком уничтожить, чем заниматься постоянно валидацией прав и вычищением пользовательских данных после логаута
    Ответ написан
    Комментировать
  • Как высчитать высоту поля textarea при вставке в него значения через JS?

    Stalker_RED
    @Stalker_RED
    После вставки сравните elem.height и elem.scrollHeight, и если оно больше высоты - увеличивайте высоту.
    Ответ написан
    1 комментарий
  • Какое приложение написать для понимания ООП?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    Ты не поймешь сути ООП, если будешь писать в одиночку. Нужно проецировать это на команду.
    Ответ написан
    Комментировать
  • Какое приложение написать для понимания ООП?

    php666
    @php666
    PHP-макака
    на пхп
    на пхп есть два мира - академический и реальный

    в академическом мире люди пишут красивый ООП код, классы, интерфейсы и тд. Это же все спрашивают на собеседованиях.
    в реальном мире, в реальной работе, зачастую всё ООП заканчивается одними классами, редко трейты, редко интерфейсы, наследование не далее одного потомка. Особенно если уже используешь готовый фреймворк, где за тебя почти все сделано.

    php - не лучший язык, что бы на нем писать "полноценные" приложения на пхп. там должна быть какая-то ну очень сложная бизнес-логика.

    можно, конечно, нарисовать кучу классов, но это будет "ООП ради ООП"
    Ответ написан
    Комментировать
  • Какое оптимальное время въехать в проект?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    От проекта зависит. На моëм проекте например новичкам даже сеньорского уровня до первой простой таски требуется недели две, а выход на 100℅ эффективность занимает 3-6 месяцев.
    Ответ написан
    9 комментариев
  • Как найти участки кода несовместимые с PHP 8.1 версии?

    pxz
    @pxz
    ✔ Совет: Вам помогли? Отметьте ответы решением.
    Есть специальная тулза для этого — Rector.

    Позволяет выбрать целевую версию PHP и покажет в отчёте места, н совместимые или написанные в стиле старых версий. Также позволяет большинство участков кода отрефакторить автоматически.

    https://github.com/rectorphp/rector
    Ответ написан
    3 комментария
  • Как обрезать слишком длинный текст при выводе?

    0xD34F
    @0xD34F Куратор тега Vue.js
    data: () => ({
      maxlen: 10,
      items: [
        'hello, world!!',
        'fuck the world',
        'fuck everything',
        '1234567890',
        'Lorem ipsum dolor sit amet, consectetur adipiscing elit,',
       ],
    }),
    methods: {
      short1: (str, maxlen) => str.length <= maxlen ? str : str.slice(0, maxlen) + '...',
      short2: (str, maxlen) => str.substring(0, maxlen) + (str.charAt(maxlen) && '...'),
      short3: (str, maxlen) => str.replace(RegExp(`(.{${maxlen}}).+`), '$1...'),
      short4: (str, maxlen) => str.replace(RegExp(`(?<=.{${maxlen}}).+`), '...'),
    },

    <input type="range" min="1" max="20" v-model="maxlen">
    <span>{{ maxlen }}</span>
    
    <div v-for="n in items">
      <div v-text="short1(n, maxlen)"></div>
      <div v-html="short2(n, maxlen)"></div>
      <div :text-content.prop="short3(n, maxlen)"></div>
      <div>{{ short4(n, maxlen) }}</div>
    </div>

    https://jsfiddle.net/dxm0gsnf/
    Ответ написан
    Комментировать
  • В какую дружественную страну переехать из России чтобы продолжить работать на Upwork?

    @medlas
    Эритрея, там тепло!
    Ответ написан
    Комментировать
  • Почему много HTTP запросов - это плохо?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Тебе когда надо достать из холодильника 5 бутылок пива, что проще - открыть холодильник, взять 5 бутылок пива и закрыть холодильник, или открыть холодильник, взять бутылку, закрыть холодильник, открыть холодильник, взять бутылку, закрыть холодильник, открыть холодильник, взять бутылку, закрыть холодильник, открыть холодильник, взять бутылку, закрыть холодильник, открыть холодильник, взять бутылку, закрыть холодильник?
    Ответ написан
  • Как работается с UX/UI на MacBook Air 13 дюймов?

    iiiBird
    @iiiBird
    Пока ты спишь - твой конкурент совершенствуется
    любой ноутбучный дисплей будет неудобнее чем полноценный десктоп. если ты привык к своим 24", то тебе одинаково неудобно будет что на 13", что на 16". поэтому переплачивать за 16", если тебе кроме дисплея от него больше ничего не нужно - смысла нет.
    Ответ написан
    Комментировать
  • Что в себя включают «Системные данные», занимающие слишком много места?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Бежит лиса по лесу, вдруг из кустов:
    - Ку-ка-ре-ку....
    Лиса - в кусты. Там возня, шорох, визги. Выходит волк, застегивая ширинку и поправляя штаны:
    - Вот что значит знание иностранных языков!


    Я в маках ни бельмеса, но вижу что вопрос уже сутки висит в топе без ответа.
    При том что достаточно перевести свой вопрос на иностранный, как в интернете сразу находится куча информации.
    Вот например буквально такой же вопрос на реддите, What is System Data on Mac and why is it at 335.22GB?!
    То есть в первую очередь надо перезагрузить свой мак.

    Так же гуголь находит много других рекомендаций по очистке "системных данных" AKA "System data". И чтобы ими воспользоваться, надо всего лишь немного знать английский.
    Ответ написан
    5 комментариев