Ответы пользователя по тегу PHP
  • В каком случае нужно отказаться от composer autoload и использовать spl_autoload_register?

    @miksir
    IT
    Если используется композер - то свои автолоады крайне не желательны, ибо вносят долю хаоса. Конечно, исключения возможны, например, автоматическое генерирование классов на из запросе и что-то подобное, но, имхо, даже это можно сделать используя стандартные схемы автолоада. А на крайний случай, да, можно использовать свой spl_autoload_register, но и тот я бы советовал подключать через files автолоада композера
    Ответ написан
    Комментировать
  • Как делают такие ограничения?

    @miksir
    IT
    Вы определитесь с целью.

    Если вы хотите давать разные виды доступа (с разными лимитами) разным пользователям - то да, считать. Не по IP, конечно, а по ключу/логину и т.п. Хранить в базе соответствующие показатели, накапливать запросы и пересчитывать счетчики с какой-то периодичностью. Если нагрузка мала - можно и на каждый запрос считать.

    Если цель - защитить скрипт от флуда - это делается на уровне веб-сервера или даже фаирвола. Но в таких случаях не стоят задачи "до 1000 запросов в день", там стоят задачи "N запросов в секунду". Для nginx, например, модуль ngx_http_limit_req_module.
    Ответ написан
    Комментировать
  • Как получать один объект в разных запросах?

    @miksir
    IT
    То, что вы говорите - называется патерном Identity Map и реализовано в некоторых ORM системах, например, в Doctrine.

    > Вот вопрос, как сделать так, чтобы можно было использовать единый метод для получения объектов user?

    Получая данные из базы проверять - есть ли в кеше сущность с таким же идентификатором.

    > Или все-таки это правильно, создавать новый объект в каждом запросе

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

    @miksir
    IT
    Нет, не так. Вот как:
    При регистрации пользователь вводит пароль к примеру 123, он хешируется через password_hash. Далее, при аутентификации пользователь вводит пароль 123, из базы по логину достается сохраненный хеш, и проверяется через password_verify.
    Ответ написан
    Комментировать
  • Правильно ли использовать __call так?

    @miksir
    IT
    __сall вызывается только если метода в классе нет, по-этому в вашем случае будете разное поведение при обращении к объекту извне и при обращении внутри класса, что не есть хорошо.
    Ради экономии одной строчки с return такое не стоит делать.
    Если уж делать, то полностью магию убрав setPreset вообще, или используйте IDE, который умеет генерить fluent setter
    Ответ написан
    3 комментария
  • Как убрать родительский тег P у картинки?

    @miksir
    IT
    Через дом, конечно, можно. Но это может быть довольно затратно, а так как эти теги вставляет ваш редактор (т.е. структура достаточно детерминирована), то много проще обойтись регекспом.
    preg_replace('/<p>(<img[^>]+>)<\/p>/', '$1', $html)
    Ответ написан
    Комментировать
  • Nginx + php7-fpm High load?

    @miksir
    IT
    5000 запросов в 1 секунду на PHP скрипт? Давайте начнем с PHP, может, а не с nginx. Считаете время ответа одного запроса T, считаете количество воркеров PHP N = 5000*T. Далее запускаете это число воркеров, делаете одновременные запросы на все воркеры и путем увеличения числа ядер процессора добиваетесь времени ответа сервера такого же, какой был на одном воркере. Ну, это без учета того, что если используется СУБД - ее время ответа тоже нужно будет исправлять на заданной конкурентности. Не хватает ядер, добавляем сервера.
    Ответ написан
    4 комментария
  • Почему не работает CHROOT с php-fpm?

    @miksir
    IT
    chroot - это смена корня ("/") файловой системы. PHP переключившись на новый рут ничего не знает об уровнях выше, для него корень теперь - /var/www/mysite.com/fileman. Т.е. когда вы говорите - выполни скрипт fastcgi_param SCRIPT_FILENAME /var/www/mysite.com$fastcgi_script_name; - он ищет от своего нового корня, а значит реально по файловой системе он ищет файл /var/www/mysite.com/fileman/var/www/mysite.com$fastcgi_script_name

    Если вы не понимаете, зачем вам чрут - лучше не использовать. Там может возникнуть много нюансов.
    Ответ написан
    Комментировать
  • Возможно ли на PHP организовать многострочный поиск без регулярок?

    @miksir
    IT
    $needleLen = strlen($needle);
    $pos = -$needleLen;
    while ( ($pos = strpos($haystack, $needle, $pos+$needleLen) !== false) {
    // ...
    }
    Ответ написан
    Комментировать
  • Допустимо ли в PSR-4 использовать два пространства имен верхнего уровня, и если да, то как их назвать?

    @miksir
    IT
    Во-первых, у вас удар по семантике уже нанесен смертельный когда вы начали делать неймспейсы Classes, Libs и Includes. Семантика - это назначение класса, но никак не его тип. Т.е. Controlles, Models, Services, Events и т.п. Но это лирика.

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

    Что до psr-4, он позволяет любую левую часть неймспейса (любого размера) мапить на любую директорию. Т.е. вы може свой \Heian\MyCoolProject\ отмапить в ./src/ и тогда \Heian\MyCoolProject\Libs будет ./src/Libs. Можете \Heian\MyCoolProject\Libs\ отмапить в ./mylib/ и т.д. Причем, таких мапов может быть сколько угодно, хоть все варианты неймпсейсов пропишите в мапинг.

    Хотя, конечно, обычно делают что-то вроде \MyVendor\Project\ в ./src/Project/ или просто \MyVendor\ в ./src/
    Ответ написан
    Комментировать
  • По каким причинам приватные свойства родителей имеют больший приоритет, нежели публичные свойства потомков?

    @miksir
    IT
    Потому что иначе по факту мы бы получили переопределение приватного свойства, что противоречит смыслу. По-этому, выбранная логика волне очевидна и не дает подводных камней.
    Ответ написан
    2 комментария
  • Работа с объектом PHP?

    @miksir
    IT
    Если уточнить ответ devman, у вас php не может найти RedBeanPHP\OODBBean на момент старта сессии. Автолоад или include файла с этим классом (если он вообще есть) следует сделать до старта сессии.
    Ответ написан
    Комментировать
  • Как правильно сделать выборку товаров по 100 параметрам (EAV)?

    @miksir
    IT
    Раз вам нужно убирать неподходящее в disable, то на реляционной базе, да еще с EAV - это будет ад, как по коду, так и по производительности.

    Самое очевидное решение тут брать подходящие для этих задач решения, например, elasticsearch. Вот, например, статья про такой вариант https://blog.madewithlove.be/post/faceted-search-u...
    Ответ написан
    Комментировать
  • Как сравнить даты раньше или позже?

    @miksir
    IT
    DateTime объекты поддерживают сравнение. Т.е. можно просто
    $eventTime = new DateTime($time);
    $now = new DateTime();
    if ($eventTime > $now) { // it's happens }
    Ответ написан
    Комментировать
  • Оптимизация запроса? Как правильнее? или какие еще будут идеи?

    @miksir
    IT
    SELECT l.contract,l.subs,p.period_name,SUM(nach) 
       FROM (SELECT contract,subs FROM allVp GROUP BY contract,subs) l 
                 CROSS JOIN billing_period p 
                 LEFT JOIN allVp v ON l.subs=v.subs AND l.contract=v.contract AND p.id=v.period 
       GROUP BY l.contr,l.subs,p.period_name;

    Здесь есть допущение, что у одного subs только один контракт, и что subs уникален. И вообще-то подзапрос для получения списка sub нужно менять на таблицу, где эти subs лежат, если мы говорим о базе в 3НФ. Выбирать все из allVp неверно.
    Ответ написан
  • Как добиться DRY в конфигурации nginx для множества однотипных сайтов?

    @miksir
    IT
    Генерировать чем-то еще. Это в какой-то мере полуофициальная позиция разработчиков nginx. Но если хочется все же поиграться с единым конфигом - смотрите в сторону одного server блока и подстановки туда всяких переменных (типа рута и т.п.) через map. Например,
    map $host $newroot {
    hostnames;
    default /home/notfound/www/;
    .mysite.ru /home/user1/mysite.ru/www/;
    include user2_map.conf;
    }
    server {
      listen 80 default;
      server_name _:
      root $newroot;
    }

    Да, и вот такое
    if ($host = 'www.$site_name') {
        rewrite ^/(.*)$ http://$site_name/$1 permanent;
    }

    лучше описать отдельно
    server {
       server_name ~^www\.(?<newhost>.+)$;
       return 301 $scheme://$newhost$uri$is_args$query_string;
    }
    Ответ написан
    Комментировать