Профиль пользователя заблокирован сроком с 10 апреля 2022 г. и навсегда по причине: систематические нарушения правил сервиса
  • Как сделать чтобы большая БД держала нагрузку?

    Melkij
    @Melkij
    PostgreSQL DBA
    Ооо.... Вы это сейчас вообще серьёзно?

    Если вы запускаете DBaaS платформу и не знаете что делать собственно с базами - то у вас не
    Запускаю свою облачную платформу, код и архитектура создана с нуля.

    У вас нет вообще абсолютно ещё ничего и уж архитектуры - в особенности. Кроме "идеи", над которой бьётся давно и много кто, при том имея ресурсы на собственные команды DBA.

    Например: юзер пишет какой-то запрос и ему не нужно указывать на какой сервер что отправлять или откуда читать, для него это один сервер.

    Значит этому юзеру достаточно ходить только на мастер.
    Для сферического в вакууме приложения нет средств автоматически распределять запросы по репликам. И такое сделать вовсе невозможно без накладывания ограничений на использование. Например,
    select somefunc();
    Что делает эта функция? Она только читает данные и потому можно отправить на реплику или она пишет и потому должна быть на мастере? Хотите правильный ответ от контрибьютора postgresql? Это достоверно не знает даже сама база до тех пор пока не выполнит функцию.

    Другой пример:
    begin isolation level repeatable read;
    select ...
    update ...
    commit;

    Как максимум на запросе select вы должны уже знать можете ли вы эту транзакцию отправить на читающую реплику. Откуда бы вам это узнать заранее?
    И прочие принципиально-нерешаемые вопросы.

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

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    Для таких случаев придумали docblock (а начиная с php 8 - union типы):

    # PHP 7+

    declare(strict_types=1);
    
    /**
     * @param int|string|float $a
     * @param int|string|float $b
     * @return string
     */
    function summ($a, $b): string {
        return bcadd((string)$a, (string)$b);
    }


    # PHP 8+

    declare(strict_types=1);
    
    function summ(int|float|string $a, int|float|string $b): string {
        return bcadd((string)$a, (string)$b);
    }


    P.S. Помимо этого можно кастовать результат к инту, если он в пределах допустимого int32/int64 (зависит от ОС и сборки пыха) значения
    return $result > \PHP_INT_MAX ? $result : (int)$result;
    Ответ написан
    Комментировать
  • Как настроить временную зону в Crontab + Php?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    При запуске кроном скрипт запускается через CLI и значит изменения в Apache2/php.ini не будут использоваться.
    Обычно есть отдельно файл cli/php.ini, в нём и выставляйте зону.

    Так же зону можно глобально выставить в самом скрипте
    date_default_timezone_set('Europe/Moscow');

    И конечно же соглашусь с ответом выше - лучше использовать timestamp - time() или DateTime::getTimestamp() чтобы не зависеть от локальных настроек.
    Ответ написан
    Комментировать
  • Где найти единомышленников по веб-разработке?

    ThunderCat
    @ThunderCat Куратор тега Веб-разработка
    {PHP, MySql, HTML, JS, CSS} developer
    Во первых Рональд Макдональд прав на все 200%, ни один идейный фрилансер в здравом уме не будет тратить время на бла-бла, при этом еще и взращивая конкурентов. Что касается проф. роста - ищите роадмап развития по своей специализации и по ней развивайтесь, там все как в онлайн-играх - ветки талантов, скилы, единственный бонус - можно качать все ветки сразу (если пупок не развяжется). Ну и все как в играх - пока ты спишь - враг качается )
    Ответ написан
    4 комментария
  • Как вывести фигуру полые песочные часы из псевдографики в bash?

    @pfg21
    ex-турист
    гуглить "управляющие последовательности shell".
    https://www.opennet.ru/base/dev/console_ctl.txt.html
    https://habr.com/ru/post/325082/
    Ответ написан
    Комментировать
  • Как сделать чтоб при булевом значении было умножение и деление?

    irishmann
    @irishmann
    Научись пользоваться дебаггером
    function test ($a, $b, $bool = false){
        $result = 0;
        if($bool){
            $result = $a / $b;
        } else {
            $result = $a * $b;
        }
        return $result;
    }
    var_dump(test(5, 6, true));
    var_dump(test(5, 6));
    Ответ написан
    1 комментарий
  • Как поставить KPHP и KDB?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    LinuxGod, PHP 7.x по скорости будет сопоставим с любым из имеющихся веб языков, как альтернатива kphp - phalcon php project - попытка создать модули mvc модели на более быстром Си, однако, не смотря на плюшки в виде более-менее вменяемого ооп и нормального мвц, тоже имеет ряд проблем. В частности надо будет от души потанцевать с бубном вокруг установки этой вундервафли и более-менее свежих либ под нее. В итоге на данный момент пхп 7.х вполне сопоставим по скорости исполнения чистого пыхового кода с фалконовскими сишными модулями.
    Вывод - на сегодня нет смысла юзать неподдерживаемое / малоиспользуемое гуано, когда нативный пых в принципе не сильно отстает, кроме того в вебе 99% задержек и тормозов СОВСЕМ не относятся к исполнению чистого кода, большую часть времени пых простаивает в ожидании запросов к бд и файловой системе.
    Ответ написан
    Комментировать
  • Какой вариант из двух выбрать: передаче по ссылке, или без?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Если вопрос по ссылке или без - то однозначно ответ лучше передавать не по ссылке, так как меньше шансов выстрелить себе в ногу.
    Но как написали выше, тут напрашивается рефакторинг, так как почему функция с названием checkPermissions() производит модификацию данных?
    То есть это скорее getAvailablePermissions() или filterResponsePermissions() или типа того.

    upd. Единственное что даст передача по ссылке, это экономия памяти, так как при передаче по ссылке не будут создаваться копии $permissions и $responses, но если у вас эти массивы не на сотни тысяч элементов, то экономить нечего.
    Ответ написан
    Комментировать
  • Как использовать linux сервер на windows 10?

    @BATPYIIIKOB
    PHP, JS
    занимаюсь веб разработкой в основном на linux сейчас хочу перейти на windows 10

    Интересно, что такое понадобилось в Винде10 для разработки, чего нет в линухах?

    хочу перейти на windows 10

    Ubuntu 18 при установке чекает систему на диске, если стоит винда, то предлагает добавить в загрузчик винду, устанавливается без проблем и у вас будет 2 ОС. Предварительно на винде разбейте диск под ubuntu.

    какое нибудь решение как использовать linux сервер на windows

    Docker твоё всё! Пора прекращать пользоваться готовыми "пирогами" типа OpenServer и еже с ним. Запускаешь на нём необходимые контейнеры под линуха. Но на винде порой работает кривовато, что касаемо настроек путей и монтирования проектов в контейнеры.
    Ответ написан
    1 комментарий
  • Как правильно получить и записать последний id?

    @matios
    Technical Team Lead
    1. Если у вас 2 разные формы, которые нужно связать через userId, то после сохранения первой формы, вы получаете id сохранённой записи и при показе второй формы поставляете полученный id в hidden поле user_id, которое будет отправляться на сервер вместе со второй формой
    2. Если все данные отправляются одним запросом, то все ещё проще. При сохранении данных в первой таблице полученный id передаёте вместе с остальными данными в метод для сохранения второй части и записываете этот id в колонку user_id
    Ответ написан
    6 комментариев
  • Как предоставить доступ к каталогу сервера по ssh без доступа к консоли?

    DevMan
    @DevMan
    настроить sftp и запретить консоль.
    как пример – https://www.digitalocean.com/community/tutorials/h...
    Ответ написан
    Комментировать
  • Объясните мне как & $school ссылается на объект, а не на какую-то копию?

    xEpozZ
    @xEpozZ
    Веб-разработчик
    Чтобы перейти к работе с объектами, давай попробуем поработать с другими типами данных, например, с массивом.
    $array = [1, 2, 3];

    Здесь мы задали переменной $array значение в виде массива с числами 1, 2 и 3.
    Далее создадим функцию, которая добавит в конец новый элемент со случайным значением.
    $array = [1, 2, 3];
    pushRandomInt($array);
    function pushRandomInt($collection)
    {
        $collection[] = rand(1, 1000);
    }


    Когда вызывается pushRandomInt, PHP копирует значение переменной и передает его в функцию. На текущий момент будут существовать 2 разных переменных, но значения у них будут идентичные ($array содержит массив из 1, 2 и 3, и $collection содержит массив из 1, 2 и 3).
    Функция добавляет в конец ($collection[]) новый элемент со случайным значением (rand(1, 1000)).
    Теперь значение переменной $collection будет массив из 1, 2, 3 и случайного числа в диапазоне от 1 до 1000. $array же не изменился.

    Функция pushRandomInt ничего не возвращает, так что ее работа сейчас совершенно бесполезна. Чтобы сделать ее работу полезной, есть 2 способа:
    1. Вернуть результат функции
    function pushRandomInt($collection)
    {
        $collection[] = rand(1, 1000);
        
        return $collection;
    }

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

    Разберем это на примере:
    $array = [1, 2, 3];
    $newArray = pushRandomInt($array);
    var_dump($array);
    var_dump($newArray);
    function pushRandomInt($collection)
    {
        $collection[] = rand(1, 1000);
    
        return $collection;
    }


    Результатом работы данной программы будет следующее:
    array() { 0 => 1, 1 => 2, 2 => 3 }
    array() { 0 => 1, 1 => 2, 2 => 3, 3 => {случайное число}}

    Как видим, переменная $array не была изменена и результат работы функции pushRandomInt был присвоен в новую переменную.

    2. Сделать передачу значения по ссылке
    function pushRandomInt(&$collection)
    {
        $collection[] = rand(1, 1000);
    }

    Такую функцию называют грязной функцией, потому что она имеет побочный эффект: функция изменяет значения оригинальных переменных (те, которые были переданы как аргументы функции (pushRandomInt($array);, здесь $array является аргументом функции pushRandomInt))

    Разберем это на примере:
    $array = [1, 2, 3];
    pushRandomInt($array);
    var_dump($array);
    function pushRandomInt(&$collection)
    {
        $collection[] = rand(1, 1000);
    }

    Теперь этот код выведет
    array() {0 => 1, 1 => 2, 2 => 3, 3 => {случайное число}}

    Как видим, оригинальная переменная $array после вызова функции pushRandomInt была изменена.

    ---------------

    С объектами в PHP работа всегда ведется с передачей значения по ссылке.

    Пример:
    $object = new \stdClass();
    setRandomId($object);
    function setRandomId($object)
    {
        $object->id = rand(1, 1000);
    }
    echo "ID объекта: {$object->id}\n";


    То есть не нужно указывать знак амперсанда, чтобы работать с объектом по ссылке. Это работает по умолчанию.
    Бывает моменты, когда не нужно работать со значение объекта по ссылке. Для этого применяют клонирование объекта.

    Пример:

    $object = new \stdClass();
    $newObject = setRandomId($object);
    function setRandomId($object)
    {
        $newObject = clone $object;
        $newObject->id = rand(1, 1000);
    
        return $newObject;
    }
    echo "ID объекта: {$newObject->id}\n";
    echo "ID объекта: {$object->id}\n";


    Результат будет следующий:
    ID объекта: {случайное число}
    <br />
    <b>Notice</b>:  Undefined property: stdClass::$id in <b>[...][...]</b> on line <b>12</b><br />
    ID объекта:


    Что произошло:
    Функция setRandomId принимает объект, создает его копию ($newObject) и в дальнейшем работает только с копией. У копии создается новое свойство id и присваивается случайное число.
    С оригинальным объектом ($object) никаких изменений не производится, и, соответственно, свойство id у него не создается.

    Надеюсь, смог донести информацию.
    Ответ написан
    3 комментария
  • Как сделать редирект с данными через header?

    @granty
    Если запрос принял и обработал скрипт 1.php, то он может сделать
    include('2.php');
    и подключить скрипт 2 для дальнейшей обработки данных.

    Через заголовок header('Location: //site.com/2.php?param=val'); можно передать только GET-параметры. Но они прилетят в браузер, который тут же отфутболит их обратно на сервер, и скрипт 2.php вынужден будет заново обрабатывать данные из GET-запроса.
    Какой смысл гонять пользователя через редиректы, если проще сразу полностью обработать данные скриптом 2.php или 1.php?

    Не совсем понятно, что вы пытаетесь сделать...
    Ответ написан
    Комментировать
  • Как лучше обращаться с параметрами метода?

    @xfg
    Аргументировать довольно просто и даже сослаться на конкретные абзацы из книги Implementing domain-driven design, а именно, то что автор пишет про сервисы. Автор книги довольно четко рассказывает почему сервисы не должны обладать состоянием.

    У вас классический сервис и у вас проблема, только лишь потому, что вы впринципе неправильно подошли к проектированию вашего сервиса.

    В первую очередь вам нужно спроектировать интерфейс CalculatorInterface

    interface CalculatorInterface {
      public function calculate($products, $city);
    }


    Далее вам нужно создать две реализации этого интерфейса CdekCalculator и EmsCalculator

    class CdekCalculator implements CalculatorInterface {
      public function calculate($products, $city) {
         // реализация расчета через cdek
      }
    }
    
    class EmsCalculator implements CalculatorInterface {
      public function calculate($products, $city) {
        // реализация расчета через ems
      }
    }


    И теперь ваш класс доставки будет выглядеть таким образом

    class Delivery {
      private $calculator;
    
      public function __construct(CalculatorInterface $calculator) {
         $this->calculator = $calculator;
      }
      public function calculate($products, $city) {
        //тут ещё какая-то логика, которая определяет условия доставки, если она вообще возможна
        return $this->calculator->calculate($products, $city);
      }
    }


    Предмета спора больше нет. Вы просто передаете в класс Delivery нужную реализацию калькулятора. Код выше это псевдоязык, не php и вообще только базовая идея того, как это должно быть. У вас наверняка тут же возникнет вопрос, как вам тогда выводить все расчеты доставки в ваш UI. Но извините не могу написать за вас всё приложение.

    Это базовые вещи в объектно-ориентированном программировании. Называется полиморфизм подтипов. Без этих знаний невозможно писать хороший объектно-ориентированный код. Лучше оба придите к выводу, что вам срочно нужно почитать какие-нибудь книги об объектно-ориентированном программировании и начать с самых основ, что такое полиморфизм и в частности полиморфизм подтипов.

    Вообще protected/private методы и ветвления из условных конструкций - это практически всегда показатель спагетти-кода и первый звоночек, что вы пишете процедурный код используя ООП синтаксис. Вы придете к этому выводу если будете разрабатывать через TDD, а затем сможете нагуглить ваши предположения у других программистов.
    Ответ написан
    3 комментария
  • Установка блейд сервера дома, что нужно?

    @YMakeev
    Вам проще купить виртуальный сервер и не париться. За цену вашего блейда вы сможете вести разработку пару лет на ресурсах Digital Ocean или Hetzner. Если нужно именно аппаратное решение берите в аренду опять же Hetzner, Soystart, Kimsufi, Scaleway.
    Там есть недорогие железные серверы...

    Вообще, сервер дома это оверхед. Вы знаете, как они шумят и греются???
    Ответ написан
    Комментировать
  • Что быстрее mysql, mysqli или pdo?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Не стоит.
    Ответ написан
    Комментировать
  • Как найти часть строки после "@", и вместе с @ взять в тег?

    glaphire
    @glaphire Куратор тега PHP
    PHP developer
    <?php
    
    function replaceLogic($match) {
        return "<tag>$match[0]</tag>";
    }
    
    $input = 'Вот арбуз - @ho_ho_ho какой-то текст @ho_ho_ho2';
    $output = preg_replace_callback('/@[0-9a-z_]+/u', 'replaceLogic', $input);


    Живой пример
    Ответ написан
    Комментировать
  • Как узнать количество свободного места на сервере через ssh и отправить в php?

    slavchickalpha
    @slavchickalpha Автор вопроса
    Разобрался!
    В SSH отправлять df -k -BG / | tail -1 | awk '{print $4}'

    И получим свободное место на диске в ГБ.
    Ответ написан
    3 комментария
  • Как исправить 503-299 ошибку, при загрузки файла?

    @AUser0
    Чем больше знаю, тем лучше понимаю, как мало знаю.
    Решение ошибки заключается в поиске и исправлении ошибки. Код 503 говорит только о том, что что-то не удалось. Что именно не удалось - вам ни кто здесь не скажет. Смотрите сами, хотя бы в логах HTTP-сервера, по логике вещей - там всё должно быть сообщено...
    Ответ написан
    Комментировать