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

    @rPman
    Настоятельно рекомендую уйти от json сериализации (тем более такой в виде массива) и создать табличку, где строки - пользователи (точнее объекты-правообладатели) а колонки - выдаваемые права.

    Дополнять такую табличку просто, создавая колонки можно указать дефолтное значение (типа нет прав) и все обновится автоматически.

    В будущем же это неплохо модифицируется до многоуровневой системы Пользователь, их Группы, Объекты и Роли (как набор прав за ними стоящими) через вьюхи и триггеры. Но лучше сесть подумать и сделать сразу как надо, такие вещи менять потом больно.
    Ответ написан
  • Какую область программирования выбрать PHP или Java?

    @rPman
    в данном случае язык определит направление дечятельности

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

    java - если смотреть на рынок, это в первую очередь мобильный гейминг android,.. не потому что язык такой, просто так звезды сложились.
    Если спросить меня, какой язык выбирать для создания крупного проекта с долгой поддержкой для бизнеса, java я бы выбрал ну очень в последний момент. Очень многословный язык, да код получается красивым, меньше мест где можно выстрелить себе в ногу и т.п... Из бонусов - кроссплатформенность (как железа так и ОС), уже не такая уж и уникальная опция.

    то о чем в вопросе не было спрошено:

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

    javascript - занял очень интересную позицию в мире, благодаря nodejs он может быть как web бакендом, так и способом разработки браузерного интерфейса на стороне клиента, так и десктопные приложения (electron, чтоб его...) и даже как язык для unity игрового движка, т.е. получается язык получает статистический прирост с нескольких областей а не одной как остальные.
    У языка есть недостаток - как и у php (но он старается избавиться от этого) - свободная типизация, странная реализация ООП и другой синтаксический сахар типа асинхронности (это кстати его плюсы) увеличивают шансы выстрелить себе в ногу и усложняют поддержку проекта на долгосрок (там вообще много где проблем найти, как пример, берешь любой проект с гитхаба с датой последнего комита 3-4 года и пробуешь его обновить и поддержать, советую посмотреть что аудит безопасности npm будет вам писать).

    c# - надо ставить рядом с java (он и .net и создавался майкрософтом как главный конкурент), так же благодаря unity движку, захватывает часть статистики из геймдева. К сожалению, выбор языка гвоздями (да есть способы освободиться, но за все приходится платить и чего то лишаться) прибивает разрабатываемый продукт к майкрософтовской экосистеме, за который бизнесу приходится платить неплохой 'налог', поэтому если у тебя не unity то скорее всего ты либо поддерживаешь какое то легаси либо... ну мне нравится на .net формочки к базе данных делать, нигде такого легкого инструмента который дает ms visual studio и .net - нету, но, если прямо так хочется, там можно и на python.net писать, и на c++.net, и вообще какая разница какой язык программирования, в мире разработчика главенствуют фреймворки и среды разработки.
    Это я к чему - найти деньги с этими знаниями можно только по везению.

    Все остальные языки типа R, Rust, go и прочая экзотика - это издевательства над работодателями.. т.е. если ты найдешь по ним работу, это значит работодатель стал заложником не шибко умного системного аналитика (или его отсутствие/совмещение с разработчиком, который для самообразования решил приколоться), т.е. еще большее везение, делать ставку на это я бы не стал. Хотя для самообразования учить Rust или go очень даже неплохо, много открытых проектов пилят именно на go, вполне возможно, когда в мире количество разработчиков наберется до некоторой критической массы, это станет таким же мейнстримом как сейчас php или javascript.

    Так что еще раз - выбор языков программирования в порядке убывания оценки рекомендации (выше-вероятнее найти работу, кстати оценить уровень оплаты тут сложнее)
    php - и он теряет позиции, потому что SPA приложения захватывают мир
    javascript
    python
    - если не нужен вебдев - то это на первом месте
    java/c# (точнее .net)
    go

    если хочешь быть в вебе то php/javascript
    если хочешь в геймдев java/c#
    если хочешь датасайнс то python
    Ответ написан
  • Терминал для сайта бинарных опционов?

    @rPman
    Из открытых проектов я знаю только https://github.com/StockSharp/StockSharp
    терминал открыт, бизнес модель разработчика - продажа и поддержка коннекторов

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

    p.s. а так гуглится приличное количество торговых терминалов на опенсорс,

    но что то мне говорит разбираться будет дольше чем запилить что то готовое, тебе же не нужно что то многофункциональное, достаточно графика и пары кнопок?

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

    @rPman
    Чтобы на вкладке response в devtools было json-представление, но чтобы на самой странице клиента(фронтенд) не было никакого json-а
    так не получится, браузеры не умеют json автоматически преобразовывать к пользовательскому виду.

    p.s. Если бы вместо json тебе подошел бы xml (тоже инструмент передачи структурированных данных) то можно было бы воспользоваться шаблоном xslt (их поддерживают все браузеры, стандарт старый), пример (кстати в доке ошибка, правильно - в браузере открывают xml файл, который преобразуется с помощью xslt в нормальный html, но в консоли будет только xml)

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

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

    Пример ссылки:
    data:text/html;charset=utf-8;base64,PHNjcmlwdD5hbGVydCgnaGknKTs8L3NjcmlwdD4=
    как видишь хабр такие ссылки режет, так как иначе это огромная дыра в безопасности (украсть куки можно)
    Ответ написан
    4 комментария
  • Обязательно ли возвращать объект в методе, если в PHP его изменение идет по ссылке?

    @rPman
    Нет никаких требований ООП или ограничений на то, как возвращать, надо ли возвращать, сколько возвращать и прочее.

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

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

    curl мощнейшая утилита, как и браузерная консоль разработчика (которая открывается по F11), на закладке Network можно выбрать любое подключение, нажать правую кнопку и выбрать копировать, там можно получить готовую команду curl, полностью повторяющую этот запрос

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

    @rPman
    У вас должны быть какие то механизмы развертывания сайта на проде, не важно какие, хоть скрипты, хоть ansible, главное не вручную! Причем такие скрипты должны различать установку с нуля и обновление (обновление - отдельный разговор, к сожалению красиво и универсально с базами данных не получится, но стараться нужно, чтобы иметь повторяемость и тестируемость и получать хоть какие то гарантии того что процесс обновления ничего не сломает)

    Мне нравится способ создания тестового окружения через снапшоты и репликацию...
    Файлы могут попадать простым копирование (развертывание архива, rsync, набор патчей и т.п.) а база данных через поддержание онлайн реплики master->slave, на машине, где можно временно остановить slave реплику, снять снапшот с файловой системы или всей машины (например виртуализация), и поднять копию параллельно в другой сети (виртуальные машины очень красиво позволяют все это разрулить с автоматизацией).

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

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

    @rPman
    И причем тут эластик?

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

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

    Ну и само собой демон или много, берут задачи из списка воркера и ищут.
    Ответ написан
  • Как создавать блок по нажатию кнопки PHP?

    @rPman
    Есть старый подход к созданию web приложений на php, которому обычно учатся начинающие (я надеюсь) который подразумевает следующее - любое действие пользователя на странице отправляется на сервер запросом и о в ответ возвращает НОВУЮ страницу с новым содержимым, 'по счастливой случайности' являющейся точной копией предыдущей кроме ну например появляется div элемент с нужным содержанием.

    Реализуется это следующим образом - php файл это программа, которая генерирует все формы страницы, которые могли бы быть (может быть много разных php файлов, обычно разделяемых по смыслу, например разные разделы сайта), а url в браузере (адрес этой страницы) описывает как именно нужно генерировать страницу, на практике это реализуется http GET параметрами в формате:
    http://site.com/cool_prog.php?param=value&other_param=other_value

    в php программе список этих параметров хранится в переменной $_GET в виде массива (кстати там возможны параметры массивы с именами типа param[]=value1&param[]=value2)

    Отсюда при нажатии на кнопку у тебя должна открываться к примеру страница
    http://site.com/cool_prog.php?show_div=
    а в коде php, где нужно вставить какой то кусок html проверка
    <?php if(isset($_GET['show_div'])) { ?>
    <div>yooo!</div>
    <?php } ?>


    Само собой способов передать состояние приложения много, так же с помощью настроек веб сервера (у apache к примеру это .htaccess модуль mod_rewrite) можно подменить часть некрасивых к примеру &category=value на приятные глазу https://site.com/value/

    Повторюсь - это устаревший подход и использовать его нужно только если есть потребность в создани веб приложения для машин, не поддерживающих javascript (такие приложения создают сильную нагрузку на сетевой трафик и сервер но зато никой нагрузки и никаких требований для клиентов)

    Лучше всего на сервере реализовывать только бизнеслогику и работу с данными, а все что касается визуальной части - релизовывать на javascript в браузере у клиента.
    Ответ написан
  • Как сделать цикл функции в PHP?

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

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

    Самое верное, реализовать свое приложение не как http rest архитектура (где каждый запрос это запуск приложения которое собирает заново свое состояние из базы данных или других мест) а как приложение и есть веб сервер, где между разными запросами оно не закрывается а значит память не очищается и состояние приложения остается постоянным. В этом случае http и websocket запросы будут идти к одному и тому же приложению, а если все изменения в данных происходят через веб, то нет нужды даже периодически перечитывать базу данных, ведь момент изменения нужных данных можно отловить и в этот же момент инициировать отсылку нужным клиентам данных.

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

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

    Единственное скажу что 'эти проблемы' у подхода начинаются с десятков и сотен тысяч пользователей.
    Ответ написан
    2 комментария