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

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    потому что у web сервера (nginx/apache) есть свои таймауты. Для вашей задачи вооружитесь очередями (beanstalkd, gearman, etc).
    Ответ написан
  • Как организовать деплой на кучу проектов на одном ядре?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    composer для того чтобы обновлять "ядро" (со своим приватным репозиторием возможно). "автоматизировать" - различные штуки от обычного bash скрипта до инструментов аля ansible. А еще docker клевая тема для подобных вещей. Если "это работает в контейнере то скорее всего будет работать на любом другом сервере".
    Ответ написан
  • Перевод на зимнее время, как правильно прописать?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Как правильно


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

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    отправить ответ (echo 'Ответ';) на другой порт получателю, а не тот от которого пришел запрос.


    для этого между сервером и клиентом должно быть установлено соединение. Так работает TCP. Причем сервер не может выступать инициатором.

    А если у вас есть два соединения между клиентом и сервером - то никаких проблем.
    Ответ написан
  • Парсинг url по шаблону в PHP?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Учите регулярные выражения.

    p.s. А еще лучше - возьмите готовый компонент для маршрутизации.
    Ответ написан
  • Как оптимизировать функцию обработки полей формы?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Но перед записью эти данные нужно обработать


    не нужно. Вот вам и решение проблемы. prepared statements для sql и экранирование при выводе.
    Ответ написан
  • Как происходит передача события в вебсокет канал с сервер?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    1. Поскольку я сомневаюсь что вы написали свое приложение на reactphp (ну то есть это не то же приложение что сокеты слушает), то вам нужно будет организовать общение этих процессов. Тут подойдет какая-нибудь штука вроде zeromq.

    В этом случае мы можем по какому-то событию в одном процессе, формировать сообщение и кидать его через pub/sub другому процессу. Другой процесс принимает сообщение и делает то что нужно, то есть находит нужного пользователя в массиве и кидает ему событие.

    2. тут зависит от того, хотите ли вы сразу обработать что-то или хотите что бы это что-то происходило изолированно в другом процессе (предпочтительно с точки зрения надежности и стабильности). В первом варианте вам нужно что-то вроде роутера. Во втором - обратное первому.

    p.s. Я не рекомендую вам связываться с websockets на php, проще развернуть примитивный сервер на socket-io и через тот же zeromq передавать нужные сообщения между node и php. Проблем меньше будет как для клиента (socket-io намного проще с точки зрения клиента) так и сервера (socket-io намного более надежное решение).
    Ответ написан
  • Правильно ли реализован класc?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Пишу свою модель MVC


    а код привели контроллера. Да и в целом вы уже на этом этапе проигрываете. Не нужно даже пытаться разбираться с MVC, это конкретная реализация принципа разделения ответственности. Сначала стоит разобраться с принципом, лежащим в основе, а уже потом ковыряться с реализацией.

    и мне кажется что я делаю что-то не так и хочется его добить


    Давайте сначала по мелочам:

    if ( !defined( 'FILE_COMPILE' ) )

    убрать. Если вы собираетесь "конкатенировать PHP" - не делайте этого. Есть opcache.

    if ( !class_exists ( 'Controller' ) ) {

    composer и PSR-4 совместимая автозагрузка классов.

    class Controller extends UDAPI {

    Наследование классов (extends) - плохо (ну опять же в подавляющем большинстве случаев). Наследование типов (implements) - хорошо. Приучайте себя использовать наследование классов как крайнюю меру.

    Ну и опять же, что это за UDAPI от которого вы наследуете контроллер? Не выгоднее ли передать его в конструктор контроллера как зависимость?

    protected $uri;
        protected $params = array();
        protected $request = array();


    сделайте отдельный класс Request и инкапсулируйте работу с ним там.

    $this->uri = filter_input ( INPUT_SERVER, 'REQUEST_URI', FILTER_SANITIZE_URL );
        $this->uri = trim ( $this->uri, '/\\' );
        $this->uri = urldecode ( $this->uri );
        $this->uri = parse_url ( $this->uri, PHP_URL_PATH );


    Опять же, это не задача контроллера. Контроллер пусть принимает уже готовый объект запроса.

    if ( $this->uri == '' )
            $this->redirect ( $this->config->root_uri . $this->default[ 'controller' ] . '/' . $this->default[ 'action' ], true );


    Почитайте про мидлвэры, про фронт-контроллеры, про Model-View-Adapter. Последняя схема куда лучше вписывается в модель HTTP сервера.

    public function ready ( ) {

    сделайте отдельный компонент - роутер. Кто-то (например фронт контроллер) должен просить роутер узнать какой контроллер дергать. И потом уже дергать этот контроллер. Не надо пихать все в одну хрень, тем самым вы нарушаете саму идею "разделения ответственности" пытаясь реализовать конкретную реализацию этого принципа.

    $this->setController ( array_shift ( $this->pattern ) );
    $this->setAction ( array_shift ( $this->pattern ) );


    Пара слов о состояние. Состояние это сложность. То есть посмотрев на переменную `$this->pattern` мы понятия не имеем что там хранится поскольку с течением времени его значение меняют. Причем зачем меняют - непонятно.

    Чем раньше вы поймете что чрезмерная любовь к состоянию убивает в вас хорошего разработчика и возможности писать читабельный поддерживаемый код - тем будет лучше.

    call_user_func_array ( array ( $controller, $this->action ), $this->request );


    На дворе PHP7 между прочим.

    } else {
                echo '404 error';
              }


    раз уж начали - делайте всю обработку ошибок через исключения. Тут вам пригодится как раз фронт контроллеры и прочее.

    public function isController ( $controller ) {
        if ( is_dir ( SOURCE_DIR . '/controllers/' . $controller . '/' ) ) {


    ... PSR-4, классы... автозагрузка...

    public function getModel ( $controller ) {

    Для 2006-ого года в целом нормально, но это ж 10 лет назад.
    Ответ написан
  • PHP функциональный язык или объектно-ориентированный?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Я могу дать вам лишь мой вариант ответа собеседующему:

    Никаким. Отличительная черта PHP в том, что он не задумывался как язык программирования. Это даже в названии отражено - PHP (recursive acronym for PHP: Hypertext Preprocessor).

    На этапе PHP3 это был уже полноценный процедурный язык программирования, где писать логику можно было уже не на Си.

    В PHP4 в язык были введены "классы" чтобы дать механизм изоляции состояния. Это еще нельзя было называть ООП просто потому, что... это не объекты а классы. Нет ни инкапсуляции, есть только ad-hoc полиморфизм (который есть у всех языков с динамической системой типов) и ограниченный полиморфизм подтипов. Ну а наследование классов и так признано ненужной штукой в контексте ООП.

    В PHP5 наконец-то были введены интерфейсы, и теперь можно было делать нормальный полиморфизм. Были введены модификаторы доступа и т.д. но язык все еще остается процедурным по большому счету (и это нормально, поскольку все существующие ОО языки являются процедурными).

    В PHP5.3 были введены анонимные функции. но без лексический скоупов, без функций высшего порядка делать "чистую функциональщину" просто не выйдет. Во всяком случае это будет неудобно.

    Отсюда сделаем вывод - PHP на сегодняшний день, процедурный язык программирования, имеющий достаточно возможностей чтобы практиковать все основные парадигмы программирования просто с разной степенью удобства.
    Ответ написан
  • По какой причине при сохранении сущности с отношением one to many, не записывается id на связь?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Картинкам не надо знать о продуктах. Минимизируйте количество двусторонних ассоциаций.

    Так же почитайте про каскадные персисты.

    p.s. Подобные вопросы следует удалять так как "легко гуглится" или просто достаточно прочитать документацию. Не ленитесь иначе все будет и дальше плохо.
    Ответ написан
  • Правильный ли, подход к проектированию приложения в symfony 3?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Не правильный. Читайте Эрика Эванса. Читайте про unit of work. Читайте про "save your repositories from save".
    Ответ написан
  • Как правильно работать с объектами выборки doctrine в Symfony?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    дополню ответ Юрий

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


    Все сущности заворачиваются в прокси объекты, что бы работала "магия" вроде ленивой подгрузки и т.д. Именно по этому в сущностях "больше" чем есть на самом деле.

    По поводу коллекций, в Doctrine есть такая штука как Collection. Вы должны понимать что в доктрине вы оперируете не табличками в базе, а объектами. Строите именно объектную модель вашей системы. В этом ключе можете почитать что такое "агрегат сущностей". В вашем случае у вас агрегат будет состоять из двух сущностей. Product и его Image. Например если вы захотите сделать добавление картинок, вы можете сделать так:

    /**
     * usage: $product->addImage($image);
     */
    public function addImage(Image $image)
    {
        $this->images->add($image);
    }


    А коллекция сама выполнит persist новой сущности. Таким образом количество репозиториев уменьшается до количества корней агрегатов сущностей. В вашем примере "корнем", то есть вершиной графа взаимоотношений объектов в контексте продуктов, является сам продукт. А потому репозиторий мы будем делать только для продуктов. Все остальное внутри оного разруливается либо при помощи коллекций.

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

    К примеру "новички" в доктрине любят персисть сущность даже для обновления. Они путают `persist` и `save`. Так вот, если вы загрузили сущность из базы через доктрину, то сущность уже попадает в unit of work. И делать persist уже не нужно, этот метод только для того чтобы доктрина узнала о чем-то новом. А так она и так знает про эту сущность. В итоге вы можете просто что-то поменять и вызвать flush. То есть репозиторий - это тупо хранилище. Хранилище умеет хранить. Изменять то, что оно хранит оно не может.

    Так же рекомендую на тему репозиториев почитать это:

    www.whitewashing.de/2013/03/04/doctrine_repositori...

    Ну и в целом.

    https://www.youtube.com/watch?v=rzGeNYC3oz0 - доклад о том как готовить доктрину от авторов оной.

    От себя лишь добавлю простые правила:

    - Не используйте напрямую доктриновские репозитории. Пишите свои, а в них уже юзайте доктриновские. Не стоит размазывать доктрину по всему проекту, потом это будет нереально поддерживать.
    - Не наследуйтесь от EntityRepository. Это внутренний механизм доктрины общего назначения. Используйте их в своих репозиториях со своим интерфейсом, повышая специфичность и ужесточая контроль за тем кто что юзает.
    - Старайтесь использовать entity manager только в своих репозиториях и каких то небольших сервисах. Не размазывайте все по всюду.

    что очень сильно срет память.


    Доктрина гарантирует вам что в памяти будет всегда только один инстанс сущности. То есть если у вас есть 10 объектов одного типа и имеющих один объект, это все будут ссылки на одну сущность. В вашем случае у вас просто циклическая ссылка между продуктами и изображениями. dump циклические ссылки не особо умеет.

    Это логичное ограничение, дабы не возникало ситуаций что вы обновили что-то в одном экземпляре сущности и что-то в другом, и в базу попадут только часть изменений. За подробностями - читайте документацию к доктрине в отношении UnitOrWork и Identity Map.
    Ответ написан
  • Как реализовать простой календарь на php7 с использованием AJAX'a?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    В PHP из коробки есть мощнейший парсер дат:

    php.net/manual/ru/datetime.formats.php

    То есть вы можете писать такое:

    new \DateTime('first monday of this month');        // 2016-11-07
    new \DateTime('first sunday of November 2016'); // 2016-11-06


    так же с датами можно производить манипуляции, сравнения и т.д.

    И как можно реализовать подгружение месяцев при щелчке, например, на кнопку 'далее'?


    Будьте последовательны. Сначала выведите календарь на этот месяц. Затем сделайте так, что бы можно было смотреть календарь за любой месяц любого года. Затем погуглите как делать http запросы средствами javascript.

    p.s. такие вещи проще и удобнее делать целиком на клиенте. Не говоря о том что лучше взять существующий календарь.
    Ответ написан
  • Почему товары отсортированы некорректно (ASC)?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    это строки. сравнение происходит посимвольно. То есть символ "2" больше чем символ "1" а длина строки не влияет на порядок.
    Ответ написан
  • Нормальный ли это код? и как его можно оптимизировать (Фильтр данных из базы)?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    У вас там баги и копипаста, как такой код может быть хорошим? Что вы будете делать если вам нужно будет в один прекрасный день выводить не 40 элементов а 50? find/replace? А если поменяется название поля? А если добавится еще одно поле? Добавлять степень двойки веток?

    if ($visa_type && $status & $company) {

    вот тут например я полагаю что мы имеем дело с опечаткой.

    Дополню Кандрашкин Алексей и избавлюсь еще от одного уровня вложенности.

    public static function filter($visa_type, $status, $company)
        {
            $query = self::query();
    
            if (!Auth::user()->hasRole('administrator|Manager')) {
                $query->where('user_id', Auth::user()->id);
            }
            if ($visa_type) {
                $query->where('visa_type', $visa_type);
            }
            if ($status) {
                $query->where('status', $visa_type);
            }
            if ($company) {
                $query->where('company', $company);
            }
    
            return $query
                ->orderBy('id', 'desc')
                ->paginate(40)
                ->toArray()['data'];
    Ответ написан
  • Знания Junior php разработчика?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    что должен знать идеальный джуниор (мое личное мнение):

    - Сетевой стэк. Нужно иметь хотя бы базовое представление о том как с сервером общаются. Ну то есть не нужно лезть в дебри, но понимать что такое HTTP или чем TCP от UDP отличается - нужно. В целом это пара часов чтения википедии.
    - GIT или любая другая распределенная VCS. Базовые навыки, что бы хотя бы понимал что есть git revert или git rebase, что такое фичабрэнчи и примерное представление как это работает и зачем надо.
    - Базовые основы unix. Ну то есть что бы не пугаться таких вещей как ssh хотя бы.
    - PHP. Без этого никуда. Он должен понимать что такое слабая динамическая типизация (не заучивать табличку кастов типов, а понимать плюсы и минусы, такая же история с приоритетами операторов - не заучивать а знать как избегать проблем с чтением кода)
    - Понимать что код чаще читают чем пишут, а потому не экономить 5 минут на написании кода, а писать так, чтобы сэкономить 30 минут человеку, разбирающемуся в куске кода.
    - Знать базовые вещи в плане безопасности. XSS и как защищаться, SQL инъекции и как защищаться, CSRF, MITM. Понимать что такое NDA, что данные пользователей - секретная информация. Как хэшировать пароли (не md5 а password_hash) и почему это важно.
    - Знать SQL. Глубоких знаний не требуется, нужно лишь понимание того, что такое нормальная форма, желательно разобраться с вопросом денормализации данных. Идеально иметь хотя бы базовые представления о том как работать с NoSQL решениями.
    - Процедурное программирование: почему глобальные переменные порождают сложность, что такое состояние, как можно использовать классы для изоляции состояния и т.д. Инкапсуляция. Инварианты, пост/пред условия, сохранение целостности...
    - Разделение ответственности. Это один из важнейших принципов, и упрощать все это до "mvc фреймворк" слегка неправильно. Вы должны понимать что от чего отделяете и главное зачем.
    - Автоматические тесты. Джуниор должен знать что это такое и иметь хотя бы минимальный опыт их написания. Должен понимать разницу между юнит и интеграционными тестами. Быть знакомым с пирамидой тестирования.
    - Уметь решать стандартные задачи не задавая слишком много вопросов. Например регистрацию пользователя по email-у вы должны написать, или авторизацию через соц сети, или комментарии, или новостную ленту.
    - Уметь дебажить. xdebug, blackfire и тд.

    В целом где-то за годик весь этот список можно влегкую покрыть с нуля.

    p.s. Я в списке специально не указывал ООП, поскольку всеравно первые пару лет у разработчиков выходит процедурщина на классах. Это не плохо, но того что в моем списке более чем должно хватать для решения стандартных задач. Но термины вроде "инкапсуляция/полиморфизм/наследование" требуются в обязательном порядке подавляющем количеством интервьюверов, а стало быть знать это надо. Единственное что - рекомендую в свободное время глубже погрузиться в этот вопрос а не тупо заучивать формулировки.

    Так же вещи вроде docker джуниорам знать не обязательно просто потому, что их врядли допустят сходу к управлению инфраструктурой. А так пару неделек на изучение и вперед.
    Ответ написан
  • Как организовать управление демонами на PHP?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Также нужно, чтобы был один мастер процесс


    Очень крутая тема с этим в том, что вам не обязательно нужен мастер процесс написанный на php. Вы можете взять старый добрый pm2 для nodejs, или supervisord для unix. Я к примеру вообще тупо запускаю "демоны" в отдельных докер контейнерах, и у меня полный контроль за ситуацией (docker-demon в моем случае выступает в роли гипервизора).

    Есть идея собрать какой-то свой велосипед


    Разве что у вас куча свободного времени. Свои велосипеды это весело и познавательно, но такие вещи писать надо уметь. Иначе не стоит их пихать в продакшен.

    мне нужно, чтобы сервис был максимально неубиваемым.


    именно с такими требованиями справляется erlang. В целом же стоит знать контекст задачи. В общем изучайте supervisord, судя по всему он покрывает все ваши нужды.
    Ответ написан
  • Как научиться создавать свои функции в PHP?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Реально ли вообще с нуля самому не смотря не документацию или чужой код создать Движок?


    Нет. Хватит лениться.
    Ответ написан
  • Реализация snmp через php. Как и с чего начать?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Реализация snmp через php. Как и с чего начать?


    начните с этой ссылки: https://packagist.org/search/?q=snmp
    Ответ написан