Задать вопрос
Ответы пользователя по тегу PHP
  • Как обезопасить такой 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

    вот пример (пути могут другие быть)
    Ответ написан
    Комментировать
  • Потери CPU на php при миграции на docker?

    @rPman
    у системы 'виртуализации' (точнее песочницы), используемой docker, работа с диском потребляет заметно большее количество процессора, в среднем десятки процентов, в худшем - 2х ухудшение производительности

    причина в файловой системе, которая реализует технологию снапшотов

    посмотри, какой storage driver у тебя используется, вроде бы lcsf самый быстрый

    На работу сети у докер так же есть понижение производительности (я читал про простые тесты iperf в режиме bridge, до 20% потери)

    p.s. если у тебя windows, немедленно меняй ОС, под ней docker работает только ради совместимости, производительность очень низкая
    Ответ написан
    Комментировать
  • Как игнорировать или пропускать варнинги при вставке значений из одного массива в другой?

    @rPman
    если тебе не надо это контролировать, то игнорировать
    @$data->{'id'}

    p.s. вторым параметром json_decode пропиши true, тогда результатом будет не object а array в нужном тебе виде, да и работать можно будет с ним $data['id']
    Ответ написан
    9 комментариев
  • Как загружать файлы на гугл диск с сайта php?

    @rPman
    согласно этому, есть проперти parents[] а так же методы addParents чтобы добавить каталог, где будет виден файл (тут каталоги как теги, один и тот же файл может быть размещен в разных местах)

    вот примеры, попробуй в files->create добавить этот параметр
    Ответ написан
  • Как увеличить количество соединений к socket server?

    @rPman
    судя по этому issue у народа до 1000 на один процесс все работало ну и он закрыт значит должно быть больше.

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

    @rPman
    Браузеры защищают сайты с разными доменами у фрейма и основного, от подобной деятельности. Ни доступа к странице, ни к содержимому нет.

    Есть уязвимость сайтов к click jacking, когда фрейм делают прозрачным, подвигают под текущую позицию курсора мыши и как то заставляют пользователя кликнуть. Таким образом можно выполнять действия но понять, успешно или нет не получится.

    Если твоя задача не состоит в краже пользовательской авторизации, то достаточно через проксирование сайта на своем домене открыть его как свою страницу и уже к ней будет полный доступ, можно получить document страницы, делать поисковые запросы querySelector и делать клики через .click()
    Ответ написан
  • TON Coin API на php?

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

    p.s. официально от разработчиков есть javascript и python библиотеки
    Ответ написан
    Комментировать
  • Архитектура сервиса обработки задач [PHP]?

    @rPman
    асинхронности в PHP нет
    Если основная причина того что обработчик событий не успевает - в том что он долго:
    * отправляет сетевой запрос (отправка sms или почта)
    * просто таймеры, например запросы сетевые отправлять нужно с интервалами
    * работа с файлами (асинхронно будет быстрее)
    то на это вполне существуют асинхронные фреймворки, например очень мощный ReactPHP, у него очень хорошая база, большое коммунти и мне кажется на любой чих найдется библиотека.

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

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

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

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

    Задача фонового процесса отметиться в базе данных, правкой состояния
    - Ожидает исполнения -> Запущено и ожидает окончания
    - Запущено и ожидает окончания -> Окончено ...

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

    В итоге, любая задача будет запущена в виде процесса ОС, в linux это делается с помощью bash ... & а в windows - например start /min. Сам процесс обработки очередей будет занят сном, чтением списка процессов и проверкой pid уже запущенных, на это не требуется никаких особых ресурсов (при необходимости очередью может рулить этот процесс, буквально вместо базы данных слушать сокеты и принимать заявки на исполнение, в phpreact для этого все готово, даже слабые машины могут легко тянуть десятки тысяч запросов, я эксприментировал с websocket)

    p.s. самый тупой демон параллелизации запуска процессов - это командная утилита linux parallel, ей можно отдавать список команд через linux pipe, построчно, он будет ждать новую команду если всю работу выполнил и тормозить основной процесс, если буфер пайпа переполнен (он настраивается). Само собой следить за тем как все исполняется придется самому.
    Ответ написан
    Комментировать
  • Распаковка массива, когда ее нет?

    @rPman
    array_map('xo', $str);
    array_map вызывает функцию xo для каждого элемента массива $str

    сама функция xo рекурсивно вызывает себя же для элементов, являющихся массивом, и выводит этот элемент если это не так (вывод в том месте что указан в вопросе, т.е. на этом этапе уже нет массива и выводится конечный элемент)

    благодаря этому происходит 'распаковка'
    Ответ написан
    Комментировать
  • Как через PHP определить, подойдет ли длина строки для названия файла?

    @rPman
    Считать нужно количество байт в имени а не символов.

    Так же лимиты файловой и операционной системы очень разные, у windows одни у linux другие, плюс выбор файловой системы влияет на результат, плюс итоговый путь (т.е. в каком каталоге смонтировано хранилище).

    Настоятельно рекомендую уйти от такой практики именования файлов пользовательскими не контролируемыми данными, помимо простых "../", позволяющих выйти за границы хранилища (а это уже опасно), пользователи могут создать файлы со служебными именами, удалить которые уже будет не так просто, и такие имена (типа null или con в windows) могут помешать обслуживанию архива.

    Строки с именами нужно хранить в базе а файлы именовать чем то более нейтральным - например хеш в hex записи или числовой идентификатор
    Ответ написан
    Комментировать