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

    @rPman
    {$txt}
    текст в ссылках должен быть пропущен через urlencode, а еще у тебя там минус в идентификаторе

    так же настоятельно рекомендую, прежде чем делать приложение, протестировать ссылки вручную через curl, будет видно и ответ, а с ключом -v подробности и заголовки ответа.

    fopen не самый лучший способ коммуникации по сети, проще было бы file_get_contents использовать, и у него есть context, который позволяет много что настроить в запросе) но лучше пользоваться встроенный curl_xxx
    Ответ написан
    2 комментария
  • Создание классов в цикле?

    @rPman
    humoured исчерпывающе ответил на это вопрос.
    Автор, тебе лучше сформулировать свою задачу а не пытаться искать способ реализации предполагаемого тобой (возможно неверное) решение.

    Если есть задача динамического формирования кода (например нужно 100500 классов, отличающихся незначительно но if-ы по коду заметно замедляют его работу и усложняют чтение), особенно крупного, настоятельно рекомендую генерировать файлы и делать их include (имя файла можешь делать по хешу содержимого, если вариантов содержимого много, или по именам атрибутов, определяющих изменения). Так как include отлаживать удобнее, сообщения об ошибках будут понятны и легко проверяемые, а так же сервер такие файлы кеширует и при наличии ускорителей - еще и оптимизирует, eval же компилируется каждый раз при вызове.
    Ответ написан
    4 комментария
  • Как работать с большими данными в MySQL или как создать удобную структуры базы данных?

    @rPman
    Да.
    Есть момент, твой объём данных ничтожно мал.

    У хранения данных в базе данных есть два основных подхода - хранить ключ-атрибут-значение, где на атрибут будет отводиться одна строка таблицы, называется eav, и хранение данных в полях, где на один объект отводится одна запись в таблице атрибуты хранятся в колонках.

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

    Второй подход всем хорош и рекомендуется, мало того можно разрабатывать интерфейс приложения с оглядкой на первый способ с возможностью добавления новых атрибутов не как новые записи в базе а как вызов ddl sql модификации таблицу, т.е. добавлять колонки на лету, таким образом получить достоинства eav и скорость аналитики. Недостаток подхода, в общем случае удаление и изменение колонок медленное в базах данных, так как пересоздаётся вся таблица, Но это проблема будет заметна когда объектов сотни тысяч.

    То есть я рекомендую хранить объекты в строках а атрибуты в колонках, даже если их сотни. Старайся отделять разные объекты по разным таблицам.
    Ответ написан
    2 комментария