• PHP 7 - как сделать простую обфускацию кода?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Цель - усложнить разбор проекта в случае воровства, т.к. попытки уже были.
    Если попытки были - потратьтесь на ionCube!
    Окупится быстро!
    Ответ написан
    Комментировать
  • Как и где хранить техническую документацию?

    DDDsa
    @DDDsa
    Хороший подход — docs as code.
    Мы ведём все документы в git-репозиториях, в формате Markdown. Исходники обёрнуты в Foliant, который может в любой момент из md собрать PDF, docx, сайт, гугл-док или что угодно. Например, многие проекты с документацией автоматически собираются в базу знаний при помощи GitLab-CI. При каждом пуше изменений в репозиторий сайт пересобирается и мы уверены, что там всегда свежие доки. А как только менеджер просит готовый документ — можно тут же собрать PDF, с коропоративным лого и т д.

    При этом исходники всегда лежат в plain-text в репозиториях, что даёт возможность работать над доками вдвоём и втроём, со всеми взрослыми фишками вроде девелоп и мастер веток, фичей, релизов, как будто это код.
    Ответ написан
    Комментировать
  • Какой дистрибутив Linux выбрать для широкого круга задач?

    kotomyava
    @kotomyava
    Системный администратор
    Mint неплохой вариант: и выглядит хорошо во всех вариантах, и построен на ubuntu, соответственно имеет большую базу довольно свежих пакетов, и не требует лишних телодвижений по настройке графического окружения и.т.п. Это отличный вариант в стиле поставил, и пользуешься, при этом не плюёшься от внешнего вида. =)

    По вашим вариантам:
    Kali инструмент для вполне определённой работы. Это не дистрибутив общего назначения. Будет неудобно использовать для чего-то кроме основного назначения.

    Debian потребует времени и знаний, чтобы получить удобное окружение, то же и с Arch, и даже в большей мере - он больше ориентирован на энтузиастов.

    Fedora разумный вариант но может быть местами не стабильной, и OpenSuse будет на следующем месте за ней. Это, в целом, вполне неплохие дистрибутивы для использования на десктопе.

    Ну и незаслуженно нет в списке Ubuntu, где, кстати, есть больше одного DE, и внешний вид можно легко менять и довольно кардинально, если уж на то пошло. =) Если нет по какой-то причине жёсткой завязки на rpm, то Ubuntu и её производные это лучший вариант.
    Ответ написан
    1 комментарий
  • Какой дистрибутив Linux выбрать для широкого круга задач?

    chupasaurus
    @chupasaurus
    Сею рефлекторное, злое, временное
    OpenSuse - если очень хочется RPM, Debian Buster (т.е. текущий Testing, через полгода будет следующим стабильным) или Arch если умеете готовить.
    Kali - это дистрибутив для полевых работ, в котором кроме спецсофта практически ничего и нет, но при этом на тот же Debian всё оттуда прекрасно ставится.
    Fedora - это песочница для тестирования технологий, для любителей искать невзлетевший после апдейта софт.
    Windows - Tassel 5 поддерживает, как и R Studio. Admixture можно попробовать запустить в WSL, равно как и то, что вы не указали.
    Ответ написан
    1 комментарий
  • Какой дистрибутив Linux выбрать для широкого круга задач?

    CityCat4
    @CityCat4
    //COPY01 EXEC PGM=IEBGENER
    работал с kali, в целом и внешне и функционально нравится но говорят что глупо иметь её как основную, так ли это, и почему?

    Потому что дистриб специализированный для инженеров по сетевой безопасности.
    2 года стоял ubuntu (biolinux, шустрый, но не понравился внешне)

    дистриб не может "не понравится внешне". В любом дистрибе есть куча DE, экспериментируя с которыми можно получить тот вид, который хочется, тем более в бубунте. При выборе дистриба (а не DE) обычно другие критерии:
    - Пакетный менеджер, то есть программа, которая обновляет пакеты, систему и т.д.
    - Система инициализации - systemd, init и т.д.
    - Модель обновления - пакетная или source-based
    Ответ написан
    3 комментария
  • Как сделать простую систему Лайков?

    Stalker_RED
    @Stalker_RED
    Да, нужно сделать отдельную таблицу многие-ко-многим, в которй будет user_id и post_id.

    И можно сделать уникальный ключ по этим двум полям, чтобы избежать дублирования.
    Ответ написан
    2 комментария
  • Как настроить парсинг XML при помощи XMLReader на PHP для конкретного поставщика?

    @Farwisdomer
    Моё мнение: нужно стандартизировать вид xml путем внедрения dtd или схемы. И доступность описать как аттрибут, к примеру <param name="status", available="true">. А так вы до бесконечности будете править код, один поставщик пришлет <available>false</available>, второй <available>no</available>, а третий <available>да нащальникамана, есть</available>. DTD же строго укажет допустимые значения аттрибута и значение по умолчанию. Тогда парсер будет един для всех заказчиков.
    Ответ написан
    2 комментария
  • Как назвать переменную?

    vt4a2h
    @vt4a2h
    Senior software engineer (C++/Qt/boost)
    Да тут вариантов не много. Переменная, которая хранит тип лицензии должна называться licenseType.
    Ответ написан
  • Переход на mysqli, как по новым стандартам?

    Sanasol
    @Sanasol Куратор тега PHP
    нельзя просто так взять и загуглить ошибку
    Открыть документацию? Да не, бред какой-то.

    А вообще не надо менять шило на мыло, используйте PDO.
    Ответ написан
    6 комментариев
  • В чем суть миграций БД?

    @awesomer
    СУБД можно разделить на 2 группы:

    1. С заранее определенной схемой данных (определенным списком таблиц и их колонок)
    2. И бессхемные


    СУБД с жесткими схемами и шустрее и лучше оптимизируются.
    Но обладают очень неприятным недостатком - вы не можете вот так легко и просто начать туда записывать новый вид данных, не предусмотренный при начальном создании БД.
    Процесс преобразования БД, при котором меняется схема (таблицы и их колонки; вспомогательные вещи такие как индексы и пр.) - и называется миграцией.
    Причем важный момент - изменения в структуру базы данных могут вноситься, когда она уже давно существует и наполнена важной информацией, которую нельзя потерять, что еще больше затрудняет процесс.
    И еще важный момент:
    Как правило та или иная версия программы рассчитана на работу или со старой или с новой схемой базы данных. Не одновременно со старой и новой. То есть перед, тем как вы начнете эксплуатировать новую версию - вам обязательно нужно произвести миграцию. И после того как произведете миграцию - уже нельзя будет использовать старую версию программы. Что еще дополнительно усложняет процедуру перехода на новую версию программы.
    Ответ написан
    Комментировать
  • И все-таки PHP 7 быстрее Python 3?

    @YuriWeb
    Вам стоит поработать с PHP7 и каким-нибудь нормальным фреймворком типа Symfony 4 - очень приятные ощущения.

    А насчет скорости - все зависит от приложения. У нас например много бизнес логики и коммуникация с БД это только 20% от времени выполнения. Так что скорость и потребление памяти очень даже имеют значение.

    Синтетические тесты конечно ничего не гарантируют, но PHP 7 реально быстрый.
    Ответ написан
    Комментировать
  • Зависает php процесс?

    @BorisKorobkov
    Web developer
    Воркер "не умирает после N задач", потому что последнюю N-ную задачу он еще и не выполнил. А почему не выполнил - надо разбираться с вашими исходниками сайта, а не самого PHP. Где-то циклится.
    Для начала обновите Laravel до последней версии (5.7.2).
    Можно выставить set_time_limit, но это решение не проблемы, а последствий.
    Для поиска причины пишите unut-тесты, наймите тестировщика, включайте логирование при вызове каждой функции и пр.
    Ответ написан
    3 комментария
  • Пожалуйста оцените мое убогое ООП?

    Adamos
    @Adamos
    Во-первых, трудно поверить, что нет кучи готовых решений, разбирающих лог Апача.
    Так что задание, очевидно, учебное, на использование языка и понимание, что такое ООП.
    Так вот, ООП в РНР - это чтобы один раз сделать грязную работу, и больше в нее не заглядывать, используя готовый и по возможности очевидный интерфейс класса.
    У вас же одноразовая портянка, в которой даже имена файлов жестко прописаны в коде, убогие комментарии вместо PHPDoc и вообще ощущение, что ООП вы начали заниматься вчера и считаете его просто возможностью загнать побольше функций в один класс.
    Ну, и результат соответствующий. Вам нужно не исправить это решение, вам нужно позаниматься ООП в РНР некоторое время и прийти к соответствующей парадигме в мышлении. А этот класс можете просто выкинуть.
    Ответ написан
    4 комментария
  • Пожалуйста оцените мое убогое ООП?

    Stasgar
    @Stasgar
    Обученная макака
    Во-первых: начните изучать архитектурную часть программирования, изучите паттерны проектирования, изучите SOLID, DRY, KISS и остальные модные словечки, постарайтесь всё это осознать, или, на крайняк - зазубрить. Всё придет с опытом, изначально все не понимали зачем всё так сложно, но эта сложность обусловлена неисчислимыми литрами слёз и потраченных нервов, всё не просто так.

    Судя по всему это тестовое или учебное задание. От вас требовалось отоверинжинирить простую задачу. Давайте попробуем:

    Суть задачи - есть файл с определенной структурой хранения данных, структура строковая. Требуется этот файл преобразовать в другую структуру данных и вывести эту структуру в json формате. Задача ясна.

    Разобъем задачу на отдельные независимые этапы:
    1) Преобразование одной структуры данных (текстового файла) в другую (объект, понятный PHP, к примеру)
    2) Преобразование этой структуры данных в Json формат.
    Первый вопрос, который может возникнуть - почему сразу не преобразовать в json? Ответ - при расширении системы в будущем - нам понадобится вывести данные в виде массива, или в виде XML, или даже в виде готового файла Excel. Нам будет сложно дополнять логику изначального класса, ничего при этом не сломав и не затронув уже существующий функционал. Также ответом на этот вопрос может являться каждая буква из SOLID принципов, подробнее отвечу дальше, когда буду пояснять за реализацию, см. ниже

    Теперь рассмотрим эту задачу с точки зрения ООП, начнем думать не от конкретной реализации, а от интерфейса и абстракции (мы не парсим конкретный файл, мы парсим просто файл, мы не переводим его в конкретное представление json, мы переводим его просто в представление):
    Нам понадобится 2 класса - непосредственно класс, читающий файл и преобразующий его в простейший тип данных (например PHP array). Второй класс - преобразователь простейшего типа данных парсера в какой-то определенный тип:
    1. LogFileReaded implements/extends FileReaderContract(интерфейс, возможно абстрактный класс, если понадобится предустановленная логика)

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

    2. JsonPresenter implements/extends DataTypePresenterContract

      Абстракция содержит контракт на метод output(), а в конструкторе принимются исходные данные. В конкретной реализации JsonPresenter в output() будет банальный json_encode() (да, это нормально, нет, класс не лишний и нет, json_encode() нельзя пихать в сам парсер) А теперь к вопросу - почему не следует просто запихать это всё в парсер и вместо массива отдать json: в будущем, когда система будет расширяться - нам понадобится представить данные в виде XML - что тогда будем делать - переписывать весь код парсера ради добавления switch case "json" и т.д.? А если что-то сломается во всей системе? А если вариантов представления станет настолько много, что файл будет просто не читаем? А при данном подходе достаточно будет просто написать новый класс XMLPresenter, или даже ExcelPresenter, который на выводе не строку будет выдавать, а целый файл (опустим типизацию output пока)). Также этот класс можно реализовать в виде декоратора (паттерн), да и много еще как.



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

    К примеру: в итоге, если вас уже повысили, и вы вместо парсинга стали заниматься более высшими материями - новому программисту, чтобы дописать логику преобразования данных в Excel не нужно знать как конкретно вы преобразовывали когда-то эти данные в json, ему не нужно дебажить ваш код, ему достаточно посмотреть на интерфейс - отнаследоваться от него и написать свой собственный метод преобразования и дальше использовать его в нужном месте.

    P.S. В данной реализации опускаются и упрощаются некоторые моменты для понятности
    Ответ написан
    21 комментарий
  • Можно ли заставить doctrine валидировать поля при создании сущности?

    skobkin
    @skobkin
    Гентушник, разработчик на PHP и Symfony.
    Доктрина создает сущности при помощи рeфлексии, в обход конструктора и сеттеров.

    С помощью десериализации. (UPD: см. комменты, уже не актуально)

    Видимо предполагается, что состояние, хранящееся в БД, всегда валидно. Но так бывает не всегда.

    Это ваша задача этого не допускать. Если вы это допустили, ошибки Doctrine - это меньшее, что может вылезти.

    Например, в БД есть nullable поле `name`, которое в сущности не должно быть nullable

    Ну так может быть стоит привести схему и сущность с маппингом в соответствие друг другу, а не отстреливать симптомы?

    public function getName(): string
    и если в БД руками проставить null, то ошибка возникает только при запросе этого геттера.

    Решается это так:
    public function getName(): ?string

    Я сначала было хотел вам предложить валидировать данные на входе в сущность (конструктор), но потом читая ваш вопрос дальше, понял, что вы вообще используете Doctrine очень странно и ждёте, что сама Doctrine будет вам предоставлять средства для ухода от возникающих проблем.
    Первое и самое важное: Doctrine - это Data Mapper. Если у вас маппинг и сущность не соответствуют схеме - работать ничего нормально не будет. Лечите заболевание, а не симптомы.
    Ответ написан
    7 комментариев
  • Задавать явно все default значения для полей через php каждый раз при создании объекта?

    voronkovich
    @voronkovich
    Я бы использовал оба способа одновременно:
    • Указывать значение по умолчанию в сущности необходимо, т.к. сущность всегда должна быть валидна;
    • Указывать значение по умолчанию для столбца тоже необходимо, т.к. бывают случаи когда приходится работать с "голым" SQL.
    <?php
    
    namespace App\Entity;
    
    /**
     * @Entity
     */
    class User
    {
        const DEFAULT_ROLE = 'user';
    
        /**
         * @Column(type="string", options={"default": User::DEFAULT_ROLE})
         *
         * @var string
         */
        private $role = self::DEFAULT_ROLE;
    }
    Ответ написан
    1 комментарий
  • Как лучше организовать структуру объекта категории, у которого есть большой текст?

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

    Я бы посоветовал использовать MySQL или что угодно другое, что будет поддерживать быстрые выборки по первичному ключу, а поиск по параметрам проводить через специальные средства — например, тот же sphinx.

    Просто индексируете сфинксом свою базу, ищете ч/з сфинкс, он возвращает Id записи, по ид уже быстро вытаскиваете контент из MySQL.
    Ответ написан
    Комментировать
  • БД под миллиарды записей и быстрые выборки

    Денормализация -> нет необходимости делать JOIN'ы -> возможность отказа от SQL -> возможность горизонтального масштабирования -> profit
    Ответ написан
    Комментировать
  • Почему не работает update?

    DevMan
    @DevMan
    description и text являются зарезервированными в мускуле.
    если хотите их использовать как названия колонок, то используйте бэктик: `description` и `text`. ну и это кагбе общепринятое правило для избегания ошибок.
    Ответ написан
    9 комментариев