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

    @rPman
    Финский Мачо все прекрасно расписал
    добавлю от себя, так как у тебя принимающая сторона php то можно создавать массивы через именованные параметры GET или POST multipart/form-data в формате name[] или name[key], например:
    curl -X POST http://example.org/test.php -d a[]=1 -d a[]=2
    на сервере создаст переменную
    $_POST['a'] = [1,2]
    или так
    curl -X POST example.org/test.php -d a[xxx]=1 -d a[zzz]=2
    $_POST['a'] = ["xxx"=>1,"zzz"=>2]
    Ответ написан
    Комментировать
  • Скачивания файлов (в браузере) с FTP сервера через VPS?

    @rPman
    ftp худший способ, работает медленно, веб сервером не поддерживается
    купил FTP сервер
    где же такой ужас нашел
    p.s. fuse mount будет глючить, проверено, любой косяк даже малейший с сетью до ftp и вся машина висит и ожидает таймаут.

    Ищи способ раздачи файлов по http, тогда nginx поддерживает проксирование, в т.ч. с авторизацией

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

    Я помню настраивал nbd сетевое блочное устройство (можно ограничить доступ по ip адресам через фаервол) это было самое быстрое решение (не нагружает ни сервер ни клиент, никаких лишних накладных расходов так как доступ монопольный), все можно красиво кешировать на принимающей стороне средствами ОС, недостаток - лучше при плохой связи не монтировать на запись (считай диск выдергиваешь во время записи) ну и конечно это блочное устройство с монопольным доступом, на принимающей стороне его нужно монтировать а для обслуживания (если нужна запись) отключать, т.е. останавливать работу.

    Полностью аналогичное nbd решение - это iscsi сервер (на linux рекомендую использовать istgt, очень простая и легкая реализация, другие кушают процессор), в этом случае его может подключить и windows машина.

    Так вот главный момент, подключив медленное блочное устройство в linux можно поверх него добавить кеширование на локальный диск меньшего размера, например с помощью универсального bcache (есть еще старый lvcache), так же файловая система zfs умеет штатно кеширующие устройства для кеша на чтение. В общем возможности очень гибкие.
    Ответ написан
    4 комментария
  • Грузить весь движок или по частям?

    @rPman
    Если у тебя на php написан веб сервис, он запускается и работает все время - то лучше все сразу загрузить, если же это php cgi и аналоги, когда на каждый запрос все заново загружается то лучше как советуют использовать autoload (особенно если обычно используется значительно меньшее количество классов чем есть)

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

    @rPman
    Со своим сервисом - сделать batch запросы, позволяющие одним запросом выполнять несколько операций, например запрашивать/модифицировать информацию сразу по нескольким объектам. Но еще лучше, реализовать требуемую логику изменения объектов прямо на сервере, грубый пример - нужно сдвинуть координаты объектов на величину [dx,dy,dz], вместо того чтобы все с сервиса выгружать, менять координаты и загружать обратно, нужно сделать команду, которая на вход получит этот вектор и все сделает на сервере (это самый быстрый вариант)

    С чужими сервисами, либо искать api для batch операций, либо переделать код на параллельные запросы, надеясь что этот сервис оптимизирован на такую работу (не факт, и даже если есть, количество параллельных запросов могут быть ограничены). Если ни то ни другое не доступно, размести свой сервис территориально максимально близко к чужому сервису (так как очень часто задержки сетевых запросов вносят очень большую задержку), само собой сначала удостовериться что причина именно в этом а не тормозах сервиса
    Ответ написан
    3 комментария
  • Линк на апи валидации паспортных данных?

    @rPman
    какой закон это требует?
    p.s. https://kontur.ru/market/spravka/25171-xochu_proda...
    Ответ написан
    Комментировать
  • Как обезопасить такой get запрос?

    @rPman
    Вопрос задан коряво, тебе наотвечали соответственно.
    Правильный вопрос (это я телепатствую) - как защитить файл file.txt от попадания в него не чисел?

    Ответ - поставить либо проверку на число is_numeric и если false то возвращать код ошибки 400 с помощью http_response_code, либо принудительно преобразовывать любую строку в число с помощью к примеру intval или doubleval, которые вернут 0 для всех не чисел.
    Ответ написан
  • Можно ли массивом сделать замены preg_replace?

    @rPman
    Да конечно, preg_replace принимает как первым аргументом так и вторым - массив, если оба будут массивами, то метод будет использовать строчку замены соответствующую строке условию.

    Еще есть preg_replace_callback и preg_replace_callback_array почитай документацию и примеры, еще более гибкие операции

    p.s. осторожно, utf8 этими функциями работает с оговорками (модификатор /u), есть методы mb_ereg_... но array там уже не поддерживается
    Ответ написан
  • Почему скрипт PHP PDO не хочет получать данные из базы?

    @rPman
    Есть ли в базе данные по условию?data = :data AND ref_id = 10215.
    В data хранятся данные в формате?date("d-m-Y");.
    По коду если запрос вернет пустой результат у тебя должна быть ошибка (варнинг в логах веб сервера или консоли где выполняется код), так как $depref1 не определен.
    и т.п.
    Ответ написан
    5 комментариев
  • Как лучше выстроить связи таблиц в бд на основе json файла?

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

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

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

    @rPman
    php для веб сервера и php для консольных команд - разные пакеты

    чтобы в командной строке запускать php test.php нужно установить пакет php-cli, да еще и настроить его персонально и включить модули в /etc/php/8.1/cli и modst-available (тут 8.1 версия, так как на сервере их может стоять несколько)

    путь до php интерпретатора определяется
    whereis php

    ну и на последок, настраивай не глобальный крон а пользовательский, залогинившись под ним по ssh и запустив crontab -e
    тогда скрипты будут запущены из окружения этого пользователя

    следи за правами доступа на запись своих логов
    Ответ написан
    Комментировать
  • Как внутри javascript'а запустить php код?

    @rPman
    На тот случай, если автор вопроса буквально хочет то что сказал а не то что логично подразумевают все тут ответившие, дам ответ:

    есть возможность запустить php и не только в браузере, с помощью крутой технологии wasm (это подмножество javascript, работающее за счет ряда ограничений значительно быстрее универсального js, в него компилируют почти любые программы и заставляют их работать в браузере)
    Ответ написан
    Комментировать
  • Как правильно делать паузы между запросами к api?

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

    Например сервис может сохранять не больше 7 последних запросов пользователя, если они по времени попадают на интервал последней секунды, и на каждый новый запрос считает их количество, отказывая в обработке если их станет больше.

    Или же сервис может определить момент начал отсчета интервала, например как T-модуль деления (T/интервал), т.е. каждый интервал учета количества запросов для всех клиентов начинается с одного и того же времени, и сохранять для каждого пользователя количество сделанных запросов, сбрасывая в ноль это число при переходе к следующему интервалу. Само собой если количество это больше лимита то отказывать в обработке. Этот алгоритм можно расширить, к примеру хранить количество запросов за прошлый интервал (или несколько) и текущий, складывая их при проверке на лимит, в этом случае настоящий лимит, который указывается пользователям в документации, больше во столько раз, сколько хранится истории запросов для каждого пользователя.
    (этот механизм проще для реализации на сервере, меньше требует памяти, и хотя не такой точный как первый, может использоваться)

    ...

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

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

    p.s. посмотри внимательно, возможно долбить сервис http rest запросами не самый лучший способ получения оперативной информации, вдруг сервис предлагает более удобные инструменты, например websocket или даже старый long pooling
    Ответ написан
    Комментировать
  • Отправка письма после успешной оплаты QIWI Api, как подтвердить оплату?

    @rPman
    вебхуки, еще немного про это
    ищи в своей библиотеки их поддержку

    qiwi будет слать http запрос на указанный адрес (т.е. он должен быть виден из интернета) если платеж завершился или был отменен

    p.s. это? кажется вебхуков тут нет
    делай этот запрос периодически
    billPayments->getBillInfo($billId);
    и смотри в ответе ->status->value
    Ответ написан
  • Как сделать множественную автозамену в буферизации вывода на PHP?

    @rPman
    str_replace поддерживает массивы в качестве аргумента что заменять и на что заменять
    $buffer = str_replace(
      ["{{ LINK.CONTACT }}","{{ LINK.USLUGI }}","{{ EMAIL }}"],
      [$_buf["CONTACT"],$_buf["SERVICE"],$_buf["EMAIL"]],
    $buffer);

    Так же, если заменяется всегда на элемент из $_buf то можно наружу вынести массив
    [
    "{{ LINK.CONTACT }}"=>"CONTACT",
    "{{ LINK.USLUGI }}"=>"SERVICE",
    "{{ EMAIL }}"=>"EMAIL",
    ]
    и заменять его с помощью preg_replace_callback

    p.s. и вообще зачем изобретать новый шаблонизатор, если php это и есть готовый язык шаблонов
    пиши свои шаблоны в формате php, где элементы вставляются с помощью <?=$_BUF["EMAIL"]; ?>, и тебе останется только include($template_name.".php"), подготовив перед этим содержимое $_BUF
    если тебе надо хранить шаблоны не в файлах, то пользуйся eval

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

    @rPman
    В чем совет то тебе дать?

    Почему не работает код? так скажи что в нем не так.

    Про получение данных, если тебе нужны ОПЕРАТИВНЫЕ данные, забудь про http rest, используй websocket, binance выдает в поток в 4 тысячи событий по всем парам, подписывайся на них и анализируй, это ты сможешь сделать в одном подключении. Если же все же http rest то внимательно прочитай про лимиты на запросы, они указываются в минуту и на практике еще меньше
    IP Limits

    Every request will contain X-MBX-USED-WEIGHT-(intervalNum)(intervalLetter) in the response headers which has the current used weight for the IP for all request rate limiters defined.
    Each route has a weight which determines for the number of requests each endpoint counts for. Heavier endpoints and endpoints that do operations on multiple symbols will have a heavier weight.
    When a 429 is received, it's your obligation as an API to back off and not spam the API.
    Repeatedly violating rate limits and/or failing to back off after receiving 429s will result in an automated IP ban (HTTP status 418).
    IP bans are tracked and scale in duration for repeat offenders, from 2 minutes to 3 days.
    The limits on the API are based on the IPs, not the API keys.

    p.s. Исторические данные по фьючерсам недоступны (только в пределах текущего квартала)
    я пользовался, минуток тут более чем достаточно:
    https://dapi.binance.com/dapi/v1/continuousKlines?pair={$pair}&contractType={$type}&limit=1500&interval=1m&startTime={$startTime}&endTime={$endTime}"

    Где startTime и endTime нужно устанавливать на основе предыдущих полученных и сохраненных данных
    https://dapi.binance.com/dapi/v1/exchangeInfo
    Даст всю информацию о рынке (без стакана), там же видно где какой тип контракта PERPETUAL/CURRENT_QUARTER/NEXT_QUARTER какое наименование инструмента, типа LTCUSD_230630 или ETHUSD_230331 (там же есть все данные по времени начала и окончания периода), PERP фьючерсы повторяют spot рынок, поэтому для удобства можно эти данные брать

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

    @rPman
    скорее всего php устанавливался вручную готовым пакетом, все .so идут в поставке по умолчанию
    настраивается в php.ini

    вот пример (пути могут другие быть)
    Ответ написан
    Комментировать