Ответы пользователя по тегу PHP
  • MySQL + PHP :: Хранение паролей клиентов в базе данных с целью их извлечения, как защить?

    @rPman
    Забудем что принципиально хранить пароли - плохая практика, но так как задача уже такова что хранение вынужденное то:
    1. шифровать логины и пароли (весь набор данных, не имеющих смысл друг без друга, лучше хранить сериализованными в одном поле, особенно когда от задачи к задачи поля меняются, т.е. логин пароль почта api key, gpg ключи шифрования и т.п. пусть это будет свободная json строчка, за ее анализ отвечает клиентская часть приложения)
    2. ключом/паролем, который не хранится в базе данных (он должен являться частью бакэнда, т.е. в том месте где на бакэнде хранятся настройки подключения к внутренним сервисам либо отдельное место хранения) - при разделении работ между людьми (обслуживать базы могут другие люди, чем те кто имеет доступ к бакэнду) чувствительные данные не утекут легко.
    3. логируй все, т.е. показал пароль - сохрани в специальном логе (в базе или файлах уже вопрос организации работ) - кто, когда, с какой машины, что получил
    4. когда показываешь пароль на клиентской машине, повторно запрашивай авторизацию (чтобы не использовалась автосохраненная), важный момент, это исключит кражу данных уже на стороне клиента, очень мало кто правильно организует рабочее место (это просто неудобно и дорого).
    Ответ написан
    2 комментария
  • Как правильно реализовать авторизацию пользователя БД через сайт?

    @rPman
    Безопасность чего?

    Если каждый раз авторизовать каждого пользователя через его логин/пароль в oci_connect то это будет медленно, есть метод oci_pconnect, он кеширует данные подключения и для следующего вызова, т.е. не получится в разных вызовах скриптов использовать разные авторизации, в документации я этого не нашел, там вообще для изолированных подключений нужно использовать oci_new_connect().

    В веб такой (пользователи веб приложения это пользователи oracle) практикой не пользуются (наверное именно из-за вопросов производительности, хотя я это все трогал так давно, еще во времена 7 и 8 версии, теперь есть и пул подключений и возможно еще какие то фичи)
    Да, обычно пользователи веб приложения это просто идентификаторы в соответствующей таблице в базе данных приложения, а логин/пароль базы данных oracle - это логин приложения, единый на вес бакэнд (если есть отдельно бакэнд для веб и отдельно десктопное приложение, то тут можно разные логины использовать, но повторяю плохая).

    p.s. oracle дорос до скоростей mysql/postgres веб? особенно если речь об мелких объемах
    Ответ написан
    3 комментария
  • Как в php заблокировать файл от других обращений?

    @rPman
    POST это http?
    Тебе нужен свой http сервер, реализующий нужную логику. Инструментов миллион, попробуй swoole
    .
    Если его реализовать без многопоточности и асинхоронщины, то пока он будет обрабатывать один запрос, никакой другой не будет получен, другие будут ждать в очереди сетевого стека и отваливаться с ошибкой по таймауту.

    Интересно что встроенный отладочный http сервер php -S xxx:port какраз однопоточный, и хотя его не рекомендуют для продакшн, можешь попробовать.
    Ответ написан
    4 комментария
  • Возможны ли коллизии при использовании rename?

    @rPman
    Системный rename атомарный, т.е. два одновременно работающих приложения отработают так что одно вернет true а другое false. Осторожно с сетевыми файловыми системами, к примеру nfs не гарантирует.

    Но вот записи в файл - нет, совершенно нормально получить кашу, если писать в файл к примеру логи (строчки) одновременно из двух потоков/процессов. И fflush тут не спасет, понадобится синхронизация либо через блокировки файлов (не рекомендую) либо через семафоры/мьютексы или другие IPC механизмы. Есть мнение что запись кластера файловой системы - атомарна (если твои writes выровнены по нему и размером с него), но как я понимаю гарантий этого никто не дает.

    p.s. если у тебя многопоточный доступ к данным, настоятельно рекомендую не извращаться а взять готовую базу данных, даже если объемные блобы будут продолжаться храниться в файлах на диске (имя в базе) а за блокировки отвечает база данных или иной механизм, проблем будет на порядок меньше.
    Ответ написан
    9 комментариев
  • Как работает открытие сокета на сервере?

    @rPman
    Во первых веб браузеры не умеют работать с обычным универсальным tcp/udp советами, им нужен определенный протокол, т.е. приложение, которое слушает сокет (socket_listen) должно работать по совместимому протоколу (сейчас это http, его расширение websocket, а для udp - webrtc).

    Когда браузер подключается к сокету, слушала приложение получает событие и сокет клиента - соединение от браузера и дальше уже работает с ним (обычно такие приложения делают асинхронными, чтобы можно было одновременно обрабатывать несколько подключений, иначе клиента будет ждать, когда он освободится, или вылетают по таймауту)

    Про 'ваш сервер', я встречал виртуальный хостинг, обычно точно дешёвые так делают, когда сервер сидит в локальной сети, а порты по тарифу подбрасываются nat, т.е. Только разрешенные порты так работают
    Ответ написан
    Комментировать
  • Как из функции вытащить переменную?

    @rPman
    сделай $UserId global или передай в объект/массив (они по ссылке передаются), прописанный в use.

    учти что вызывается эта функция позже, когда приходит message, а значит и userid твой будет установлен позже
    Ответ написан
  • Как оптимально сделать выборку из БД?

    @rPman
    если нужно по каждой категории - добавь к запросу group by категория, в select будет sum(сумма) и категория

    если выбор критерия вычисляемый, пропиши его формулу в select сумма as field_name ... group by field_name
    Ответ написан
    Комментировать
  • Как сократить количество допустимых запросов от поисковых роботов?

    @rPman
    Поисковые боты не 'ходят с сайтов', у них не должно стоять заголовка referer.

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

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

    @rPman
    Похожесть - перебором.

    У меня в поиске заголовков статей (40к) postgres подсчет левенштейн со всеми записями был меньше секунды, а ведь он фактически перебор делает. Но задача на самом деле сложнее.

    Посмотри хорошую статья с обзором алгоритмов, статья старая но взяв из нее алгоритмы будет что гуглить дальше

    p.s. рандомная ссылка из гугла, в работе есть код на питоне
    Ответ написан
    Комментировать
  • Как работает PHP, Браузер - PHP?

    @rPman
    За многозадачность отвечает тот кто собственно запускает php, например веб сервер, в его настройках указывается, сколько потоков должно быть запущено одновременно, при превышении это количества клиенты ждут.

    Если веб сервером работает само php приложение, то все зависит от ее реализации, обычно все используют однопоточный подход с асинхронными методами и очередью (например reactphp), т.е. если все методы в таком приложении будут асинхронные (по сути они не исполняют задачу а запускают процесс параллельно и как то указывается способ реакции на логику и подписание результата, например коллбеки), но как только в таком приложении запускается не асинхронный метод, весь процесс притормаживается, даже бывает другие асинхронные задачи, и получается что все другие запросы встают в очередь.

    Так что от тебя зависит
    Ответ написан
    Комментировать
  • Как лучше организовать запрос к БД на основе данных?

    @rPman
    Да это хорошая практика с точки зрения юзабилити, когда выбрав один из параметров система фильтрует варианты выбора в дальнейшем на основании уже сделанного выбора

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

    @rPman
    Делай проверки по успешному выполнению каждого вызываемого метода, в отладку или логи выводи что там в $res лежит, что передашь в параметрах запроса, вдруг там пробелы, каким-нибудь print_r или var_dump или json_encode.

    Настрой отладчик, сэкономили много времени
    Ответ написан
    1 комментарий
  • Как разобраться в api php Binance?

    @rPman
    Installation

    composer require binance/binance-connector-php

    composer есть в поставке любой linux либо скачай с офф сайта последний (тогда запускать composer.phar, он написан на php)

    p.s. есть библиотека ccxt ставится так же через composer, поддерживает кучу бирж (наверное все имеющие смысл) для бинанса там помню максимум проблема будет с coin-m futures и то это было несколько лет назад, когда они только только появились

    хорошая документация, и главное унификация, написал код для одной биржи, с минимумом телодвижений переносишь на другую
    Ответ написан
    Комментировать
  • Как вывести PHP ошибки в свой лог файл?

    @rPman
    прописать это в php.ini или так:
    ini_set("log_errors", 'on'); // 'on' а не true как многие пишут
    ini_set('error_log', 'errors.log');


    еще можно свой обработчик ошибок задать
    https://www.php.net/manual/en/function.set-error-h...
    https://www.php.net/manual/en/function.set-excepti...
    Ответ написан
    2 комментария
  • Обновлять базу данными, затирая первые старые данные?

    @rPman
    Это худшая задача для реляционных баз данных, что там будет происходить с foreign_key я вообще молчу, все решаемо но скорости будут не очень

    Если нет связанных таблиц (что логично, твой id на самом деле не идентификатор, не вводи народ в заблуждение и назови по другому) в твоем случае скорее всего можно схитрить, можно key_id считать на лету, т.е. ключевое поле с autoincrement, но назови его по другому, например key_id_orig
    1+key_id_orig-min(key_id_orig)

    но это сработает только если удаление возможно только самой старой записи, если же будут удаления из середины, то порядок придется пересчитывать по другому, через сортировку всей таблицы по key_id_orig и подсчету колонок функцией row_number
    Ответ написан
    5 комментариев
  • Как получить информацию, отправленную с помощью метода GET/POST в PHP?

    @rPman
    Работа с http запросами рекомендуется с помощью curl_xxx смотри там куча примеров, мало того для GET запросов вообще ничего не надо и простой file_get_contents('http://xxxx вернет ответ

    Работа со строками, если ты определяешь, что вернется в ответ на запрос, то делай это не в таком виде как ты предложил а используй какую-нибудь стандартную сериализацию, настоятельно рекомендую json, для ее работы в php есть методы json_encode/json_decode

    Тогда строки будут легко превращаться в объекты/массивы и с ними будет легко работать
    Ответ написан
  • Почему сравнение всегда ложно?

    @rPman
    удостоверься что $trainings[1] действительно содержит побайтово "pump", причем очень часто символы могут совпадать визуально но не значением, например русская 'Р' и английская 'P'.

    выведи обе сравниваемые строки с помощью bin2hex
    Ответ написан
  • Как правильно писать код, чтобы не было PHP Notice: Undefined index?

    @rPman
    если ты точно знаешь что отсутствие переменной это нормальная ситуация, то можно отключить проверку ее наличия с помощью @, тогда будет подставлено значение NULL в случае ошибки для строк, и 0 для чисел
    @$com_offer['offer_count'] += @$_item['quantity'];
    В данном случае если у тебя оба ключа будут отсутствовать то будет создан 'offer_count' с 0 значением

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

    @rPman
    когда запросы блочатся, когда есть проверка браузера. Задавая вопрос,
    но ты не задала вопрос про свою проблему

    покажи свой код, покажи свои попытки, где именно затык, вот тогда тебе дадут советы

    p.s. лучше всего парсить с помощью браузера, гуглить к примеру selenium
    Ответ написан
    Комментировать