Задать вопрос
  • Как узнать width и height видеофайла при загрузке на сервер?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    На фронте использу эту библиотеку
    https://github.com/buzz/mediainfo.js

    Посмотреть в деле без заливки файла на сервер
    https://mediainfo.js.org/
    Ответ написан
    3 комментария
  • Как лучше хранить много изображений для веб-приложения?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Чтобы забыть о проблеме на долго конечно лучший выбор отдельное объектное хранилище. Не обязательно это должно быть облачное решение, можно организовать self-hosted S3-совместимое решение с использованием https://min.io/. Это позволит использовать любую готовую библиотеку s3-клиента для работы с файлами (upload/download/delete)

    Плюсы - при правильной настройке размер хранилища можно бесконечно расширять и масштабировать/реплицировать.

    Вопрос разграничения доступа можно решить тем что для доступа к файлу генерируется временная ссылка с ключем. Вариант хорош тем что раздачей файлов будет заниматься сервис хранения и не надо гонять данные между бэкендом и хранилищем. Бэкенд лишь при запросе файла проверяет права доступа и генерит секретную ссылку на скачивание.

    Другой вариант это проксировать все запросы на файлы через приложение: пользователь запросил файл -> бэкенд проверил права доступа -> бэкенд обратился к s3 хранилищу чтобы получить файл -> бэкенд передал файл пользвоателю. Это примерно как было у вас с хранением файлов в базе, пользователь не может напрямую скачать файл из базы, а это за него делает ваше бэкенд приложение.
    Ответ написан
    Комментировать
  • Как исправить пустые строки в БД при добавление кириллицы?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    1. Это никак не связано с htmlspecialchars
    2. Выкиньте функцию secureSuperGlobalPOST вообще, она не нужна

    Если конкретно искать проблему то она в функции secureSuperGlobalPOST, то что идёт после htmlspecialchars. Даже не беря во внимание что скорее всего вы работаете с utf-8 строками, то в функции удаляются из строки все символы не входящие в ascii 32-126
    Так вот кирилица не входит в ascii 32-126 , там только латиница.

    65aa7363c3b42684273148.gif

    И как подсказали товарищи выше, данные надо валидировать и сохранять в базу как есть, либо не сохранять если валидация не пройдена. htmlspecialchars или любое другое экранирование применять уже при выводе данных клиенту.
    Ответ написан
  • Получить часть ссылки до последнего слеша php?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    <?php
    $str = 'https://testy-dlya-medsester.ru/nmo/2892-nastavnichestvo-kak-metod-adaptatsii-molodykh-spetsialistov-v-sestrinskoj-deelnosti/Question-2892-3ecd193a222eb56c35ec4cb7895ee08a';
    
    $result = explode('/Question-', $str, 2)[0] ?? '';
    
    var_dump($result);


    https://3v4l.org/7PE7q#v8.3.1
    Ответ написан
  • Какие простые, "бытовые" задачи подходят для изучения машинного обучения?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Обнаружение разной степени "наготы" на фото.
    Люди целые платные сервисы на этом строят и продают за копеечку api, авто-модерация контента.
    Ответ написан
    Комментировать
  • Как не ожидать выполнения функции?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Так же есть Terminable Middleware

    Под капотом использется fatcgi_finish_request()
    С последним надо понимать что хоть ответ клиенту возвращается и сразу, но воркер веб-сервера продолжает висеть занятым и не сможет обсулживать другие запросы пока не закончит работу.
    Ответ написан
    Комментировать
  • Laravel инъекция зависимостей, как происходит в бизнес логике?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Комментировать
  • Почему Laravel Schedule при задании интервала менее минуты скрипт пропускает минуту?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Можно самому реализовать то же самое, добавив бесконечный цикл внутрь обработчика
    $schedule->job(new SyncChangesFrom1C)
        ->everyMinute()
        ->withoutOverlapping()
        ->runInBackground();


    В обработчике внутри handle()
    while(true) {
    
        //делаем работу
    
        sleep(10);
    }
    
    return 0;


    p.s. В целях утечек памяти скрипт всё-же лучше переодически перезапускать. Хотя бы пару раз в день или через N-повторений.
    Так же учтите что withoutOverlapping() по умолчанию ставит лок на 24 часа (на 1440 минут) и если скрипт крутится больше этого времени то будет запущен второй экземпляр.
    Ответ написан
  • Интеграция готового редактора статей для php?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    интеграция согласно инструкциям
    в общем случае вам на бэкенд приходит html который сохраняем и выводим в будущем

    достойные редакторы
    результат в html
    https://imperavi.com/article/
    https://yabwe.github.io/medium-editor/

    результат в json с блоками
    https://editorjs.io/
    Ответ написан
    Комментировать
  • Как сделать JWT авторизацию на LARAVEL (access + refresh)?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    access и refresh токены это не про jwt-авторизацию, так как jwt это в первую очередь про сквозную авторизацию между несколькими stateless-сервисами, где вы можете в токене сразу закодировать информацию о пользователе и доп данные, и проверять легитимность токена используя открытый или приватный ключ, без обращений в БД или к промежуточному сервису авторизации.
    Если вам нужна token-based авторизация на сайте, то используйте Laravel Passport который из коробки предоставляет все нужные механизмы https://laravel.com/docs/10.x/passport#issuing-acc...
    Ответ написан
    Комментировать
  • Как получить название трека из потокового аудио онлайн радио?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Можно поэксперементировать с этим решением
    https://gist.github.com/fracasula/5781710

    но конкретно в ссылке на поток из вопроса метаданные с Title - пустые, то есть они не размечают треки
    Ответ написан
    3 комментария
  • Как убрать белые "бортики" в PDF файле?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    попробуйте в стили добавить
    <style>
    @page { margin: 0; }
    </style>


    в любом случае это решается доработкой исходного html и его стилей
    можно поиграться с padding/margin/border и стилями чтобы получить приемлемый результат
    Ответ написан
    1 комментарий
  • Как посчитать среднее значение в базе данных?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    $books = Book::query()
                ->where('active', true)
                ->withAvg(
                      ['reviews' => fn ($query) => $query->where('active', true)],
                      'grade'
                )
                ->get();
    Ответ написан
    Комментировать
  • Как сделать частичный SSR для vue совместно с php шаблонизатором?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    На PHP генерируете статичные HTML-файлы из twig-шаблонов через ->render()
    Скармливаете эти html-файлы в SSR приложение при сборке
    Ответ написан
  • Как сдеать фильтр email на php?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Так же gmail и некоторые сервисы позволяют использовать адреса вида user+любое.слово@gmail.com и письмо дойдет до user@gmail.com

    1. Делаете в БД новую колонку, называете её email_normalized
    2. Нормализуете каждый email и вписываете в базу помимо оригинального email'а ещё и нормализованный вариант
    3. При регистрации сверяете нормализованный email который ввёл пользователь с тем что есть в базе в колонке email_normalized

    Для нормализации можно например использовать такую функцию

    <?php
    
    $emails = [
        'test@mail.com', 'te.st@mail.com', 'test+test@mail.com'
    ];
    
    foreach($emails as $email) {
        echo $email.' -> '.normalize_email($email)."\n";
    }
    
    //test@mail.com -> test@mail.com
    //te.st@mail.com -> test@mail.com
    //test+test@mail.com -> test@mail.com
    
    function normalize_email(string $email): string
    {
        $email = mb_strtolower($email);
        $email_parts = explode('@', $email, 2);
        
        //для случаев email+чтоугодно@mail.com
        if(str_contains($email_parts[0], '+')) {
            $ex = explode('+', $email_parts[0]);
            $email_parts[0] = end($ex);
        }
        
        $email_parts[0] = preg_replace('![^a-zA-Z0-9а-яА-ЯёË]+!u', '', $email_parts[0]);
    
        return $email_parts[0].'@'.$email_parts[1];
    }
    Ответ написан
    6 комментариев
  • Как сделать пагинацию в моделе laravel?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    https://github.com/staudenmeir/eloquent-eager-limit
    позволяет установить offset() и limit() для загружаемых реляций
    Ответ написан
    Комментировать
  • Почему file_put_contents увеличивает число на единицу?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Если хотите продиагностировать проблему, то можно добавить логирование вызова кода
    Создайте файл /conf/backtrace.txt
    file_put_contents(APP_PATH . '/conf/uniq_id.txt', $numb);
    
    //логируем стек вызовов
            ob_start();
            debug_print_backtrace();
            $trace = ob_get_contents();
            ob_end_clean();
    
    file_put_contents(APP_PATH . '/conf/backtrace.txt', $trace, FILE_APPEND);


    Но чудес не бывает. Если каждый раз получаете +2 то это может быть только потому что по какой-то причине код исполняется дважды.
    Ответ написан
    Комментировать
  • Laravel очередь, как добавить очередь выполнения?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Используйте методы increment и decrement для изменеия баланса
    https://laravel.com/docs/10.x/queries#increment-an...

    public function updateBalance($bet_amount): void
      {
        $this->decrement('balance', $bet_amount);
      }


    под капотом соотв-но получите запрос вида
    UPDATE `users` SET `balance` = `balance` - $bet_amount WHERE id = ...


    p.s. Ваша проблема не в том что Laravel обрабатывает запросы одновременно, а в том что при одновременных запросах сперва делается SELECT текущего баланса, потом вы вычисляете новый баланс на PHP и делаете просто перезапись значения баланса из-за чего естественно теряется одно из изменений.

    p.p.s. Транзакции в БД хорошо, но дополнительно можно использовать lockForUpdate() чтобы исключить любые конфликты на уровне БД и тогда redis-локи в принципе можно убрать.
    Ответ написан
    Комментировать
  • Правильная настройка путей api в nginx, как правильно?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Современный и как мне кажется правильный вариант - использовать роутинг и единую точку входа в приложение.
    Это когда в публичной части лежит один единственный /index.php который запускает приложение и разруливает все запросы и позволяет вам реализовать любое ЧПУ.
    На nginx такое делается как правило через дериктиву try_files

    location / {
    		try_files $uri $uri/ /index.php?$query_string;
    	}


    Это позволяет любой не существующий путь завернуть на /index.php где оригинальный запрос будет доступен в $_SERVER['REQUEST_URI']

    Существущие роутеры по сути просто предоставляют удобную возможность распарсить эти данные и передать данные дальнейшему обработчику (handler/controller/action)
    https://github.com/ziadoz/awesome-php#routers
    Ответ написан
    2 комментария
  • Где лучше дополнительно хранить текущие данные в wordpress?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Адрес авторизованного пользователя лучше хранить в базе. Нагрузка не большая, так как эта информация будет приходить вместе с данными текущего авторизованного пользователя.
    Адрес анонимного можно хранить в cookies / local storage
    Ответ написан
    5 комментариев