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

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

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

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

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

    @rPman
    Одноразовый код логичнее через eval выполнять

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

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

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

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

    @rPman
    Причина тормозов - неправильно оформленный запрос, то что можно посчитать на sql сервере, почему то считаешь на бакэнде.

    Даже не изучая код, видно что вместо того чтобы делать 100500 запросов, по одному для каждого $this->room[$cart_min]->Room_id, достаточно собрать эти идентификаторы в список и сформировать один запрос на выгрузку сразу всех room_images (так как работа списка не зависит от ответа от sql сервера)

    Если количество идентификаторов меньше тысячи, то это можно сделать с помощью select ... from ... where id in (1,2,3,4,5,...)
    если больше, то подумать, может пусть списком идентификаторов сам сервер сразу и заведует, храня их в какой-нибудь табличке
    Ответ написан
  • Почему не получается обновить до php7.3 на Ubuntu 16?

    @rPman
    Потому что 16-ая версия ubuntu xenial устарела на два lts релиза, а через месяц уже будет три
    В указанном ppa нет сборок под xenial

    есть неофициальные архивы, так что с осторожностью:
    https://launchpad.net/~sergey-dryabzhinsky

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

    @rPman
    Нужно собрать посылки со складов. Если посылка весит больше 5, то посылка должна быть отправлена со склада "foo", иначе "bar". Но если на складе нет необходимого количества, то это условие нужно опустить и исходить из наличия. Вес посылки становится известен только при обращении к складу.

    Единственное условие выбора склада у вас - 'вес посылки больше 5', не зная веса посылки принять решение невозможно.

    В данной задаче необходимо топать в оба склада одновременно или по очереди и запрашивать посылку.
    Ответ написан
  • Как с помощью mPdf в PHP на один лист добавить две картинки?

    @rPman
    Сделай одну картинку, скомпоновав их с помощью, да хотя бы модуля gd или с помощью консольной утилиты imagemagic (она так же умеет формировать pdf из серии картинок)
    Ответ написан
    Комментировать
  • Получения энтропии для генератора случайных чисел в PHP - как можно сделать случайность по настоящему случайной?

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

    https://habr.com/ru/post/62237/
    Ответ написан
  • Как отправить форму несколько раз с разными данными?

    @rPman
    Тебе на php нужно симулировать отправку данных html формы?

    Это делается инструментом curl (пример), либо консольной утилитой (команду покажет сам браузер в дев-консоли, на вкладке network правую кнопку на нужном вызове - копировать - curl команду).
    Ответ написан
  • Как получить m3u8 файл с сайта?

    @rPman
    Попробуй сконвертировать m3u8 файл в готовый видеофайл с помощью ffmpeg (он умеет загружать), чтобы не перекодировало указывай кодек -c copy

    Если сайт смотрит на http заголовки, который отправляет плеер/качальщик, и блокирует их, то очевидно их придется вручную подставлять, копируя из девконсоли браузера, один раз скопируй команду загрузки куска видео затем напиши скрипт, загружающий этой командой все куски локально и собирай с помощью ffmpeg
    Ответ написан
  • Не могу вывести результат получаемый от Google recaptcha v2, как это можно сделать?

    @rPman
    вангую что скрипт обработчика сначала формирует строку ответа а потом выводит заголовки ответа и сформированную строку, соответственно если что-либо вывести перед выводом заголовков, вылетает ошибка

    чтобы понять что происходит, нужно смотреть сообщения об ошибках на веб сервере

    p.s. отладочные логи выводи не в ответ с помощью echo а пиши в файл
    Ответ написан
    Комментировать
  • Как оповещать пользователей?

    @rPman
    штатная консольная утилита samba
    smbclient -M MACHINE_NAME < message.txt
    Ответ написан
    Комментировать
  • Есть ли оболочка для 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 комментария