Задать вопрос
Ответы пользователя по тегу PHP
  • Почему сокет клиент зависает при разрыве соединения?

    @Vitsliputsli
    Как отлавливать разрывы сети на стороне клиента в PHP и просто пропускать выполнения функции socket_read?

    Никак. Откуда ему знать, есть на другой стороне машина или нет?
    Проверяйте что целевая машина отвечает по типу эхо-запросов и отключайте по таймауту.
    Ответ написан
    Комментировать
  • Список технологий необходимых для backend php developer?

    @Vitsliputsli
    Технологий слишком много, и у разных компаний может быть совсем разный стек. Кто пишет сайты - обязательно фреймворки, а где-то их не будет. Где-то будут требовать знание Vertica или Clickhouse, а много где вообще ни разу не услышите этих слов. Кто-то захочет еще и знание Go, а где-то очень желателен будет React и пофиг что это не backend.
    Но есть и общие моменты, очевидно знание git, PSR, composer, xdebug, для мидла должны быть не "навыки ООП", а отличное знание и понимание (в том числе SOLID, GRASP), оценка сложности алгоритмов, sql с пониманием работы индексов (разумеется нормализация, транзакционность, уровни изолированности, ACID), знание того же самого PHP (начиная с того, где и когда применяем Exception заканчивая SPL, Reflection, даже если никогда к ним не обращались, нужно знать, что они есть, когда возникнет необходимость), способы защиты от уязвимостей, сложности параллелизма (та же самя "гонка"), типы данных и что они из себя представляют (начиная с банального почему деньги не храним в float и т.п.). К примеру, вы можете не использовать ORM, но должны знать какие они бывают и доказать почему собственно вы их не использовали в конкретной задаче. Тоже самое trait, clojure и т.д. И много еще чего. Вплоть до провакационых вопросов "есть ли в php перегрузка?".
    Это часть базисных вещей, на которые накладывается специфика работы со своими технологиями.
    Ответ написан
    Комментировать
  • Uncaught mysqli_sql_exception: Ошибка в запросе мускуля, что делать?

    @Vitsliputsli
    Используйте подготавливыемые запросы. Вы передаёте данные с кавычкой, это и вызывает ошибку.
    Ответ написан
  • В чем ошибка применения функции sleep()?

    @Vitsliputsli
    Вы получаете ошибку, потому как nginx не дождался ответа от php, который ожидает ответ от mysql, который лопатит ваш не хилый запрос на получение.
    Разбивайте на части, управляйте этим в коде. Как уже указано, запускайте php не через nginx, а в cli. Записывайте не построчно, а тоже блоками. 150 000 это много, попробуйте блоки по 1000, а может и меньше.
    Откуда взялся sleep? Если это троттлинг, то 30 секунд как то очень много.
    Ответ написан
  • Дописать в файл json и прочесть его php?

    @Vitsliputsli
    Результат выводит если запись ф файле одна, если две то выводит null

    Потому что
    {"Дата":"2022-02-02 17:40:12","День":"2022-02-02","Время":"17:40:12"}{"Дата":"2022-02-02 17:40:12","День":"2022-02-02","Время":"17:40:12"}
    это не валидный json. Валидный будет, например, такой:
    [{"Дата":"2022-02-02 17:40:12","День":"2022-02-02","Время":"17:40:12"},{"Дата":"2022-02-02 17:40:12","День":"2022-02-02","Время":"17:40:12"}]
    В любом случае, дозаписывать json неполучится. Либо обрабатывайте его полностью и полностью перезаписывайте файл. Либо храните в файле строками и читайте строками.
    Ответ написан
  • MVC (PHP): правильно ли понимаю слои?

    @Vitsliputsli
    Модель (Model) - слой работы с данными. мне сложно воспринять этот слой, т.к. вряд ли контроллер всегда работает напрямую с моделью ?

    Контроллер всегда напрямую работает с моделью.

    Наверняка же есть какие-то промежуточные слои ? Например Сервис ? А в сервисах уже вызываются DAO или Repository (кстати, в чем у них отличие?).

    Нет никаких промежуточных слоев. Какого рода логика будет в модели, это уже ваше право, MVC этим не занимается.
    Мысль MVC отделить обработку пользовательского ввода (Контроллер) и вывода (Представление) от внутренней логики приложения (Модель). Вот и все.

    Единственное, что можно отметить еще, в вебе принято, что контроллер передает данные в модель, забирает вывод и предает его в представление. В классическом mvc, контроллер передает данные в модель, а модель свой вывод передает напрямую в представление.
    Ответ написан
    Комментировать
  • Как прочитать определенную строку в файле?

    @Vitsliputsli
    Для простых файлов csv можно воспользоваться командами ОС (в которых нет переносов строк внутри строки).
    К примеру, у меня поиск 9 000 000 строки используя php занимает 31 секунду, а через sed менее чем за пол секунды.
    Для сложных условий уже не такое большое различие.
    Ответ написан
  • Как вывести строки с бд в зависимости от их количества с ограничением?

    @Vitsliputsli
    Наверное, потому что:
    PDOStatement::fetch — Извлечение следующей строки из результирующего набора
    в то время, как есть:
    PDOStatement::fetchAll — Выбирает оставшиеся строки из набора результатов
    Ответ написан
    Комментировать
  • Какой будет ответ var_dump(0 == "wow"); ??

    @Vitsliputsli
    Нет, не так.
    В 7 версии: т.к. сравниваем число и строку, то преобразовываем строку в число (int)"wow" = 0, и сравниваем результат: 0 и 0 - true.
    В 8 версии: т.к. сравниваем число и строку, то проверяем содержит ли строка число, в данном случае - нет, не содержит (что-то вроде is_numeric("wow")), а раз не содержит - false.

    Отсюда вывод, не стоит использовать подобные конструкции. Всегда пользуйтесь сравнением с учетом типов, если нужно, то приводите к нужному типу вручную. Такая конструкция возможна только в самом крайнем случае.
    Ответ написан
    2 комментария
  • Стоит ли использовать эти настройки для pdo?

    @Vitsliputsli
    Немного погуглив выяснил что
    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    лучше не использовать.

    Да, лучше, если подразумевается вообще не указывать. PDO сам выберет лучшую настройку для конкретной СУБД.
    Ответ написан
  • Как через PHP запустить Python скрипт через pipenv?

    @Vitsliputsli
    Как и любую другую внешнюю команду - через system, exec или другую команду, которая больше подойдет.
    Ответ написан
    Комментировать
  • Что такое API в PHP?

    @Vitsliputsli
    "API - это интерфейс, для работы с какой либо сущностью/объектом/классом/бд"

    В какой-то степени - да. Но я бы определил так:
    API - это контракт между системами, каким образом данные передаются от одной к другой, т.е. некая спецификация описывающая формат обмена. Благодаря наличию контракта каждая из систем может однозначно определить, что запросила или ответила другая система.

    Здесь есть важные моменты: обе системы в курсе о спецификации и она не оставляет возможности иного толкования.
    И, кстати, зачастую эти системы могут быть написаны на разных языках, или переписаны на другие языки, но формат обмена остается универсальным, и одним и тем же.
    Ответ написан
    Комментировать
  • Php socket create ошибка соединения при множество запросов, как победить?

    @Vitsliputsli
    Смотрите логи ошибки соединения.
    Проверьте кол-во одновременных соединений, если примерно в районе 1000, то вы скорее всего наткнулись на лимит файловых дескрипторов.
    Дело в том, что php создает для каждого коннекта файл, лимит кол-ва файловых дескрипторов на один процесс по-умолчанию, чтото вроде 1024. Насколько помню, это лимит ОС и лимит php. Поэтому нужно увеличить лимит в Linux, и придется пересобрать php с большим кол-вом.
    Либо использовать любой другой язык, без подобных заморочек. Во всяком случае, на python и go, подобных проблем нет, они не используют файловые дескрипторы для каждого соединения.
    Ответ написан
    2 комментария
  • Golang и PHP, дань моде или необходимость?

    @Vitsliputsli
    Если в проекте есть критичные места, которые нужно ускорить, но упираемся в скорость работы интерпретатора php, то берём go.
    Go достаточно простой и высокопроизводительный язык. Но скорость разработки на нем значительно ниже, чем на php.
    Ответ написан
    4 комментария
  • Как протестировать производительность функций начинающему php-разработчику?

    @Vitsliputsli
    Этот разработчик имел ввиду, что вы "гоняете через аргументы" является свойством класса, и таковым и надо его сделать. Нет смысла это задавать извне, если это неизменяемая часть класса.
    А потому, скорее всего никакой речи о "борьбе за ресурсы" не было и в помине.
    Если вы предлагаете передачу объекта через аргумент функции заменить на создание еще одного объекта, значит вы плохо представляете, как и на что выделяется память. Оставьте это пока, разберитесь с зависимостями в коде.
    Вообще странная вещь для разработчика описывать код словами, там все так плохо, что из кода вообще ничего не понятно?
    Ответ написан
  • Php Ratchet - как отследить разрыв соединения?

    @Vitsliputsli
    Очевидно никак, организовывайте ping и по тайм-ауту разрывайте соединение для таких случаев.
    Ответ написан
  • Почему не стоит передавать аргументы в функцию по ссылке?

    @Vitsliputsli
    Никакими. Все "ужасные последствия" связаны с непониманием того, что делаешь, а никак не передачей по ссылке. К примеру, в ООП нельзя передавать кроме как по ссылке, но даже в крупных проектах "ужасных последствий" от этого не наступает. Целый ряд встроенных в php функций также используют передачу по ссылке, и если на них посмотреть, станет понятно, что это сделано абсолютно корректно.
    Ответ написан
  • Можно ли использовать return;?

    @Vitsliputsli
    Для меня return; это успешное окончание выполнения функции по задуманному плану.

    Именно так, если от функции не требуется возвращать какое-то значение, то return вполне достаточно, либо его можно вообще опустить. Для таких функций выставляется возвращаемое значение void. Иной выход из нее - только Exception.

    Ведь return; == return false;

    И да, и нет. Вообще оператор == допустимо использовать только в крайних случаях, которые нужно обосновать. При нормальном сравнении ===, return не будет равен return false. Ваше равенство верно лишь потому, что php выполнил приведение типов перед сравнением.
    Ответ написан
    Комментировать
  • Как доработать код?

    @Vitsliputsli
    Ничего страшного, допишите еще один case и метод, и все будет нормально. Да, это нарушает принцип, но все так делают, просто хрен кто признается. Не пытайтесь здесь вкрячить какого-нибудь монстра, сложный код - это потенциальные ошибки, если возможно написать просто, так и нужно сделать.
    Принципы - они принципы, а не законы, надо следовать не букве, а смыслу. Принцип открытости и закрытости оберегает нас от ошибок и дополнительных затрат на тестирование кода, который вроде бы и так уже работает и хорошо себя зарекомендовал. Т.е. если бы у вас был один метод и вы там внутри как-то хитро разруливали работу с разными типами и при добавлении нового типа изменяли бы его - это было бы ужасно. В текущей реализации, вам нужно будет добавить новый метод (это не изменит поведение класса до вмешательства), и добавить новый путь при использовании нового типа - да, вмешательство, но оно минимально. Если умудритесь накосячить здесь, то вас уже никакие принципы не спасут.
    Если же у нас, что-то гораздо более сложное, либо класс физически недоступен для изменений, или он уже вовсю используется, а новый тип нужен только для конкретной реализации, то, пожалуйста, есть наследование. Наследуете класс, в потомке добавляете метод и заменяете метод, выполняющий перенаправление (не забывайте, что есть вызов parent). Это будет полностью соответствовать принципу.
    Но я бы больше уделил внимание тому, почему мы ориентируемся для выбора метода на внутреннее свойство, точно ли это должны быть методы, а не отдельные классы. И вполне может быть получится так, что все эти танцы с бубнами не нужны.
    Ответ написан
    Комментировать
  • Как отправить такой запрос в postman/curl?

    @Vitsliputsli
    Используйте raw-формат в Body
    Ответ написан
    Комментировать