• Зачем шифровать скрипты, например PHP с помощью ionCube 9?

    Sanasol
    @Sanasol Куратор тега PHP
    нельзя просто так взять и загуглить ошибку
    А если серьезно, то это у них вроде ускоряет загрузку скриптов. Что-то типа компиляции в байт-код.

    маркетинг шит 146%
    не может быть быстрее при как минимум еще одной обработке сверху в видел модуля для запуска закодированного кода. Ресурсов наоборот больше сожрёт, скорость в лучшем случае не упадёт.

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

    когда продаешь самохостящийся продукт на php в котором есть проверка лицензии или просто супер гениальные алгоритмы которые не хочется раскрывать. Чаще конечно никаких гениальных вещей там нет и шифруют только ради проверки лицензии и отключения софта когда лицензия кончилась.

    Как правило все версии(кроме самых самых свежих) любого шифровальщика относительно легко раскрываются с помощью гугла/форумов DeZender'ов или даже онлайн сервисов.
    Вскрытие не всегда бесплатно естественно и не всегда прокатывает(точность не 100% при восстановлении, суть уловишь, но исходиники будут не рабочие).
    Суть вскрытия в удалении/обходе проверки лицензии.
    Т.к. особо там ничего не придумаешь, то проверка лицензии это зачастую просто запрос на сайт продавца из разряда
    $license_ok = file_get_contents("http://shopcms.com/check_license.php?domin=customer.com");
    if($license_ok) {
    //ok
    } else {
    die("Pay for license");
    }


    Поэтому обходится примерно так:
    Без изменения оригинального кода и работой с зашифрованынми исходниками(в случае если расшифровать не удалось до конца, но суть проверки лицензии понятна)
    1. Заворачиванием сайта продавца на локалхост с вечной лицензией. (прописать в hosts файл)
    2. Подменой глобальных переменных($_SERVER) чтобы проверялся домен на котором есть лицензия. (вставить в index.php или другое место где исходники открыты)

    Если исходники расшифровались правильно и работают
    3. Выпиливанием проверки лицензии из исходников.

    Лень искать, а точнее поиска нет по овтетам, но уже писал.
    Я считаю что шифрование никак не увеличит продажи или защитит от мамкиных хакеров.
    Кто очень хочет - он будет ломать, в случае неудачи просто не будет пользоваться.
    Кто адекватный - будет платить в любом случае за СЕРВИС/ОБСЛУЖИВАНИЕ. Т.е. получать обновления и поддержку разработчиков.

    ОЧЕНЬ много скриптов лежат взломанные или ходят по рукам массово, но я не видел чтобы разработка хоть сколько-то хорошего продукта после этого прекращалась или закрывалась по финансовым причинам.
    Даже думаю это положительно сказывается на продкуте и его клиентах какой никакой пиар.

    Возможно даже можно сравнить с борьбой с пиратами.
    Закрывают торренты, видео сайты, судятся из-за "упущенной прибыли".
    При этом продолжают снимать и прибыли только растут с годами.
    Никто так и не доказал что раздача кинца/игор на торренте равняется потери прибыли.
    И опять же даже наоборот помогает некоторым продуктам увиличивать аудиторию.

    PS. Забыл решение написать грамотное по моему мнению.

    1. Если у вас действительно супер-пупер секретный алгоритмы которые никто не знает или может повторить.
    Использовать исключительно модель SaaS или производить вычисления через ваш сервер(но продукт всё равно будет стоять на сервере клиентов).

    2. Если никаких алгоритмов взлома гугла/пентагона/игил/телеграма там нет.
    Просто отдавать открытые исходники для работы.

    3. Если вы пишите очень плохой код и вам стыдно или хороший код, но вы жадный.
    Используйте SaaS.
    Технологии позволяют привязать домен клиента к вам, создать ему отдельное рабочее пространство(виртуалку/сервер) и всё что только придумать можно.
    Ответ написан
    4 комментария
  • Как правильно передавать и сохранять данные между классами?

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

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


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

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


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

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

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

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

    AMar4enko
    @AMar4enko
    Адок. За такое в приличных домах бьют подсвечниками
    Ответ написан
    1 комментарий
  • Как разбить большую функцию на несколько мелких?

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

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

    пароль в sha512+соль и случайно сгенерированная соль через хеш sha512 из rand().

    Я запутался пока читал это, используйте стандартные функции php, без всяких "сгенерировал, захешировал куском другого хеша и т.д."
    password_hash
    password_verify

    Авторизация проверяется так: производится выборка из sessions по ip и сверяется токен из куки и таблицы, если равно, то берется id пользователя и идет выборка уже из accoins where id=id

    т.е. если мне попался динамический IP другого пользователя я попаду под его аккаунт? А логин и пароль вообще не нужны или как?

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

    Если хотите вечную авторизацию:
    Токен генерируйте по IP+useragent.
    Других вариантов тут нет и не надо.

    В чем проблема с двумя авторизациями? Будет два токена для одного пользователя, и авторизация останется активной в двух местах.
    Ответ написан
    2 комментария
  • Какую ide выбрать?

    DJZT
    @DJZT
    Laravel - code for you
    У PHPStorm есть синхронная удалённая правка. Как минимум с 7+ версии я на нём и всегда она там есть, единственный момент - он качает себе копию фалов на компьютер и при каждом нажатии Ctrl+S загружает на сервер.
    А что с дизайном не так? Всё тут хорошо. Несколько тем и куча настроек. Что бы глаза не болели - выбирайте тёмную и всё.
    P.S. Долго выбирали с женой телефон по характеристикам, а когда пришли в магазин - она закричала "Вот этот беленький хочу." (Анекдот)
    Ответ написан
    5 комментариев
  • Какую ide выбрать?

    @ArturArturov
    phpstorm - удобно, есть всё
    Ответ написан
    1 комментарий
  • Какую ide выбрать?

    Комментировать
  • PHP функция не видит внешнюю переменную?

    AloneCoder
    @AloneCoder
    [object Object]
    $nameErr = $emailErr = $genderErr = "";
    
    function checkDone($nameErr)
    {
    if($nameErr == "")
    {return "true";}
    else
    {return "false";}
    }
    echo checkDone($nameErr);
    Ответ написан
    Комментировать
  • Могут ли в PHP сокеты работать асинхронно?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Могут ли в PHP сокеты работать асинхронно?


    Да. Это называется non blocking sockets а не "асинхронно".

    но не понятно как дальше с этим работать.


    socket_select.
    Ответ написан
    1 комментарий
  • Какой из этих подходов в ООП лучше и как они называются?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    с самого начала у нас есть более-менее абстрактный класс


    Так не должно быть. "абстрактные" классы это способ устранения дублирования, нам больше важны интерфейсы объектов и полиморфизм. Но конкретно в рассматриваемом примере нам важна только инкапсуляция.

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

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

    Если мы хотим создать объект с каким-то состоянием по умолчанию - мы берем первый вариант (либо как в примере прописывваем прямо как значение свойства, либо сэтим в конструкторе).

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

    Если же мы хотим создать объект но он не может быть пустым, объект должен требовать начальное значение в момент создания. Тогда мы просто передаем значение в конструктор. Без этого значения (или с неправильным) мы не сможем создать объект. К примеру если у пользователя обязательно должен быть email и пароль имеет смысл "заставлять" разработчиков явно передавать их в конструктор объекта. Это эдакая вариация.

    А теперь попробуем первый и второй подходы вместе + третий кейс с обязательными параметрами:

    class User {
         private $id;
         private $email;
         private $password;
    
         public function __construct($email, $password) 
         {
               // это ваш первый пример только без наследования, оно не нужно
               // в нашей задаче идентификатор пораждается
               // при создании объекта самим объектом, состояние по умолчанию
               $this->id = Uuid::uuid4(); 
    
               // мы требуем входящие данные что бы задать начальное состояние
               $this->email = $email;
               $this->password = $password;
         }
    
         // мутация состояния, второй вариант.
         public function changePassword($password) 
         {
                $this->password = $password;
         }
    }


    То есть вся разница только в том, откуда приходят данные для формирование объектом своего состояния. Изнутри (первый случай) или снаружи (второй случай). Оба подхода вполне себе можно использовать вместе.

    Ну и да - зачем в вашем примере наследование и нейкий "абстрактный" класс - не понятно. Наследование это не принцип, это механизм для достижения полиморфизма подтипов. С ним нужно быть осторожно, особенно если с полиморфизмом не разобраться сначала.
    Ответ написан
    Комментировать
  • Как правильно работать с большими таблицами?

    @kifirch
    Лучше выбирать по 1000/5000 записей получать максимальное значение id (PK) и идти дальше, смещаясь по primary key. where id > ? limit 1000 order by id asc
    Limit/offset не гуд на больших объемах - так как, к примеру, offset 10000 limit 1000 переберет 10к строчек чтобы отдать 1000
    Ответ написан
    Комментировать
  • MySQL и высокие нагрузки?

    sanchezzzhak
    @sanchezzzhak
    Ля ля ля...
    даже гугл использует mysql правда видо измененный ( патчи фиксов доступы. )
    даже фейсбук используют mysql
    я молчу про Вк.. ( хотя там все кудахчут что собственная СУБД )

    В компании есть проект 8М запросов в сутки обычный mysql
    Уперлись когда были тормоза в PHP, слишком много кушал.
    Выпилили (частично) PHP заменили на голый ngnix + mysql = профит.

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

    erniesto77
    @erniesto77
    oop, rb, py, php, js
    $response = OdnoklassnikiSDK::makeRequest("users.getInfo", array("fields" => "name,pic_5", "uids" => $friends[0]));
    $first_friend = $response[0];
    Ответ написан
    2 комментария