• Апгрейд Phalcon 1.x до 2.x стал потреблять всю ОЗУ – как обойти?

    Yeah
    @Yeah
    В рамках вот этого пулл-реквеста добавлена проверка на видимость полей через Reflection. В 1.3.2 такой функциональности не было, потому и работало быстро.

    Что характерно, версия 1.x использовала для этого метод getModelsMetadata, который возвращал данные о полях (которые, к слову, еще и кешировал), а в 2.x это убрали и добавили тупое обращение к Reflection. Для production-ready high-speed фреймворка - это дичайший зашквар.

    В качестве ответа на вопрос, что делать, могу посоветовать: определяйте сеттеры. Тогда код зайдет в блок _possibleSetter и до _isVisible выполнение не дойдет. Это костыль, но должно сработать.

    Еще можно переопределить __set в своем базовом классе модели. Что-то типа:

    public function __set($property, $value) {
        if (is_array($value) || is_object($value)) {
            return parent::__set($property, $value);
        }
        if ($this->_possibleSetter($property, $value)) {
            return $value();
        }
        $this->{$property} = $value;
        return $value();
    }


    Но это на свой страх и риск, так как валидность свойств проверяться не будет.

    Ну и пишите им issue, конечно
    Ответ написан
    3 комментария
  • Doctrine ORM Лучшие практики?

    by25
    @by25
    Веб-разработчик
    1. Никаких сеттеров. Entity всегда дожна быть валидной (установка значений через конструкторы, именованные контсрукторы). Если нужно менять состояние - делаем осмысленные методы, типа:
      public function updatePassword($plainPassword, EncoderInterface $encoder) {
          //...
      }
      public function updateProfile(UserProfile $profile) {
          //...
      }

    2. Вадидация должна происходить в приложении на более высоких слоях. (Валидируем request, command и прочее).
    3. Очень удобно использовать Embedded-object (doctrine-orm.readthedocs.io/projects/doctrine-orm/... в качестве Value-objects.
    4. flush() всегда делаем в контроллере (в верхнем слое приложения) и забываем про такую конструкцию $em->flush($myEntity); Суть такая: наше приложение работает с бизнес-объектами (domain-objects), меняет их состояние, однако про сохранение (коммит изменений) слой модели не должен знать, это не его задача. Все изменения фиксируются в конце запроса.
    5. Используйте Domain-events - очень удобная штука.
    6. Иногда очень полезно отказаться от автогенерации доктриной id, можно использовать uuid.


    И дострина многим не нужна, часто достаточно active-records.
    Doctrine даёт большой профит только если доменна логика сложная, ну все это хорошо ложится на проектирование по модели (DDD).
    Ответ написан
    7 комментариев
  • Использование нескольких ВК-приложений на PHP API – как не плодить условия на тип приложения?

    @unity_ultra_hardcore
    1. Хранить в базе ещё и тип и плодить два условие типа.

    Да. Хранить рядом с токеном не только срок его действия, соцсеть из которой он получен (в случае, если все токены в одной таблице) и его тип: website/standalone
    Эту проверку можно инкапсулировать внутр вашего $social:
    If ($social->canPostOnWall($entity) {
        $social->postOnWall($entity);
    }


    Думаю, что в методе canPostOnWall те провайдеры, что не умеют постить оффлайн, должны просто возвращать false. А VK должен проверить наличие в хранилище токена с этим user_id, с expire > now() и с type = 'standalone' и пытаться запостить сообщение на стене, если подходящий токен нашёлся.
    Ну, это если я верно понял вашу архитектуру.
    Ответ написан
    3 комментария
  • Почему не работает контроллер?

    profesor08
    @profesor08 Куратор тега PHP
    Ну а причем тут контроллер? Вам же написали:
    php fatal error class securityplugin not found in app/config/services.php on line 28

    Ищите где потеряли данный класс.
    Ответ написан
    Комментировать
  • Попросили проверить код, на что смотреть нужно?

    apavlyut
    @apavlyut
    www.pavlyut.ru
    Все комментаторы совершили одни и те же ошибки управления потому что, при всем уважении, скорее всего за эти ошибки (в стратегировании) они не платят из своего кармана.

    На пальцах отвечаю на ваш вопрос:

    1) По структуре - при проверки качества кода / решения / задачи / продукта / настройки сервера и так далее нужно проходить по списку (чеклист) критериев контроля качества - обычно они выглядят как списки определенных параметров которые может замерить третье лицо или сама система - формат проверяемого параметра прямо вот соответсвует / не соответсвует. На сколько процентов пройден чеклист - на столько процентов результат "качественный"
    2) Почему ребята ошиблись - потому что стали приводить конкретные списки. Дело в том что у каждого проекта / сиутации / команды / набора компетенций - свои наборы таких чеклистов на разные ситуации. В больших командах сущесвтует основной чеклист который регламентирует CodeReview - и за него отвечает как правило тим лид - он его обновляет, развивает, обосновывает внесенные правила и следит за тем чтобы ПЕРЕД началом разработки все разработчики были ЗАРАНЕЕ ОЗНАКОМЛЕНЫ с этим порятком проверки качества, а все потому что:
    3) Количество стайлгайдов и критериев в приципе существует огромное количество - и то как каждому в одной части света / компании удобно делать одно дело - не регламентирует ни разу что именно так же другому человеку в другой ситуации применять эти правила к своему контексту. В виде открытых стайлгайдов они существуют для накопления практик и навыков в первую очередь для их же развития (процесс формулировки наводит порядок в голове) а также дают возможность "на них конкретно" нанизать точечные ответы огромного сообщества людей, и получить те самые разные взгляды на ситуации, и по возможности опять же привести к общему знаменателю. Но это все мелочи жизни, а в вашем случае вы совершите серьезную ошибку если прямо сейчас возьметесь (примите на себя ответственность) проверять чужой код на предмет оценки, потому что:
    4) Вас явно используют как внешнего эксперта на которого можно сослаться, от которого можно получить якобы аргументацию для давления на свою позицию при решении какой-то возникшей ситуации во взаимоотношениях клиент-разработчик на проекте куда вас приглашают за экспертизой.
    Если вы, не предупредив, о том что "качество кода" начинается с декларации этого качества (в случае если речь идет о проверке этого внутреннего качества в рамках сотрудничества, а не самих задач которые поставлены перед создаваемой системой - фичесов) - любая ваша оценка будет недостоверна контексту ее применения (вы напишете про строки или еще что-то - а у человека будут либо взыскивать деньги / либо недоплатят за работу / или инкапсулируют в договоренности пост фактум за те же деньги работу над соотвествием определенным стилям - это все работа которая должна быть оплачена). Поэтому вот вам вилка ваших дейсвтий:

    1) Если у вас просто просят менторства молодые коллеги - дайте им ссылку на гугл и ключевое словосочетание php style guide github
    2) Если вас спрашивают (либо вы сами являетесь таким заказчиком который ищет за что зацепиться в коде чтобы продавить свою позицию) - нет критериев качества кода ДО начала работ подписанных на бумаге / пересланных по почте - никакие критерии не могут быть применены к текущим отношениям - только к следующей итерации за следующие деньги.
    3) Если вы все же разработчик и вас попросили оценить код - донесите данную ситуацию до стадии корректного закрытия текущего этапа работ - но дальше предложите уже введение стайл гайда если оно того требует. Я полагаю что на самом деле нет. Дав сейчас ответ на вопрос в виде оценки качества кода вы сделаете только одно - абсолюно необоснованно дадите агрумент в явно перекошенном споре, и просто возьмете на себя еще один мешок кармогрязи которую будуете еще сколько-то положенного времени отрабатывать.

    Подумайте хорошо на эту тему - придется выбрать свою сторону.
    Ответ написан
    Комментировать
  • Приложение в docker: зачем разделять по контейнерам?

    @iborzenkov
    Да ни зачем это не нужно.
    У них мануалы написаны потому что круто мы так могем.
    Сделайте отдельный контейнер с (nginx, php-fpm, mysql, mongo, redis) и вашим сайтом и отлично. Я вообще вижу смысл разделять только на 3 части на продакшене - хранилище, в котором лежат все ваши базы и которое нужно бэкапить (как раз удобно - контейнером), код, который вы при деплое меняете и маштабируете и балансеры, которые одни у приложения
    В базовых контейнерах задача развернуть по быстрому утилиту чтобы посмотреть.
    Поверьте, ничего хорошего из этого не выйдет

    sudo docker ps | wc -l
    92

    при 10 сервисах

    Объединяйте в контейнер ваше приложение, если вашему веб-приложению требуются для работы несколько баз, с десяток воркеров на бэкэнде, сложный конфиг нгинкса куча кронов и так далее, то вот это все и заверните в один контейнер.
    Ну а если у вас простой сайт на стандартном фреймворке и одной базе, то не очень то и нужны вам контейнеры.
    Ответ написан
    7 комментариев
  • С чего начать в Scala (?) разработчику из PHP мира?

    @wing_pin
    Люблю сгущенку и функциональное программирование
    1) Да, вполне годный инструмент. Сам я пришел к Java и Scala после Ruby и Node.js
    2) Есть хорошая книга "Scala для нетерпеливых"
    Ответ написан
    1 комментарий
  • С чего начать в Scala (?) разработчику из PHP мира?

    У твиттера был годный проект по изучению Scala - twitter.github.io/scala_school/ru
    PlayFramework 2 мне лично понравился в свое время (писал диплом на нем), но там я правда больше на Java писал, чем на Scala.
    А так соглашусь с unabl4 - для простых и не очень апи это точно будет перебор, так как потом в один прекрасный момент получится так, что поддерживать все это дело сможет только 1 человек, который все это и понаписал.
    Ответ написан
    2 комментария
  • Выбор роутера (да, снова) – какой для задачи подходит?

    Jump
    @Jump
    Системный администратор со стажем.
    Пробивать двухметровую бетонную стену (в принципе, мощности текущего zyxel'я тоже достаточно)
    Со всей ответственностью заявляю - двухметровую бетонную стену не пробъет ни один WiFi роутер.

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

    Впринципе, нужен просто роутер. Который роутит. Всё (-:
    А эта модель чем плоха? С такой нагрузкой он точно справиться в плане роутинга.
    Другое дело WiFi, но там уже от самого роутера немного зависит.

    802.11n
    Поддерживает практически любой современный WiFi роутер.
    Подключение NAS
    Поддерживают абсолютно все роутеры.
    Одновременная работа в двух диапазонах (2.4/5 ГГц)
    Поддерживается большинством современных SOHO роутеров среднего и выше ценового сегмента.
    Ответ написан
    5 комментариев
  • Как правильно использовать Docker для веб разработки?

    zvd
    @zvd
    Software developer interesting in DevOps
    Добрый день.
    Все, как вы их назвали, «задачи» должны быть по разным контейнерам.

    1. Что брать за базовый образ?
    Что используете то и берите. Используете в работе Debian? Берите Debian ( https://registry.hub.docker.com/_/debian/ )
    2. Чтобы создать свой базовый образ который будете в дальнейшем использовать для приложения, вот вам пример Dockerfile:
    #
    # MyBaseimage Dockerfile
    #
    
    # Pull base image.
    FROM ubuntu:14.04
    
    MAINTAINER Your Name <your.email@gmail.maybe>
    
    RUN apt-get update
    RUN apt-get upgrade -y
    
    RUN apt-get install -y language-pack-en
    ENV LANGUAGE en_US.UTF-8
    ENV LANG en_US.UTF-8
    ENV LC_ALL en_US.UTF-8
    
    RUN locale-gen en_US.UTF-8
    RUN dpkg-reconfigure locales
    
    RUN echo "Etc/UTC" > /etc/timezone
    RUN dpkg-reconfigure -f noninteractive tzdata
    
    RUN apt-get install -y build-essential
    RUN apt-get install -y python python-dev python-setuptools python-pip python-virtualenv
    RUN apt-get install -y libxml2-dev wget
    RUN apt-get install -y libpcre3
    RUN apt-get install -y libpcre3-dev
    RUN apt-get install -y libssl-dev
    RUN apt-get install -y libncurses5-dev
    RUN apt-get install -y git git-core
    RUN apt-get install -y libpq-dev
    
    # install nginx
    RUN apt-get install -y software-properties-common python-software-properties
    RUN apt-get update

    Собрать image в директории где у вас лежит Dockerfile
    docker build -t your_docker_account/your_baseimage .

    3. Dockerfile для сборки вашего образа уже с приложением
    #
    # MyApp Dockerfile
    #
    
    # Pull base image.
    FROM your_docker_account/your_baseimage
    
    MAINTAINER Your Name <your.email@gmail.maybe>
    
    # Set instructions on build.
    RUN virtualenv /env
    ADD ./ /code
    
    RUN cd /code; /env/bin/python setup.py install
    RUN cp /code/config/config.yml.docker_example /etc/code/config.yml
    
    # Expose ports.
    EXPOSE 8484
    WORKDIR /code
    CMD ["/env/bin/python", "app.py"]

    4. Собрать образ с приложением
    docker build -t your_docker_account/your_app_container .

    5. Запустить контейнер с БД, в качестве примера PostgreSQL
    docker run -p :5432:5432 --name my_postgresdb_container -e POSTGRESQL_DB=mydb_name -e POSTGRESQL_USER=mydb_user -e POSTGRESQL_PASS=super_secret_password -d kamui/postgresql

    для mariadb аналонично, контейнеры ищем здесь: https://registry.hub.docker.com/
    6. Запустить контейнер с вашим приложением, пример:
    docker run -d -p :5000:5000 \
      --name my_app_container \
      --link my_postgresdb_container:postgresdb \
      -e DOCKERDB_ENV_POSTGRESQL_DB=mydb_name \
      -e DOCKERDB_ENV_POSTGRESQL_USER=mydb_user \
      -e DOCKERDB_ENV_POSTGRESQL_PASS=super_secret_password \
      your_docker_account/your_app_container

    7. Подключиться к запущенному контейнеру с приложением
    docker exec -it your_app_container /bin/bash
    8. Читать stdout запущенного приложения в контейнере
    docker logs -f your_app_container

    + Чтобы автоматизировать запуск всех необходимых контейнеров берите Docker Compose ( https://docs.docker.com/compose/ )
    Пример файла конфигурации:
    your_app:
      build: .
      links:
        - postgresdb
      ports:
        - "5000:5000"
      environment:
        DOCKERDB_ENV_POSTGRESQL_DB: mydb_name
        DOCKERDB_ENV_POSTGRESQL_USER: mydb_user
        DOCKERDB_ENV_POSTGRESQL_PASS: super_secret_password
    postgresdb:
      image: kamui/postgresql
      ports:
        - "5432:5432"
      environment:
        POSTGRESQL_DB: mydb_name
        POSTGRESQL_USER: mydb_user
        POSTGRESQL_PASS: super_secret_password

    И теперь вместо пунктов 5 + 6 где мы запускали контейнеры мы можем всё стартануть одной командой
    docker-compose up

    + можно смонтировать код в контейнер и разрабатывать непосредственно в docker'контейнере.
    Надеюсь чем-то вам помог.
    Ответ написан
    3 комментария
  • Почта для домена: gmail vs. яндекс

    @psthv2
    У меня есть действующая доменная почта для гугла и яндекса. Если кратко:
    Google Apps Яндекс
    Платно — бесплатно
    Фильтры плохи — хорошие
    Скорость загрузки низкая — высокая
    Возможность пересылать несколько писем отсутсвует — присутсвует
    Удобство гугл аккаунта как единственного аккаунта — нет такой опции
    Интерграция с гугл диском и гугл докуементами есть — жалкое подобие в виде яндекс диска
    Синхоронизация контактов с телефоном отличная — через жопу
    Интерфейс ногу сломаешь — отличный
    Встроенный календарь отличный — говно
    Возможность встраивать приложение для почты (например плагины для систем управления проектами) прямо в веб-морду gmail — нет таких опций (насколько мне известно).
    Возможность отправлять письма с задержкой с помощью сторонних платных приложений — бесплатная встроенная возможность.
    Возможность создавать любое количество псевдонимов для почты — можно использовать в качестве псевдонима формат типа <номертелефона>yandex.ru
    Приятный интерфейс написания нескольких писем без закрытия основного веб-интерфейса — нет такого интерфейса.
    Нет уведомления получателя по СМС — есть такое уведомление.

    Функциональность Gmail огромна, но во многих местах реализована не шибко юзерфрендли.
    Ответ написан
    2 комментария
  • Какие вопросы задают на собеседовании на позицию scala-программист?

    @sectronix Автор вопроса
    Нашёл линк, по которому есть список вопросов на позицию Scala-разработчика.
    Ответ написан
    Комментировать
  • На чем писать парсер сайтов? на PHP или Ruby?

    Jump
    @Jump
    Системный администратор со стажем.
    На чем писать парсер сайтов?
    - на чем умеете.
    Выучить руби оно конечно можно, но не ради написания парсера, к тому же парсер написать на руби ничуть не легче чем на пэхапе.

    в пыхе есть нормальная многопоточность?
    - той которая есть для парсера хватит с лихвой.

    Он нормально спарсит сайт в 200к-500к страниц и будет парсить каждое утро в 9-00

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

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    PHPStorm - IDE
    Vagrant / Docker - виртуальные окружения, для разработки максимально близкие к production
    PuPHPet - для быстрого развертывания нового окружения
    bash и все-все-все - практически любая работа с удаленными серверами
    Gitlab/Github - управление репозиториями/задачами
    Gitlab-CI/Travis-CI - тестирование проектов
    Ответ написан
    Комментировать
  • Как установить Phalcon + Nginx + PHP-FPM+ база?

    @myLizzarD
    PHP developer
    какой смысл вам подсказывать, если вы выполните инструкции и забудете. А потом при возникновении каких-нибудь проблем, например обновить mysql или установить php-расширение - побежите на форум. Вам самому должно быть это противным, если вы программист. Нужно просто уделить 1 день на какой-нибудь видео урок "как работать с linux-системой". Это вам пригодиться не раз.
    Ответ написан
    Комментировать
  • Оставлять активным рабочий стол при отключении с сохранением разрешения – как?

    edinorog
    @edinorog
    Троллей не кормить!
    Отказаться от родного RDP.
    Ответ написан
    Комментировать
  • PHP цикл: как реализовать вывод названия CSS класса через один раз?

    но вообще это реализуется на css
    div:nth-child(3n+1) {
    каждый первый блок
    }
    div:nth-child(3n) {
    каждый третий блок
    }
    Ответ написан
    2 комментария
  • Как исправить ошибку "recv() failed (104: Connection reset by peer) 502" в php-fpm / nginx?

    @CHADo
    Siege разорвал соединение, пока nginx получал данные от php-fpm или что там у тебя в /etc/nginx/conf.d/*.conf;

    Начни с тестов без php, сделай каталог с простым index.html и натрави туда. Если ошибки остались, дело в кол-во обработчиков: 4 процесса по 768 медленнее, чем 1 процесс с 3072 сокетами на современном железе. Подними worker_connections до 2048 хотя бы.

    Далее с backlog
    Через sysctl net.core.somaxconn узнай значение backlog, если оно меньше параметра worker_connections то в sysctl.conf увеличивай до значения = worker_connections
    Такое же значение укажи в fpm listen.backlog
    Ответ написан
    9 комментариев