Задать вопрос
  • How best to scale a php application?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    You need to make your mind first, whether you want to "scale up" which means to split the processing between different servers, or you are not even sure yet, whether adding different instances is a good thing at all.

    Generally scaling up a web application indeed means providing dedicated hardware for the every major service involved. For your setup I'd make it four different servers
    - PHP/Nginx instance
    - database backend dedicated for Postgres
    - column database backend to host Clickhouse
    - processing backend to host rabbitmq and Golang microsevices

    The good thing, each of those can be easily scaled up in turn by simply adding more instances of the kind (I am not sure how it's done for Clickhouse tho).

    But I have a feeling that you are probably confusing the scaling up with just performance optimization. And you need to start from the latter. Simply checking the CPU load is tоo rough a measurement. You need a full qualified profiling to pinpoint certain bottlenecks.

    From such incomplete data I can only guess that Laravel configuration is not quite optimal. 75 rps shouldn't be a problem for such a hardware. Make sure you have all production environment settings configured properly - all caching is turned on, etc. Also, switching to 7.4 and preloading could also help.
    Ответ написан
    3 комментария
  • Как можно сделать чтобы из друх таблиц информация объединялась в одну?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Удалить таблицу main - за полной её ненадобностью и бессмысленностью. Вместо неё создать представление на основе остальных двух таблиц,
    Ответ написан
    Комментировать
  • Стоит ли учить php в 2021 году для разработки web приложений и сайтов?

    @thisuserhatephp
    Офлайн - losers Онлайн - lusers
    Никогда не понимал причем тут год и яп. Прыщавые иксперты с дырявыми мозгами и мне в свое время давали такие советы и наставления, мол не учи то, не учи се, сейчас такой-то год....
    Когда же вы поймете, что стек нужно выбирать не смотря на календарь, а исходя из тз которое решает данный стек. Если твою задачу лучше всего решает паскаль, то плевать какой сейчас год, хоть 5021-ый, нужно выбирать паскаль, а не что-то другое, потому что васян в коммах на форуме написал "паскаль в 2021 ? пхпхпха"

    Актуально ли php в 2021 году и стоит ли учить его?

    Если тебе позволяет время, то учить нужно все, что связанно с твоим стеком, а так кончено же актуально
    Ответ написан
  • Где взять годный туториал по Composer?

    pOmelchenko
    @pOmelchenko
    php-developer
    Композер это пакетный менеджер, ты просто описываешь какие у тебя в проекте будут зависимости. Он так же рулит автозагрузкой классов.

    То есть по сути, на минималках. Любой проект будет иметь примерно следующую структуру composer json

    {
      "name": "pomelchenko/project",
      "type": "project",
      "description": "description",
      "minimum-stability": "stable",
      "license": "proprietary",
      "require": {
        "php": "^7.4",
        // тут зависимости для продакшена, когда будешь устанавливать приложение с флагом --no-dev
      },
      "require-dev": {
        "phpunit/phpunit": "^9.5"
        // тут зависимости для dev среды, с тестами и прочими инструментами которые несут вспомогательный смысл.
      },
      "autoload": {
        "psr-4": {
          "App\\": "src/"
          // тут перечисляешь нэймспэйсы и пути до директорий с классами этих нэймспэйсов для приложения, которое будет на проде крутиться
        }
      },
      "autoload-dev": {
        "psr-4": {
          "Tests\\": "tests/"
          // тут перечисляешь нэймспэйсы и пути до директорий с классами этих нэймспэйсов для вспомогательных инструментов, как правило для тестов
        }
      }
    }


    После установки у тебя появится ./vendor/autoload.php который ты во фронтконтроллер подключишь чтобы всё заработало.

    По сути всё. Остальное придет по необходимости во время работы.

    Нужны тесты? Ставишь в phpunit так, чтобы он оказался в require-dev, то есть composer require --dev ...
    Нужны пакеты для работы приложения? Например, роутер или орм, просто ставишь composer require ...

    Ничем более как менеджмент зависимостей композер не занимается. В смысле на бизнеслогику и инфраструктуру (ну кроме как автолоад классов и файлов) проекта он никак не влияет.
    Ответ написан
    Комментировать
  • Где применяются key(), next(), current()?

    rpsv
    @rpsv
    делай либо хорошо, либо никак
    1. зачем?
    2. потому что этим "методам" (функциям) не хватает еще одного: reset. С таким же успехом могли задать вопрос "а зачем нужны key и current, если нельзя сдвинуть указатель?"
    3. потому что кто-то не знает языка, или хотя бы банально не видит что key возращает 0 на втором элементе и цикл заканчивается.

    Дело раскрыто, это не баг языка, а неопытный "программист".
    P.S. предлагаю следующий вопрос "а зачем while, если можно foreach?"
    Ответ написан
  • Где применяются key(), next(), current()?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    У вас не полный список функций, есть ещё reset(), end(), each() и prev().
    Двигаться по массиву таким образом можно в обе стороны, в отличие от foreach.
    Ответ написан
    2 комментария
  • Почему с let работает а с var нет?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    У var область видимости функции, на каждой итерации цикла мы имеем дело с одной и той же переменной.
    У let - область видимости блока, на каждой итерации цикла новая переменная
    Ответ написан
    4 комментария
  • Где применяются key(), next(), current()?

    DevMan
    @DevMan
    1. это не методы, это функции.
    2. они используются по своему прямому назначению.
    3. что вы делаете в js не имеет никакого отношения к этим функциям.
    Ответ написан
    21 комментарий
  • Как сделать сайт рабочим до определённого времени?

    rozhnev
    @rozhnev Куратор тега PHP
    Fullstack programmer, DBA, медленно, дорого
    Добавьте в index.php
    $hour = date('H:i');
    if ($hour < '08:00' || $hour > '23:00') die('Closed');


    run php online
    Ответ написан
    Комментировать
  • Как откатить изменения только у одного файла на несколько коммитов?

    Заходите в историю комитов, находите нужный, открываете в нём искомый файл, ctrl+a, ctrl+c, ctrl+v, ctrl+k.
    Ответ написан
    Комментировать
  • Как откатить изменения только у одного файла на несколько коммитов?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    В терминале пишем
    git checkout хеш_коммита -- полное_имя_файла
    и состояние файла вернётся к тому, что было после коммита с указанным хешем.

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

    yaleksandr89
    @yaleksandr89 Автор вопроса
    PHP developer
    Есть схожая тема, но информация устарела.

    Я использую PhpStorm 2021.1.1 и пункт "Align key-value pairs" находится не во вкладке "other" (её вообще нет), а во вкладке "Wrapping and Braces".

    Подытожив, что бы реализовать автоматическое форматирование отступов в массиве необходимо перейти в "Editor"->"Code Style"->"PHP", на вкладке "Wrapping and Braces" спуститься к пункту "Array initializer" и выставить опцию "Align key-value pairs"
    Ответ написан
    Комментировать
  • Как сменить пароль на СУБД не прерывая работу приложения-клиента?

    @AUser0
    Чем больше знаю, тем лучше понимаю, как мало знаю.
    На хосте1 одной командой (sed -i) меняется пароль в файле настроек, и через точку-с-запятой (;) второй командой (sql-client-tool <cmd.sql) отправляются инструкции SQL-серверу на смену пароля. Время выполнения - микродоли секунды, моргнуть не успеете.
    Ответ написан
    Комментировать
  • Как парсить сайты на технологии web socket?

    @StiflerProger
    const WebSocket = require('ws');
    
    const ws = new WebSocket('wss://dallas.tx.publicsearch.us/ws', {
      headers: {
        "Origin": "https://dallas.tx.publicsearch.us",
        "Cookie": "authToken=51f69ac5-67c5-41ac-8943-cace7ebc6b3c; authToken.sig=x9S_G8Lwy6KHaB2Ek4PT1PR7jhE;"
      }
    });
    
    ws.on('open', () => {
      console.log('Соединение открыто');
    });
    
    ws.on('close', (code, reason) => {
      console.log('Соединение закрыто', code, reason);
    });


    у всех сайтов свои тараканы будут) к примеру в том что я скинул выше. Тебе обязательно передавать в заголовке запроса Origin и Cookie. Если с первым все ясно, то первая проблема будет с куками. Их как я понял можно получить сделав обычный GET запрос на главную. Тебе эти куки передадут в Response Headers
    606c101d381a7125759663.png

    https://www.npmjs.com/package/ws

    После удачного коннекта, не забывай потом слать пинги ) Формат пингов уже посмотришь во вкладке Network в браузере
    Ответ написан
    Комментировать
  • Как выделить символы одной регуляркой?

    @galaxy
    U+0008

    так обычно обозначаются Unicode codepoints. Без задания кодировки это обозначение физического воплощения не имеет, вообще говоря (а строки в PHP ничего не знают о кодировках). Так что для начала разберитесь, в какой кодировке у вас исходная строка.
    В строке из примера кодировка UTF8, указанные символы просто из нижнего непечатного диапазона, их можно выделить так: [\x00-\x19]+
    Ответ написан
    Комментировать
  • На чем исполнять несложный интернет-магазин?

    neuotq
    @neuotq
    Прокрастинация
    Советую брать что-то готовое. Потому как если проект будет живой и работать, в любом случае будут вылезать те или иные косяки, недоработки и т.п.
    Так что берите например тот же вукомерс, базовый набор и вперед.
    По умолчанию ничего сложного, куча всего уже готово(интеграции и проч) легко кастомизируется. Это же можно сказать и про многие другие.
    Либо вообще выбрать платформу вроде insales.
    Писать свое не рекомендую. Тем более если условно простое. Больше смысла писать свой продукт под нечто большое, с уникальными требованиями и тп, на что потом будут готовы выделять ресурсы. А так будет просто мертворожденное решение и проблема у владельцев если нужно что-то допилить.
    Ответ написан
    2 комментария
  • SQL инъекция в UPDATE возможна ли?

    Fernus
    @Fernus
    Техник - Механик :)
    Смысл есть!

    UPD:
    Поясню...я тебе в $id передам 9999 or 1 = 1 и все записи нафиг потерпят изменения!
    Ответ написан
    2 комментария
  • SQL инъекция в UPDATE возможна ли?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Инъекция может быть через любой запрос.
    И защищать тоже надо любые запросы.
    Никогда не надо торговаться, "а можно я не буду защищать именно этот запрос? Ну мааааам!"
    Надо просто всегда следовать простым правилам - любая переменная попадает в запрос только через плейсхолдер

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

    Уязвимость — это сама возможность с помощью переданных в запрос данных изменить его код.
    Даже если ты не знаешь ни одного способа ей воспользоваться, уязвимость от этого никуда не девается.
    Даже если та возможность, про которую ты знаешь, в данном случае не прокатит - остаются ещё тысячи других.
    Если есть уязвимость, то способы ей воспользоваться всегда найдутся.

    То есть сама уязвимость никак не зависит ни от каких второстепенных факторов - типа запроса, передаваемых данных, способов их валидации, твоих знаний SQL. Это сам факт. Можно подставить свой код в запрос? Значит он уязвим. А как конкретно можно нагадить - это отдельная тема.

    Кроме того, любая уязвимость - это всегда ошибки. Если в $id будет пусто, то запрос вызовет ошибку. Если в $id будет слово select то запрос вызовет ошибку. Если будет слово "привет", то запрос вызовет ошибку. Оно тебе надо?

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


    Если вопрос "а можно я не буду защищаться?" вызван ленью, то это тоже решаемо. В принципе, лень - это очень важное качество для программиста. Главное - направить её в нужное русло.

    Если каждый раз писать по три строчки долго
    $sql = "INSERT INTO users SET email = ?, password = ?"; // заменяем на знаки вопроса
    $stmt = $db->prepare($sql); // подготавливаем запрос, получаем stmt
    $stmt->bind_param("ss", $email, $hash); // два знака вопроса - две переменных - две буквы s
    $stmt->execute(); // выполняем запрос

    То надо воспользоваться такой вещью, как программирование. И написать функцию, которая возьмет на себя всю рутинную работу.
    function prepared_query($mysqli, $sql, $params, $types = "")
    {
        $types = $types ?: str_repeat("s", count($params));
        $stmt = $mysqli->prepare($sql);
        $stmt->bind_param($types, ...$params);
        $stmt->execute();
        return $stmt;
    }

    и в итоге предыдущие 4 строчки превратятся в одну:
    prepared_query($db, "INSERT INTO users SET email = ?, password = ?", [$email, $hash]);

    или твой запрос:
    prepared_query($db, "UPDATE table SET test WHERE id = ?", [$id]);

    - просто, быстро, удобно и безопасно
    Ответ написан
    26 комментариев
  • Провайдер режет TCP/UDP сессии через 240 сек неактивности, что делать?

    gbg
    @gbg Куратор тега Компьютерные сети
    Любые ответы на любые вопросы
    Висящие сессии TCP и UDP вкусно кушают провайдеру порты NAT (видимо, он совсем мелкий и местечковый), так что ему надо как-то выкручиваться.

    Никакого RFC он не нарушает - это Интернет, отрыв соединения является нормой.

    Что делать - настройте KeepAlive, или примените autossh, он постоянно шлет байтики в дополнительном соединении
    Ответ написан
    1 комментарий