• Как можно ускорить код php?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Для начала данный код нужно отрефакторить и сделать его хотя бы читабельным. Почитайте про рефакторинг, про ООП...

    Так как по коду нечего сказать скажу методы для ускорения работы уже написанного кода.

    1. Первый вариант это перейти на более последнюю версию php. Например, 7.х, 8.х. Особенно почувствуете разницу при переходе с версии 5.6 на 7.х. Однако какой-то код может сломать. Подходите этому внимательнее.

    2. Использовать кэширование. Кэшировать можно как внедрением в вашем коде кэширования, так и расширениями php вроде opcache.
    Ответ написан
    4 комментария
  • Кто-нибудь может помочь реализовать смену данных пользователя самим пользователем?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    Сначала дернуть из базы пользователя по юзернейму (по паролю нельзя, он хеширован)
    Если запись нашлась – хорошо, пользователь есть

    SELECT * FROM users WHERE username=:username

    Получаем объект/массив с данными пользователя
    Примерно такой:

    $user = [
      'id' => 1,
      'username' => 'vasya',
      'password' => 'длинный хеш'
    ]


    Потом проверяем старый пароль из формы, правильный ли

    password_verify($old_password, $user['hash'])

    Если прошли проверку, значит логин и пароль вбили правильно, можно менять

    Делаем хеш нового пароля

    $hash = password_hash($new_password, PASSWORD_DEFAULT);


    И закидываем в базу

    UPDATE users SET password=:hash WHERE id=$user['id']
    Ответ написан
    Комментировать
  • Для чего нужны Генераторы (yield) в php?

    @Nc_Soft
    парсим большие csv
    <?php
    function getRows($file) {
        $handle = fopen($file, 'rb');
        if ($handle === false) {
            throw new Exception();
        }
        while (feof($handle) === false) {
            yield fgetcsv($handle);
        }
        fclose($handle);
    }
    
    foreach (getRows('data.csv') as $row) {
         print_r($row);
    }
    Ответ написан
    5 комментариев
  • Как сделать сайт рабочим до определённого времени?

    rozhnev
    @rozhnev Куратор тега PHP
    Fullstack programmer, DBA, медленно, дорого
    Добавьте в index.php
    $hour = date('H:i');
    if ($hour < '08:00' || $hour > '23:00') die('Closed');


    run php online
    Ответ написан
    Комментировать
  • Работа с mysql с помощью php и удаление html?

    samodum
    @samodum
    Какой вопрос - такой и ответ
    Проще всего это делать через Ajax
    Ответ написан
    3 комментария
  • Актуальны ли админ панели на PHP?

    "Все" давно уже делают сайты без программирования - на Тильде или Битриксе (да, другие "все" знают, что Битрикс - [да]вно, но жизнь такова, что первые "все" продолжают его хавать).
    Ещё более другие "все" (те, которые разрабатывают не сайты, а веб-приложения или/и веб-сервисы), как правило, программируют "админки" на том, что лучше знают, или что им больше нравится.
    И эти "все", да, всё чаще делают фронт а-ля SPA, а на бэке остаётся только API.
    Ответ написан
    2 комментария
  • Как привязать @click к router-link?

    И не будет работать.
    Если нужен и переход и событие, сделайте свой обработчик, например
    <a @click="handleClick">Click Me</a>
    
    methods: {
        handleClick () {
          console.log('click')
          this.$router.push('/daw')
        }
      }
    Ответ написан
    Комментировать
  • Админка для laravel?

    daemonhk
    @daemonhk
    ПсиХоПат
    Проблема "админок" для любого фреймворка в том, что дальше CRUD'а и спизж... дизайна они уехать не могут.
    Ответ написан
    1 комментарий
  • Админка для laravel?

    Sanes
    @Sanes
    Сам пиши. Толку от генераторов CRUD мало.
    Ответ написан
    Комментировать
  • Есть ли какие-то методы написания кода, когда надо смешать php и html в одной строке?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Основная претензия к php это спагетти код . Используйте шаблонизаторы и разделяйте логику и отображение
    Ответ написан
    3 комментария
  • Высоконагруженный проект. Стоит ли переехать с PHP на NodeJS? Или может на что нить ещё?

    Sanasol
    @Sanasol Куратор тега Веб-разработка
    нельзя просто так взять и загуглить ошибку
    Если вы не можете на php сделать код который выдерживает нормальную нагрузку, то и на другом не сможете.
    Никакие проекты сходу не могут в нагрузку, никакая преждевременная оптимизация не закрывает все косяки которые вылезают на реальной нагрузке.

    Менять язык нет смысла.

    Какой PHP фрэймворк (из популярных) больше подходит для high load?
    Ответ написан
    Комментировать
  • Как защитить сайт от прямых ссылок на изображения со вставками изображений на других сайтах?

    OtshelnikFm
    @OtshelnikFm
    Обо мне расскажет yawncato.com
    Закрой сайт для интернета.
    Потому как что вышло в инет - уже не защитить. Картинки печатай на принтере и клади в сейф. Тогда не украдут.

    А так - борьба с ветряными мельницами.
    Ответ написан
    2 комментария
  • Как спроектировать фреймворк?

    php666
    @php666
    PHP-макака
    Я понимаю про SOLID там, но если следовать правилу единой ответсвенности, то файлов будет просто целая гора,
    да. так оно и и будет

    Также встает вопрос, например, у меня сейчас маршрутизация а-ля микрофреймворк, чтобы прикрутить MVC надо реализовывать поиск контроллера и вызов метода. Должен ли этим заниматься отдельный класс?
    не надо спрашивать такие вопросы. Если ты что-то пишешь, то должен быть уверен в правильности своей архитектуры. Иначе ты на каждый чих будешь вопрос задавать.

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

    Любой фреймворк сейчас - это совокупность из десятков кубиков, каждый из которых разрабатывался и тестировался десятками, а то и сотнями людей, лучших профессионалов в своей области. Попытки в 21 году написать свой фреймворк, всё равно, что в одиночку спроектировать автомобиль, ЛУЧШЕ, чем мировые аналоги. Аналогия примерно такая же, т.е. это НЕВОЗМОЖНО.

    Не занимайся ерундой.
    Ответ написан
    5 комментариев
  • Попросили проверить код, на что смотреть нужно?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Смотря зачем)). Я когда делаю Code Review критерии следующие:

    * Безопасность:
    - Каждый аргумент метода простого типа должен проверяться на тип в случае его проксирования и на граничные значения в случае обработки. Чуть что не так - бросается исключение. Если метод с кучкой аргументов на 80% состоит из поверки из аргументов - это вполне норм))
    - Никаких trigger_error, только исключения.
    - Исключения ДОЛЖНЫ быть человеко-понятны, всякие "Something went wrong" можно отдавать пользователю, но в лог должно попасть исключение со стектрейсом и человеко-понятным описанием, что же там пошло не так.
    - Каждый аргумент (объект) метода должен быть с тайпхинтингом на этот его класс, или интерфейс.
    - За eval как правило шлю на **й.
    - @ допускается только в безвыходных ситуациях, например проверка json_last_error.
    - Перед работой с БД - обязательная проверка данных.
    - Никаких == и !=. Со swtich - единственное исключение, по ситуации.
    - Если метод возвращает не только bool, а еще что-то - жесткая проверка с ===, или !== обязательна.
    - Никаких условий с присваиваниями внутри. while($row = ...) - тоже идет лесом.
    - Магические геттеры/сеттеры разрешаются только в безвыходных ситуациях, в остальном - запрещены.
    - Конкатенации в sql - только в безвыходных ситуациях.
    - Параметры в sql - ТОЛЬКО через плейсхолдеры.
    - Никаких глобальных переменных.
    - Даты в виде строки разрешаются только в шаблонах и в БД, в пхп коде сразу преобразуется в \DateTimeImmutable (в безвыходных ситуациях разрешено \DateTime)
    - Конечно зависит от проекта, но как приавло должно быть всего две точки входа: index.php для web и console(или как-то по другому назваться) - для консоли.

    * Кодстайл PSR-2 + PSR-5 как минимум, + еще куча более жестких требований (для начала все то что в PSR помечено как SHOULD - становится MUST)
    - В PhpStorm ни одна строчка не должна подсвечиваться (исключением является typo ошибки, например словарик не знает какой-то из аббревиатур, принятых в вашем проекте). При этом разрешается использовать /** @noinspection *** */ для безвыходных ситуаций.
    - Если кто-то говорит, что пишет в другом редакторе и у него не подсвечивается, на эти отговорки кладется ВОТ ТАКЕЕЕНЫЙ мужской половой **й и отправляется на доработку)).

    * Организация кода:
    - Никаких глобальных функций.
    - Классы без неймспейса разрешаются только в исключительно безвыходных ситуациях.

    * Тестируемость (в смысле простота тестирования) кода должна быть высокая.
    - Покрытие кода обязательно для всех возможных кейсов использования каждого публичного метода с моками зависимостей.

    * Принципы MVC:
    - Никаких обработок пользовательского ввода в моделях, от слова совсем.
    - Никаких ***ть запросов в БД из шаблонов.
    - Никаких верстки/js/css/sql-ин в контроллерах.
    - В моделях НИКАКОЙ МАГИИ, только приватные свойства + геттеры с сеттерами.
    - В моделях разрешено использовать метод save(при наличии такого разумеется) только в исключительных ситуациях. Во всех остальных - либо insert, либо update.

    * Принципы SOLD:
    - Никаких божественных объектов умеющих во все.
    - Если метод для внутреннего пользования - private, никаких public.
    - Статические методы разрешаются только в случае безвыходности.

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

    * Работа с БД:
    - Запрос в цикле должен быть РЕАЛЬНО обоснован.
    - За ORDER BY RAND() - шлю на***й.
    - Поиск не по ключам (конечно если таблица НЕ на 5 строк) запрещен.
    - Поиск без LIMIT (опять же если таблица НЕ на 5 строк) запрещен.
    - SELECT * - запрещен.
    - Денормализация БД должна быть обоснована.
    - MyISAM не используется (так уж)) )
    - Множественные операции обязательно в транзакции, с откатом если чо пошло не так.
    - БД не должна содержать бизнес логики, только данные в целостном виде.
    - Не должно быть нецелесообразного дерганья БД там, где без этого можно обойтись.

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

    * О людях:
    - "Я привык писать так и буду дальше" - не вопрос, ревью пройдешь только когда поменяешь свое мнение.
    - "Я пишу в vim-е и мне так удобно" - здорово, код консолью я тоже в нем пишу)) но есть требования к коду, если в них не сможешь - не пройдешь ревью.
    - "Я скопировал этот страшный метод и поменял 2 строчки" - это конечно замечательно, но по блейму автор всего этого метода ты, так что давай без говняшек, хорошо?
    - "Оно же работает!" - вот эта фраза переводится примерно так: "да, я понимаю, что пишу полную хрень, но не могу писать нормально потому, что руки из жо", я правильно тебя понял?))
    - "У меня все работает!" - рад за тебя, а как на счет продакшна?
    - "Там все просто" - не используй слово "просто", от слова "совсем". Вот тебе кусок кода (первого попавшегося с сложной бизнес логикой), где там ошибка (не важно есть она, или нет)? Ты смотришь его уже 2 минуты, в чем проблема, там же все "просто"))

    * Всякое:
    ActiveRecord (это я вам как в прошлом фанат Yii говорю) - полное говно, примите за исходную. По факту у вас бесконтрольно по проекту гуляют модельки с подключением к БД. Не раз натыкался на то, что в тех же шаблонах вызывают save, или update (за такое надо сжигать).
    То, что используется Laravel - это печально((. Что бы выполнить требования приведенные выше, приходится "воевать" с фреймворком.

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

    UPD

    Формализировал данные критерии по ссылочке: https://github.com/index0h/php-conventions
    Ответ написан
    55 комментариев
  • Генерация уникального ID

    alexvy
    @alexvy
    интернет-маркетолог
    самый простой способ - взять unix-время, разбить на группы разрядов:
    140-785-156
    уникальности с девятью разрядами хватит на 30 лет
    даже если конкурент догадается как вы получаете ID - это ему ничем не поможет

    UPD: Проблему уникальности можно решить модифиицируя непосрдственно ключевое поле таблицы заказов - ALTER TABLE table_order AUTO_INCREMENT. mySql сам проследит за его уникальностью
    Ответ написан
    3 комментария
  • Переход к PHP-фреймворку. Какому?

    @galliard
    Laravel - если нужно быстро собрать MVP из говна и палок.
    Symfony - для всего остального (хотя лично я и MVP предпочитаю на нем собирать).
    Ответ написан
    Комментировать
  • Переход к PHP-фреймворку. Какому?

    @kedrovdanil
    Laravel сейчас маст-хэв для PHP, он не самый лёгкий для начинающего за счёт множества абстракций, но после него легко переехать на много чего можно. Он даёт понимание того, как всё строится. Ну и плюсом по нему сейчас больше всего вакансий за счёт его популярности, а значит ещё и большое сообщество, что тоже плюс.
    Ответ написан
    Комментировать
  • Почему при подключении трейта в два класса, один из этих классов программа перестает видеть?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Столкнулся с необходимостью применения трейтов PHP, и тут проблема.

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

    Конструктор в трейте - это, не нахожу подходящего цензурного слова, пусть будет табу.

    Что касается непосредственно вашей ошибки - смотрите в сторону автолодинга.

    https://github.com/index0h/php-conventions почитайте на досуге
    Ответ написан
    23 комментария
  • Как делать api яндекс деньги интерфейс (форма)?

    Sanasol
    @Sanasol Куратор тега Веб-разработка
    нельзя просто так взять и загуглить ошибку
    Как делать api яндекс деньги интерфейс (форма)?

    набор слов.

    Никак, интерфейс ввода карты будет от того сервиса который используется для оплаты.
    Нельзя просто так взять и получать даные карты на своём сайте в своей форме чтобы их использовать.
    Ответ написан
    Комментировать
  • Как установить Eloquent?

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


    composer require illuminate/database

    Ну а конфиг в readme лежит
    use Illuminate\Database\Capsule\Manager as Capsule;
    
    $capsule = new Capsule;
    
    $capsule->addConnection([
        'driver'    => 'mysql',
        'host'      => 'localhost',
        'database'  => 'database',
        'username'  => 'root',
        'password'  => 'password',
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
    ]);
    
    // Set the event dispatcher used by Eloquent models... (optional)
    use Illuminate\Events\Dispatcher;
    use Illuminate\Container\Container;
    $capsule->setEventDispatcher(new Dispatcher(new Container));
    
    // Make this Capsule instance available globally via static methods... (optional)
    $capsule->setAsGlobal();
    
    // Setup the Eloquent ORM... (optional; unless you've used setEventDispatcher())
    $capsule->bootEloquent();


    ну и естественно не забывать композер-то подключить сначала
    require 'vendor/autoload.php';
    Ответ написан
    4 комментария