Здравствуйте!
Рецепт разбора SOAP ответа
Проблема: бывает так, что при вызове soap, ответ на стороне клиента не собирается в объект, это может быть и из-за wsdl или из-за неверного ответа от сервер.
Решение: распарсить ответ от сервере как XML
// выполняем функцию SOAP $response = $this->client->__soapCall("getParam", $param); // костыль, так как первый response ничего не вернул, будем тупо парсить XML ответ $response = $this->client->__getLastResponse(); // xml парсеру не нравится тег с неймспейсами, вырезаем их $response = str_ireplace(array('soapenv:', 'tem:', 'SOAP-ENV:', 'rpc:'), '', $response); $xml = simplexml_load_string($response, "SimpleXMLElement", LIBXML_NOCDATA); $json = json_encode($xml); $arrayResponse = json_decode($json,TRUE);
Если есть ошибка при разборе, можно поиграть с параметрами
$xml = simplexml_load_string($response, «SimpleXMLElement», LIBXML_COMPACT | LIBXML_PARSEHUGE);
Асинхронное выполнение кода PHP (нет)
В книге «Symfony 5. Быстрый старт» есть хороший пример, когда нам надо выполнить какие то долгие действия (отправить почту, вызвать сторонний API) но не заставлять пользователя ждать. Для этого используется очередь. Мы в очередь записываем действие, сразу отправляем ответ пользователю а дальше уже, в другом скрипте делаем задачи из очереди.
Но если по каким то причинам, вы не можете поставить rabbitmq или вам это будет «ДОРОГО», считай излишни, можно обойтись таким асинхронным выполнением. Суть его в том, что все действия делаем быстро, отдаем ответ клиенту, а потом уже, когда он отключился, продолжаем выполнять свои задачи:
<?php // Игнорирует отключение пользователя ignore_user_abort(true); //позволяет скрипту быть запущенным постоянно set_time_limit(0); // старт буфиризации ob_start(); // вывести результат в буфер echo $result; $length = ob_get_length(); header('Connection: close'); header("Content-Length: " . $length); header("Content-Encoding: none"); header("Accept-Ranges: bytes"); // отключаем буфиризацию ob_end_flush(); // сбросить (отправить) буфер вывода ob_flush(); // сброс системного буфера вывода flush(); // а вот тут уже делаем все остальное
По такому принципу у меня работает Telegram бот, он на входе принимает сообщение с внешнего источника, и тут же отключает этот источник от себя, а уже дальше отправляет сообщение в телегу
ClearURLs
ClearURLs — https://github.com/ClearURLs/Addon/ расширение которое обрезает в URL все трекеры. Это превосходно.
Yandex поступает подло
Symfony 5. Быстрый старт | Fabien Potencier
- Fabien Potencier
- Symfony 5. Быстрый старт
- ISBN-13: 978-2-918390-42-8
Зашла легко и быстро, меньше чем за день.
В книге много чего поверхностного, и после каждой главы еще по 3-7 ссылок для дальнейшего обучения. Но приятно то, что книга свежая, про Symfony5 рассказывает, и что на профессиональном уровне, а не вот это — а сейчас мы напишем Hello world
Знал, но хорошо освежил в памяти
- EasyAdmin
- API Platform
А вот это для меня было новое
- SPA — JavaScript Single Page Application ( Preact и Symfony Encore. )
- Apache Cordova
Джон Кехо «Подсознание может всё!»
Дайджест-аутентификация (Digest access authentication)
Ранее я описывал алгоритм авторизации Digest, как самому собрать пакет данных
Для PHP все оказалось проще, в CURL уже есть готовый механизм, который делает 2 запроса для правильной авторизации
Это параметр CURLOPT_HTTPAUTH => CURLAUTH_DIGEST,
Полностью запрос:
$request =[ 'SOAPAction: "http://yandex.ru/"', 'Content-Type: text/xml;charset=UTF-8', ]; $options = array( CURLOPT_URL => $url, CURLOPT_HEADER => true, CURLOPT_VERBOSE => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_SSL_VERIFYPEER => false, // for https CURLOPT_USERPWD => $username . ":" . $password, CURLOPT_HTTPAUTH => CURLAUTH_DIGEST, CURLOPT_HTTPHEADER => $request, CURLOPT_POST => true, CURLOPT_POSTFIELDS =>"xmlRequest=" . $input_xml // если нужно передать xml в теле POST ); $ch = curl_init(); curl_setopt_array( $ch, $options ); try { $raw_response = curl_exec( $ch ); // validate CURL status if(curl_errno($ch)) throw new Exception(curl_error($ch), 500); // validate HTTP status code (user/password credential issues) $status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($status_code != 200) throw new Exception("Response with Status Code [" . $status_code . "].", 500); } catch(Exception $ex) { if ($ch != null) curl_close($ch); throw new Exception($ex); } if ($ch != null) curl_close($ch); echo "raw response: " . $raw_response;
Нунчи. Корейское искусство предугадывать поступки людей и мягко управлять любой ситуацией | Хонг Юни
Хонг Юни
Нунчи. Корейское искусство предугадывать поступки людей и мягко управлять любой ситуацией
ISBN: 978-5-04-108801-9
Не понравилась от слова совсем. Книга написаная женщиной для женщин, где основной посыл — как бы чего не случилось и лучше помолчать, пусть другие сами догадываются что у вас на уме. Будьте скрытыми и анализируйте до тараканов. Примеры в книге очень примитивные и явно нацелены на американскую аудиторию.
Одна из цитат — Эйфелева башня: Единственное место, где ее не видно
Это гениально! Раньше такие цитаты очень любили в ВК.