Рецепт разбора 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 бот, он на входе принимает сообщение с внешнего источника, и тут же отключает этот источник от себя, а уже дальше отправляет сообщение в телегу

Yandex поступает подло

Уже с месяц Яндекс блокирует строку поиска для тех, у кого включена блокировка Яндекс метрики. Выглядит это вот так:

ya1

 

Довольно подло. Стоит отключить блокировщик, как все работает

ya2

 

Мы не гордые, пойдем в гугл.

 

Symfony 5. Быстрый старт | Fabien Potencier

  • Fabien Potencier
  • Symfony 5. Быстрый старт
  • ISBN-13: 978-2-918390-42-8

 

222

 

Зашла легко и быстро, меньше чем за день.

В книге много чего поверхностного, и после каждой главы еще по 3-7 ссылок для дальнейшего обучения. Но приятно то, что книга свежая, про Symfony5 рассказывает, и что на профессиональном уровне, а не вот это — а сейчас мы напишем Hello world

 

Знал, но хорошо освежил в памяти

  • EasyAdmin
  • API Platform

А вот это для меня было новое

  • SPA  —  JavaScript Single Page Application ( Preact и Symfony Encore. )
  • Apache Cordova

 

Джон Кехо «Подсознание может всё!»

  • Джон Кехо
  • Подсознание может всё!
  • ISBN: 978-985-15-2314-2

 

147579-dzhon-keho-podsoznanie-mozhet-vse

 

Вот это действительно клевая книга, хотя я проверю истории, про которые говорит автор.

Суть книги очень проста — мысли позитивно. И это мне подходит.

 

Дайджест-аутентификация (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

 

Снимок экрана 2021-04-27 в 18.05.17

Не понравилась от слова совсем. Книга написаная женщиной для женщин, где основной посыл — как бы чего не случилось и лучше помолчать, пусть другие сами догадываются что у вас на уме. Будьте скрытыми и анализируйте до тараканов. Примеры  в книге очень примитивные и явно нацелены на американскую аудиторию.

Одна из цитат — Эйфелева башняЕдинственное место, где ее не видно

Это гениально! Раньше такие цитаты очень любили в ВК.