Ответы пользователя по тегу PHP
  • Получить часть ссылки до последнего слеша 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 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/
    Ответ написан
    Комментировать
  • Как получить название трека из потокового аудио онлайн радио?

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

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

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


    в любом случае это решается доработкой исходного html и его стилей
    можно поиграться с padding/margin/border и стилями чтобы получить приемлемый результат
    Ответ написан
    1 комментарий
  • Как сделать частичный 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 комментариев
  • Почему 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 комментария
  • Можно ли как-то в switch запихнуть две переменных?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Более короткий вариант с использованием match() вместо switch()

    $i = 1; $k = 2;
    
    $result = match(true) {
        ($i == 0 && $k == 1) => "i equals 0, k = 1",
        ($i == 1 && $k == 2) => "i equals 1, k = 2",
        default              => "",
    };
    
    echo $result;
    Ответ написан
    Комментировать
  • Максимальное число на PHP?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    1. берем все файлы и удаляем из имени всё кроме цифр
    2. находим максимальное значение в массиве через max()
    $files = glob('my-files/*.txt');
    
    $max = max(
        array_map(
            fn($val) => preg_replace('![\D]+!', '', basename($val)), 
            $files
        )
    );
    
    var_dump($max);
    Ответ написан
    4 комментария
  • Как пройти капчу за место сервера и отправить ответ через сервер?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Воспользоваться сервисами для решения капчи. На выходе получите активные сессионные cookie с пройденной капчей.
    https://anti-captcha.com/apidoc/task-types/Turnsti...
    https://2captcha.com/p/cloudflare-turnstile
    Ответ написан
    Комментировать
  • Через что отправлять запросы с сервера для печати этикетки?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Если принтер подключен к устройству и установлены драйвера то печатать можно использую системные вызовы
    Через exec() или system() например запуская нужные консольные команды

    https://tldp.org/HOWTO/Printing-Usage-HOWTO-2.htm

    https://learn.microsoft.com/en-us/windows-server/a...

    То есть буквально делаете то же самое что любая программа в которой можно напечатать документы. Находите принтер, добавляете ему в очередь документ на печать.
    Ответ написан
    Комментировать
  • Как в PHP Отдавать Заголовки (Header) после Curl?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    <?php
    foreach($head as $header_val) {
        header($header_val);
    }
    Ответ написан
  • Как настроить правильно аутентификацию по почте или номеру телефона?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Можно использовать метод prepareForValidation()
    https://laravel.com/docs/10.x/validation#preparing...
    для того чтобы подготовить данные. В случае с номером телефона удалить из строки всё кроме цифр. Email перед нами или номер телефона можно определять по наличию "@" в запросе.
    Частные случае типа 8-xxx- считать как 7-ххх- тоже можете там разместить и заменять первую 8 на 7
    Ответ написан
    Комментировать
  • Как правильно отправить POST запрос с CSRF токеном для Laravel?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    csrf-token из html не используется
    смотрите cookies которые присылает сервер при GET-запросе к https://promokod.pikabu.ru/shops/5ka
    в заголовках приходит Set-Cookie: XSRF-TOKEN=
    curl -L -I "https://promokod.pikabu.ru/shops/5ka"
    HTTP/1.1 200 OK
    Server: nginx
    Content-Type: text/html; charset=UTF-8
    Connection: keep-alive
    Vary: Accept-Encoding
    Cache-Control: no-cache, private
    Date: Fri, 06 Oct 2023 12:56:29 GMT
    X-RateLimit-Limit: 60
    X-RateLimit-Remaining: 58
    Set-Cookie: XSRF-TOKEN=eyJpdiI6ImZuTllpTWRIb2ZDalF5.......TkyOWY3In0%3D; expires=Fri, 13-Oct-2023 12:56:29 GMT; Max-Age=604800; path=/


    Это значение и надо использовать для дальнейшего POST-запроса
    Ответ написан
    4 комментария
  • Как правильно получить данные с открытого API Едадил?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Это не открытое api, а внутренее (aka приватное).
    Технически использование его сродни парсингу сайта, с чем владельцы сайта как правило борятся.
    Соотв-но ваше "когда-как" может быть просто следствие работы антиспам системы.

    В остальном все советы и принципы такие же как при написании любого парсера
    1. Правильно повторяем все запросы к сайту, не теряя по пути загловки, куки, поля с данными, параметры запросов
    2. Ставим разумную задержку между запросами sleep/usleep
    3. Используем прокси при необходимости
    Ответ написан
    1 комментарий