Ответы пользователя по тегу 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 и экранирование при выводе.
    Ответ написан
  • Правильно ли реализован клас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 на сегодняшний день, процедурный язык программирования, имеющий достаточно возможностей чтобы практиковать все основные парадигмы программирования просто с разной степенью удобства.
    Ответ написан
  • Как реализовать простой календарь на 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" а длина строки не влияет на порядок.
    Ответ написан
  • Знания 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
    Ответ написан
  • Правильно ли я понимаю паттерн прототип?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    А вы точно читали что это за паттерн и чем он от фабрики отличается?

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

    p.s. метод `getClone` должен быть приватным. В остальном вроде бы все ок.
    Ответ написан
  • Как лучше сделать автомодератора на комментарии?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    1. Кнопка пожаловаться, которая отправляет комментарий на модерацию. Сортировать список можно по количеству жалоб. Делается очень легко и быстро. Работает надежно.
    2. При наличии матных слов (тупая проверка по словарю) можно блочить отправку комментария. В этом случае стоит сделать словарь либеральнее оставляя только очевидные варианты. Далее будет работать кнопка "пожаловаться". Проверять на ссылки бесполезно - часто дают полезные.
    3. Greg Young - Stop over engineering - рекомендую к просмотру и осмыслению.
    4. Воспользоваться существующей системой комментариев.
    5. Можно защититься от тупых краулеров сделав отправку комментариев через JS и добавив опциональное скрытое поле. Тупые боты их заполнят. Такие запросы можно отбрасывать. Защищает от доброй половины спама.
    Ответ написан
  • Как перенять объектно-ориентированное мышление?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Т.е. сложно понимаю, что "засунуть" в один объект, что в другой, что должно быть статическим методом, что приватным и тд.


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

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

    Теперь задумаемся о декомпозиции всего этого хаоса. Мы находим какую-то задачу, которую выполняет наш код (например какую функцию вызвать для обработки каждого конкретного запроса) и выносим это в отдельный объект. Отправка email-ов - отдельный объект. Весь SQL зашиваем в отдельный объект. Соединение с базой - объект. Пользователи - объекты. Все - объекты.

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

    А все безхозные функции, которые не пренадлежат никаким объектам (например функции порождающие объекты) можно вынести в статические методы. Главное что бы статичесих переменных у нас небыло (ибо это те же глобальные переменные). И поменьше публичного ибо черт его знает что эти разработчики будут использовать. Причем "те разработчики" это вы завтра.

    Вообщем писав всё время на процедурке, сложно перейти на ооп.


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

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

    Подскажите, какой проект начать писать (гостевая, блог), или может начать изучать фреймворк.


    Фреймворки универсальны, а значит чистого ООП там быть не может. Во всяком случае нет ни одного фреймворка на котором стоит учиться ООП.

    Есть хорошие упражнения на развитие понимания объектно-ориентированного проектирования. Например вот: https://habrahabr.ru/post/206802/

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

    Или может подскажите книгу/сайт где пошагово в ооп написан какой-то проект, чтобы быстрее пришло понимание.


    Так вы научитесь делать один конкретный проект а на втором вы уже проиграете. Так дела не делаются. Надо разобраться с причинами появления идеи ООП. Ну то есть что было до. Можно еще с функциональным программированием попробовать разобраться. В PHP оно слабо применимо, но основные идеи очень тесно переплетаются с ООП и познав немного функциональщины ваше ООП будет лучше. Да и если про ООП вы можете найти много булшита, про функциональщину врут мало.
    Ответ написан
  • Какие вы создаете шаблоны php проектов?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Единственный способ учесть изменения - это дождаться изменений и посмотреть.

    Как пишутся шаблоны? Для начала берется какой-то готовый и на его основе начинаются делаться проекты. Именно проекты а не просто "подготовка к проектам". Это по сути является преждевременной оптимизации. Особенно если опыта у вас не так много.

    Далее уже с каждым проектом вы будете привносить что-то новое. Можно делать ретроспективы и делать улучшения для других проектов... как-то так. Все остальное - либо у вас уже есть опыт (или у членов команды), либо это будет пустой тратой времени. И это время лучше потратить на изучение вопросов "почему у других так".
    Ответ написан
  • Нужно ли учить ООП (PHP)?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    но статья меня пугает, так нужно ли учить ООП или функциональное программирование: Welcome?


    ООП учить не нужно. Большинство вроде как и учат но выходит плохо. ООП надо понимать. Причем это скорее именно проектирование нежели программирование.

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

    А так... скажем так, использовать классы вам придется. В PHP другого способа изолировать состояние нет. Просто не надо думать что ООП про наследование (о чем большая часть статьи), оно про изоляцию состояния, взаимодействие объектов/модулей посредствам "общения" (tell don't ask, закон деметры), про позднее связывание (возможность подменить реализацию)... А не как не про классы. Классы лишь способ. Инкапсуляция, полиморфизм, наследование - все это было до ооп. Разве что наследование в Simula67 сделали в более удобном виде. Но все же считать этот язык объектно ориентированным не стоит. На его основе потом Страуступ плюсы сделал, и так же не думал делать объектно-ориентированный язык. Он хотел структурировать процедурный Си, задать так сказать культуру разработки. Менять парадигму он не собирался.

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