Ответы пользователя по тегу PHP
  • Есть ли оболочка для PHP для работы с биткоин кошельком?

    @rPman
    да, это библиотека облачной платформы

    для работы с bitcoin достаточно официального кошелька (причем если задачи - мерчант, т.е. кошельки, чей баланс нужно смотреть новосозданные) то можно использовать ключ -prune=512, тогда блокчейн на диске будет занимать считанные гигабайты (сейчас 5 кажется), ровно размер базы UTXO.

    используй официальный https://developer.bitcoin.org/reference/rpc/
    для оперативного получения уведомлений о новых блоках и транзакциях notify ключи демона bitcoin или zeromq (скорее всего это нужно только если весь блокчейн анализируешь)
    библиотеки для этого совершенно не требуется, максимум одна функция отправки curl типа такой:
    spoiler
    function wallet($method,$params=array(),$json=true)
    {
    	if(!is_array($params)) $params=array($params);
    	$ch = curl_init();
    	curl_setopt($ch, CURLOPT_URL, 'http://'.BITCOIN_USER.':'.BITCOIN_PASS.'@'.BITCOIN_IP.':BITCOIN_PORT');
    	curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(array('jsonrpc'=>'1.0','id'=>'1','method'=>$method,'params'=>$params)));
    	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1) ;
    	$txs_str=curl_exec($ch);
    	curl_close($ch);
    	$result=$json?json_decode($txs_str):$txs_str;
    	if(is_null($result))
    	{
    		die('FATAL: Invalid ip, login or password of bitcoin wallet?'.nl);
    	}
    	return $result;
    }

    подправь обработку ошибок и тебе больше ничего не понадобится
    Ответ написан
  • В чем идея и как работают шаблоны?

    @rPman
    изначально php это язык шаблонов

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

    php файл это, сюрприз, фактически html (точнее ему пофиг) файл, в котором вставлены вставки с кодом <?php ... ?>, при этом эти вставки могут семантически делить шаблон на блоки, и использовать их как просто вызов echo текст шаблона, в результате можно использовать условные блоки, циклы, и функции:

    <html>
    <body>
    <?php function test($p) { ?>
    Привет <?=$p; ?>
    <?php } ?>
    циклы:
    <ol>
    <?php for($i=3;$i>0;$i--) { ?>
    <li value="<?=$i; ?>">ha ha ha</li>
    <?php } ?>
    </ol>
    Вызовы:
    <?php test('blablabla'); ?>
    <?php test('123123123'); ?>
    
    </body>
    </html>

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

    На практике, генерация именно html на серверной стороне, идеологически устарела. Да, если надо сформировать документ (например docx или лучше open document .odt) то шаблоны идеальны, но для web лучше формировать итоговую страничку на клиентской стороне, используя шаблоны уже на javascript
    Ответ написан
  • Лучшие практики по работе с хранилищем s3?

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

    можно используя сам amazon реализовать авторизацию, но это повысит стоимость (так как потребуется платить еще и за эту прослойку)

    есть модуль авторизации amazon для вебсервера nginx, т.е. данные напрямую может проксировать через свой сервер

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

    @rPman
    после вызова curl_exec сделай вызов curl_getinfo и проверь что именно тебе возвращает сервер, в частности CURLINFO_HTTP_CODE (или лучше CURLINFO_RESPONSE_CODE) ($info['http_code']) должен быть 200, если не так, то смотри
    CURLINFO_SSL_VERIFYRESULT (список кодов смотри в комментариях) и CURLINFO_PROXY_SSL_VERIFYRESULT если используется прокси
    смотри ответ CURLINFO_HTTP_CONNECTCODE, CURLINFO_OS_ERRNO
    CURLINFO_CONDITION_UNMET

    p.s. так же проверь $response, если он пустой то нет смысла пытаться его распарсить на xml, это тоже ошибка (это значит сервер вернул пустой ответ при это м не сгенерировав ошибки, такое бывает когда криворукие бакэнд программисты реализуют api)
    Ответ написан
    7 комментариев
  • Почему preg_match неправильно определяет позицию, если в строке есть диакритические знаки?

    @rPman
    попробуй mb_ereg_match вместо preg_match, так как он работает с байтами в строке а не мультибайтовыми как все mb_...
    Ответ написан
    Комментировать
  • Как реализовать проверку и подгрузку файлов между серверами?

    @rPman
    Не советую изобретать свою систему, пользуйся готовым rsync, который может работать как по своему протоколу (рекомендуется, для этого на обоих сторонах запускается rsyncd) так и к примеру по ssh, так же штатно scp умеет копировать только изменившеися файлы по ssh, ничего дополнительно настраивать и устанавливать не надо.

    по теме, я пилил простенькую програмку, на сервере-источнике маленький php сервер, возвращающий список новых файлов (у меня было много серверов источников файлов, и один клиент, он запрашивал список с каждого, проверял наличие их локально и скачивал отсутствующие), а каталог с файлами расшарен как обычный каталог со статикой в веб сервере, файлы загружались с помощью wget (у него штатная поддержка докачки прерванных, но можно что-нибудь еще поискать)
    Ответ написан
    Комментировать
  • Как конвертировать строку содержащую uint64 число в hex значение на PHP?

    @rPman
    поправил ответ:

    чтобы преобразовать в hex нужно использовать bin2hex (dechex не подойдет, но не умеет нулями дополнять слева), pack в формате big indean, а ограничение целого числа (так как числа знаковые в php) решить используя bcmath, подлелить на 0x100000000 и взять остаток для левой и правой части результата соответственно
    upd:
    $val='9223372036854775808';
    echo bin2hex(pack('N',bcdiv($val,0x100000000,0))).bin2hex(pack('N',bcmod($val,0x100000000,0)));
    Ответ написан
  • Как ускорить чтение большого архива gz?

    @rPman
    на php анализ логов будет очень медленным, я переписывал на c++ и получал до 10крат ускорение (можно и больше, все зависит от логики анализа, а при использовании clang llvm еще 2х, например парсинг json ускоряется буквально на глазах, пока llvm собирает статистику исполнения), у тебя основная нагрузка именно тут.

    так же пользуйся многопоточностью, например готовые консольные утилиты и пайпы, запуская их из своей программы:

    pigz -dkc dump.log.gz | grep -e 'регулярное выражение' | программа_анализирующая_итоговые_строки

    тут дополнительно gzip заменен на pigz, можно скачать для windows даст кратно ускорение на распаковку за счет многопоточности.

    upd: замени gzip на zstd, вот уж где ускорение получишь, и бонусом еще несколько процентов уменьшения размера архивов.
    Ответ написан
    4 комментария
  • Блокировка PHP flock создает последовательную очередь?

    @rPman
    на базе только flock сделать очередь будет сложно

    существует штатный инструмент очередей с поддержкой в php - msg_get_queue (вообще семафоры в php адекватно работают только в linux)
    я тут в комментариях про это писал https://qna.habr.com/q/1007515

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

    @rPman
    примите как данность, docker - дитя linux, и на windows его портировали как получится, не со зла, а исключительно из-за того что windows сложная система и песочницу там запилить реально не просто.

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

    майкрософт это давно понимает и поэтому запилили wsl, ибо это способ хоть как то удержать главное, что определяет, на какими операционными системами будут пользоваться люди в конце концов - developers developers developers!
    Ответ написан
    Комментировать
  • Как проверить ссылку RSS?

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

    с высокой вероятностью в ссылке будет слово rss (либо type=rss, так многие cms-ки экспортируют свои статьи туда либо .rss) но само собой никто ничего не гарантирует, никаких стандартов на это нет

    как правильно - запрашиваешь по ссылке заголовки, без контента, и смотришь Content-Type должен быть тип text/rss+xml или application/rss+xml, редко бывает text/xml или application/xml но тут дальше только по содержимому
    Ответ написан
    Комментировать
  • Как упростить данный скрипт, слишком долго выполняется?

    @rPman
    первый вариант - генерируй sql скрипт вида
    select ... from ... where id in (1,2,3,4,5,6....)
    у этого способа ограничение на количество записей в скобках кажется 1000, так что в цикле генерируй (чуть чуть подправить твой скрипт)

    второй вариант - идеологически более верный, создаешь временную таблицу в базе с одной колонкой id, заливаешь в нее твои идентификаторы, и затем одним запросом получаешь весь список записей
    select ... from temp_ids a left join table_1 b on a.id=b.id
    Ответ написан
  • Как в fputcsv вывести вложенный массив в массиве?

    @rPman
    Если данные будут смотреть люди исключительно глазами (и в лучшем случае в экселе фильтрацию по подстроке будут делать), до достаточно список в ячейку разместить объединив строки с помощью implode, с каким нибудь разделителем, например ';' или '|' (очень редко используется, коллизий будет гораздо меньше, что даже можно считать машиночитаемым)

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

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

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

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

    @rPman
    CURLFILE большими буквами? почему у тебя на это не ругается? надо CURLFile
    Ответ написан
  • Как simple_html_dom разбить в массив?

    @rPman
    не смотрю что там внутри у тебя, просто знай что в результате find() ты получаешь массив объектов, к которым так же можно сделать find

    почти наверняка тебе достаточно просто корректно составить css селектор
    Ответ написан
    Комментировать
  • Как написать бота локально если нужен SSL?

    @rPman
    Никак, ssl сертификат должен быть известен серверам viber, им твой самописный неизвестен.

    Можно попытаться сэкономить, настроив http прокси на том же nginx, в этом случае требования к серверу будут мнимальные, мало того всякие cdn типа cloudflare дают бесплатно как сертификат так и предоставляют простейшие прокси
    Ответ написан
    Комментировать
  • Как исправить ошибки php mysql?

    @rPman
    нужно смотреть что там за сообщение об ошибке, вполне возможно /usr/lib/php/20200930/mysqli.so файл нулевой длины и его достаточно будет удалить вручную

    удаляй все что хоть как то конфликтует, включая их зависимости
    apt purge ...

    если что можно удалять вручную с помощью dpkg игнорируя зависимости но в конце концов порядок нужно восстановить чтобы apt autoremove -f отработало и dpkg-reconfigure -a тоже

    p.s. почему у тебя такой странный путь?
    поэтому вместо debian я ставлю ubuntu, список и поддержка backports для кучи полезных приложений там заметно полнее и все за порядок удобнее
    Ответ написан
  • Как получить данные формы и отправить дальше?

    @rPman
    Старый и идеологически уже не правильный способ, при формировании кода страницы 2 в значения value тегов input можно вставлять значения, принятые со страницы 1 (глобальная переменная $_POST или $_GET), но при этом необходимо пропустить эти данные через htmlspecialchars а для данных вне атрибутов, например для select или textarea, - более мощную htmlentities, но в любом случае с осторожностью, например \n там для html опций не конвертируется (а для xml да но другие нюансы), советую полистать комментарии под этими функциями.

    Если из страницы 1 нужно было передать данные полей, которых нет на странице 2 но нужны на странице 3, то использовали скрытые input type=hidden

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

    @rPman
    можно использовать array_map, на вход подаешь $_GET[CART] и функцию, обрабатывающую каждый элемент (то что у тебя внутри foreach)

    'items' => array_map(function($v){...},$_GET[CART])
    Ответ написан
    Комментировать
  • Каким образом почистить и перезаписать большой файл с номерами телефона?

    @rPman
    20т записей это маленький файл, большой это миллиарды

    русские номера это начинающиеся на +7 или 8
    еще есть местные городские номера, без кода города, вот что это за номер 58510350

    ты ж программист (судя по вопросам), берешь свой любимый javascript, берешь nodejs и пишешь в 4 строчки фильтр
    Ответ написан
    Комментировать