Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Dklab_SoapClient: параллельные запросы, реконнект, обработка тайм-аутов (Дмитрий Котеров)
Author Message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 411
   поощрить/наказать


PostPosted: Wed Feb 04, 2009 5:27 pm ()
   Post subject: Dklab_SoapClient: параллельные запросы, реконнект, обработка тайм-аутов
Reply with quote

dklab.ru/lib/Dklab_SoapClient/
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 411
   поощрить/наказать


PostPosted: Sat Feb 14, 2009 1:02 pm (спустя 9 дней 19 часов 34 минуты; написано за 1 минуту 12 секунд)
   Post subject:
Reply with quote

В текущей бета-версии библиотеки есть проблема с чрезмерном расходованием CPU из-за busy wait.
В ближайшее время будет фикс, который эту проблему решит. К сожалению, не все так просто в curl_multi...
Back to top
View user's profile Send private message Send e-mail
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 269
   поощрить/наказать

Location: Питер

PostPosted: Sat Feb 14, 2009 1:09 pm (спустя 7 минут; написано за 1 минуту 33 секунды)
   Post subject:
Reply with quote

По сему, имеет смысл пользоваться WS-Addressing =)
Правда тут возникает проблема с синхронизацией, потому как спека предполагает, что запрашиваемый сервер будет пинать коллбэк на запрашивающем.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 411
   поощрить/наказать


PostPosted: Sun Feb 22, 2009 1:15 am (спустя 7 дней 12 часов 6 минут; написано за 1 минуту 47 секунд)
   Post subject:
Reply with quote

Busy wait я, кстати, уже починил. На днях выложу.

WS-Addressing, насколько я понимаю, не совсем про это. Dklab_SoapClient позволяет распараллеливать загрузку разных кусков страницы, синхронизируясь в конце для вывода самой страницы. А WS-Addressing, если не ошибаюсь, это способ асинхронного ПОЛУЧЕНИЯ сообщений, а не асинхронной отправки с последующей синхронизацией.
Back to top
View user's profile Send private message Send e-mail
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 269
   поощрить/наказать

Location: Питер

PostPosted: Sun Feb 22, 2009 11:53 am (спустя 10 часов 38 минут; написано за 26 минут 51 секунду)
   Post subject:
Reply with quote

WS-Addressing это просто техника для снижения нагрузки на железо за счёт минимизации времени жизни соединений.
Например, если время работы удалённой системы может достигать десятков минут, логичным выходом будет отправить туда запрос и закрыть соединение. Удалённая система в определённый момент проснётся, и отдаст нам данные используя наш коллбэк сервис.

Ровно ту же схему удобно использовать и в случае необходимости получения данных от большого числа удалённых систем. Чаще всего все эти данные не являются уникальными для каждого запроса, в результате чего можно реализовать примерно такую схему работы:
1) Кеш данных
2) Кеш запросов
3) Набор клиентов для отправки запросов
4) Набор коллбэков
5) Синхронизационный тред, проще всего завязанный на семафоры (обычно с неким таймаутом), или некий кеш запросов

Если же данные уникальны, из схемы просто выкидывается кеш данных (1).

Как оно работает:
1) отправляются запросы с сохранением их ID в неком расшаренном кеше (напр. в том же memcached)
2) состояние кеша запросов опрашивается с неким интервалом, до истечения таймаута или получения всех ответов
3) коллбэк сервис при получении ответа обновляет инфу в
 а) кеше запросов
 б) в кеше данных
4) по окончании (2) заполняем все блоки данных свежими (или не очень, или не заполняем) данными

Такая организация немного сложнее нежели работа с асинхронными запросами, но имеет большое преимущество - кардинальное снижение нагрузки на железо за счёт
1) создания только одного синхронизационного треда, независимо от количества опрашиваемых сервисов
2) отсутствия необходимости в сохранении открытого канала к удалённому сервису
Дмитрий Котеров wrote:
асинхронного ПОЛУЧЕНИЯ сообщений, а не асинхронной отправки с последующей синхронизацией
Ну, вопрос "последующей синхронизации" это просто вопрос о терминах. Оба варианта распараллеливают работу, другое дело что они этим занимаются на разных уровнях:
1) асинхронные запросы - на уровне исполняемого кода
2) ws-addressing - на уровне транспорта

PS: Мы как раз сейчас реализуем именно такую схему (правда в рамках axis2/java) на базе ws-addressing, поскольку затраты на установление "обратного" соединения ниже, нежели на создание большой кучи параллельных тредов. =)
PPS: к PHP можно попробовать прикрутить axis2/C, который и реализует всякие радости вида ws-addressing, ws-policy и иже с ними.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 411
   поощрить/наказать


PostPosted: Wed Feb 25, 2009 11:49 pm (спустя 3 дня 11 часов 55 минут; написано за 1 минуту 32 секунды)
   Post subject:
Reply with quote

version 0.92:
- Fixed bug with busy wait. CPU is now used efficiently.
- Added $result->waitForConnect() method useful when you need to create a number of asynchronous requests and continue the main process execution while these requests are guaranteed begun their processings.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 411
   поощрить/наказать


PostPosted: Mon Mar 23, 2009 1:05 am (спустя 25 дней 1 час 16 минут; написано за 21 секунду)
   Post subject:
Reply with quote

Теперь разработка ведется в GIT, а не в SVN:
github.com/DmitryKoterov/dklab_soapclient/tree/master
Back to top
View user's profile Send private message Send e-mail
prologic
Guest





Карма: 386
   поощрить/наказать


PostPosted: Wed Mar 31, 2010 1:30 pm (спустя 1 год 8 дней 12 часов 24 минуты; написано за 5 минут 16 секунд)
   Post subject: Проблема с Dklab_SoapClient
Reply with quote

Здравствуйте,

У меня такая проблема. В WSDL mode всегда возвращается такой результат: SOAP response is empty.
Если не-WSDL mode, то всегда возвращается такой результат: Unable to handle request without a valid action parameter. Please supply a valid soap action.

При этом если работать со стандартной SOAP библиотекой PHP, то всё работает.

Помогите пожалуйста разобраться в чём проболема.
Code (php): скопировать код в буфер обмена
<pre><?
error_reporting (www.php.net/error_reporting)(E_ALL);
ini_set (www.php.net/ini_set)('display_errors', "1");
ini_set (www.php.net/ini_set)('log_errors', "1");

define (www.php.net/define)('REMOTE_SERVICE_REQUEST_TIMEOUT', 5);
ini_set (www.php.net/ini_set)('default_socket_timeout', REMOTE_SERVICE_REQUEST_TIMEOUT);

require_once('lib/Dklab/SoapClient.php');

try
{
        $client = new Dklab_SoapClient('https://polise.if.lv/PartnerWS/OCTA/PArtner/PremiumCalculator.asmx?wsdl', array (www.php.net/array)(
//                'location' => 'https://polise.if.lv/PartnerWS/OCTA/PArtner/PremiumCalculator.asmx',
//                'uri' => 'urn:myschema',
                'timeout' => REMOTE_SERVICE_REQUEST_TIMEOUT
        ));
       
        $parameters = array (www.php.net/array)(
                'VehicleRegNr' => 'AA12345',
                'VehicleRegCertNr' => 'AE12312312',
        );

        $cost = $client->GetVehiclePremium($parameters);

        echo (www.php.net/echo) 'cost: ';
        print_r (www.php.net/print_r)($cost);
        echo (www.php.net/echo) '<br />';
}
catch (Exception $e)
{
        echo (www.php.net/echo) 'Exception: '.$e->getMessage();
}
?>
</pre>
WSDL mode:
Code (any language): скопировать код в буфер обмена
Array
(
    [url] => https://polise.if.lv/PartnerWS/OCTA/PArtner/PremiumCalculator.asmx
    [content_type] =>
    [http_code] => 415
    [header_size] => 198
    [request_size] => 517
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 0
    [total_time] => 0.11403
    [namelookup_time] => 0.000285
    [connect_time] => 0.01853
    [pretransfer_time] => 0.094567
    [size_upload] => 348
    [size_download] => 0
    [speed_download] => 0
    [speed_upload] => 3051
    [download_content_length] => -1
    [upload_content_length] => -1
    [starttransfer_time] => 0.114002
    [redirect_time] => 0
    [request_header] => POST /PartnerWS/OCTA/PArtner/PremiumCalculator.asmx HTTP/1.1
Host: polise.if.lv
Accept: */*
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 348


    [result] => 0
    [result_timeout] =>
    [body] =>
    [headers] => HTTP/1.1 415 Unsupported Media Type
Date: Wed, 31 Mar 2010 10:21:53 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
Cache-Control: private
Content-Length: 0
)
Exception: SOAP response is empty
Non-WSDL mode:
Code (any language): скопировать код в буфер обмена
Array
(
    [url] => https://polise.if.lv/PartnerWS/OCTA/PArtner/PremiumCalculator.asmx
    [content_type] => text/xml; charset=utf-8
    [http_code] => 500
    [header_size] => 238
    [request_size] => 923
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 0
    [total_time] => 0.117329
    [namelookup_time] => 0.000248
    [connect_time] => 0.019593
    [pretransfer_time] => 0.097132
    [size_upload] => 754
    [size_download] => 435
    [speed_download] => 3707
    [speed_upload] => 6426
    [download_content_length] => 435
    [upload_content_length] => -1
    [starttransfer_time] => 0.117302
    [redirect_time] => 0
    [request_header] => POST /PartnerWS/OCTA/PArtner/PremiumCalculator.asmx HTTP/1.1
Host: polise.if.lv
Accept: */*
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 754


    [result] => 0
    [result_timeout] =>
    [body] => soap:ClientUnable to handle request without a valid action parameter. Please supply a valid soap action.
    [headers] => HTTP/1.1 500 Internal Server Error
Date: Wed, 31 Mar 2010 10:20:19 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
Cache-Control: private
Content-Type: text/xml; charset=utf-8
Content-Length: 435
)
Exception: Unable to handle request without a valid action parameter. Please supply a valid soap action.
P.S. И ещё вопрос можно ли с помощью Dklab_SoapClient авторизоваться на soap серврере c помощью SSL сертификата (.pem)?
В стандартной SOAP библиотеке это можно было сделать так:
$client = new SoapClient("https://www.baltaonline.lv/Veseris/Policy/18.asmx?wsdl", array('local_cert' => 'mycert.pem'));
Back to top
sergiosi
Guest





Карма: 386
   поощрить/наказать


PostPosted: Wed Jul 28, 2010 6:10 pm (спустя 3 месяца 28 дней 4 часа 39 минут; написано за 1 минуту 20 секунд)
   Post subject: Проблема с Dklab_SoapClient
Reply with quote

Code (php): скопировать код в буфер обмена
$client = new Dklab_SoapClient('http://10.1.1.2/?wsdl', array (www.php.net/array)('timeout' => 3));
$result = $client->GetModelsList($aParams);
Выдает SOAP response is empty, хотя код
Code (php): скопировать код в буфер обмена
$client = new SoapClient('http://10.1.1.2/?wsdl', array (www.php.net/array)('timeout' => 3));
$result = $client->GetModelsList($aParams);
выдает правильный результат
Back to top
Герыч
Заглянувший



Joined: 24 Nov 2010
Posts: 1
Карма: 0
   поощрить/наказать


PostPosted: Wed Nov 24, 2010 2:46 pm (спустя 3 месяца 26 дней 20 часов 36 минут; написано за 6 минут 18 секунд)
   Post subject:
Reply with quote

Здравствуйте. Возникла проблема с вызовом __soapCall
Code (php): скопировать код в буфер обмена
public function __construct($dbw){

    parent::__construct($this->wsdlurl, array (www.php.net/array)('trace' => true,'local_cert' =>solidcert,'exceptions' => 0,'passphrase' => '','cache_wsdl' => WSDL_CACHE_BOTH,'timeout' =>  4));
       
    }

    public function call($name, $params=array (www.php.net/array)(), $options=array (www.php.net/array)(), $inputHeaders = null, &$outputHeaders = null){

          $result = parent::__soapCall($name, $params, $options, $inputHeaders, $outputHeaders);
          if (is_soap_fault($result) ) {
              *********
              return array (www.php.net/array)();
          }else return $result;
    }
Вызываю в классе
Code (php): скопировать код в буфер обмена
  $API_clients = parent::call('GetClientsList');
И тут вся проблема:
1. Если в качестве parent стоит SoapClient - то всё нормально, возвращается массив клинтов
2. Если стоит Dklab_SoapClient,
Code (php): скопировать код в буфер обмена
Fatal error: Uncaught SoapFault exception: [HTTP] Could not connect to host
При это коннект к хосту произошёл (т.е. если в конструкторе Dklab вписать
Code (php): скопировать код в буфер обмена
print_r (www.php.net/print_r)(parent::__getFunctions)
, то получим правильный список всех доступных функций для клиента)

P.S. сюда-же, при проверке выяснилось, что Dklab_SoapClient->__construct - вызывается дважды. Это как-нибудь связано?
Back to top
View user's profile Send private message
SergeiSu
Заглянувший



Joined: 04 Feb 2011
Posts: 1
Карма: -1
   поощрить/наказать

Location: СПб

PostPosted: Fri Feb 04, 2011 8:32 pm (спустя 2 месяца 10 дней 5 часов 46 минут; написано за 5 минут 37 секунд)
   Post subject: Re: Проблема с Dklab_SoapClient
Reply with quote

Доброго времени суток.
sergiosi wrote:
Code (php): скопировать код в буфер обмена
$client = new Dklab_SoapClient('http://10.1.1.2/?wsdl', array (www.php.net/array)('timeout' => 3));
$result = $client->GetModelsList($aParams);
Выдает SOAP response is empty, хотя код
Code (php): скопировать код в буфер обмена
$client = new SoapClient('http://10.1.1.2/?wsdl', array (www.php.net/array)('timeout' => 3));
$result = $client->GetModelsList($aParams);
выдает правильный результат
Тоже сталкивался с этой проблемой.
Посде анализа кода, пришел к выводу, что данная ощибка возникает из за проблемы с используемой функцией curl_multi_info_read (не работает корректно на PHP ниже версии 5.2).
В моем случае, чтобы решить эту задачу пришлось перейти на >= PHP 5.2.
Проверено, и работает на FreeBSD 8.1 + PHP 5.2.1 и CentOS 5.5 + PHP 5.3.5.
Back to top
View user's profile Send private message
gekakos
Заглянувший



Joined: 01 Dec 2008
Posts: 5
Карма: -1
   поощрить/наказать


PostPosted: Wed Feb 23, 2011 2:00 pm (спустя 18 дней 17 часов 27 минут; написано за 6 минут 39 секунд)
   Post subject:
Reply with quote

Всем привет!
Возникла описанная выше проблема. Версия PHP 5.2.10
Code (php): скопировать код в буфер обмена
$params=array (www.php.net/array)();
$params["login"] = $config['login'];
$params["password"]$config['password'];
$params["detail"] = $detail;

$client1 = new SoapClient($config['search_wsdl'], array (www.php.net/array)('trace' => 1));
$res = $client1->FindDetail($params);
//выдает корректный результат

$client2 = new Dklab_SoapClient($config['search_wsdl'], array (www.php.net/array)('trace' => 1));
$res = $client2->FindDetail($params);
последний вызов завершается ошибкой
Quote:
Fatal error: Uncaught SoapFault exception: [Client] looks like we got no XML document in /home/***/common/soap/Dklab/SoapClient.php:161
Stack trace:
#0 /home/***/common/soap/Dklab/SoapClient.php(161): SoapClient->__soapCall('FindDetail', Array, Array, NULL, Array)
#1 /home/***/common/soap/Dklab/SoapClient.php(363): Dklab_SoapClient->__soapCallForced('The server cann...', Array)
#2 /home/***/common/soap/Dklab/SoapClient.php(124): Dklab_SoapClient_Request->getResult()
#3 /home/***/common/soap/Dklab/SoapClient.php(89): Dklab_SoapClient->__soapCall('FindDetail', Array)
#4 [internal function]: Dklab_SoapClient->__call('FindDetail', Array)
#5 /home/***/www/test3.php(58): Dklab_SoapClient->FindDetail(Array)
#6 {main} thrown in /home/***/common/soap/Dklab/SoapClient.php on line 161
а если использовать асинхронный вызов
Code (php): скопировать код в буфер обмена
$request = $client2->async->FindDetail($params);
$res = $request->getResult();
то возникнет следующая ошибка:
Quote:
Fatal error: Uncaught SoapFault exception: [Client] looks like we got no XML document in /home/***/common/soap/Dklab/SoapClient.php:161
Stack trace:
#0 /home/***/common/soap/Dklab/SoapClient.php(161): SoapClient->__soapCall('FindDetail', Array, Array, NULL, Array)
#1 /home/***/common/soap/Dklab/SoapClient.php(363): Dklab_SoapClient->__soapCallForced('The server cann...', Array)
#2 /home/***/test3.php(59): Dklab_SoapClient_Request->getResult()
#3 {main} thrown in /home/***/common/soap/Dklab/SoapClient.php on line 161
помогите разобраться, в чем проблема
Back to top
View user's profile Send private message
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 270
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Tue Mar 01, 2011 3:39 pm (спустя 6 дней 1 час 38 минут; написано за 16 секунд)
   Post subject:
Reply with quote

gekakos
мм, Вы сообщение об ошибке перевели?
Back to top
View user's profile Send private message
Ismael
Guest





Карма: 386
   поощрить/наказать


PostPosted: Fri Dec 02, 2011 4:49 am (спустя 9 месяцев 13 часов 10 минут; написано за 34 секунды)
   Post subject: SOAPClient doesn't work
Reply with quote

This doesn't work:

$client = new Dklab_SoapClient("expedientes.poderjudicial.gub.uy/wsConsultaIUE.php?wsdl");

$q = $client->consultaIUE("2-1/2011");

echo json_encode($q);

Any ideas?
Back to top
Guest






Карма: 386
   поощрить/наказать


PostPosted: Thu Dec 29, 2011 11:36 am (спустя 27 дней 6 часов 47 минут; написано за 3 минуты 47 секунд)
   Post subject: Re: Проблема с Dklab_SoapClient
Reply with quote

sergiosi wrote:
Code (php): скопировать код в буфер обмена
$client = new Dklab_SoapClient('http://10.1.1.2/?wsdl', array (www.php.net/array)('timeout' => 3));
$result = $client->GetModelsList($aParams);
Выдает SOAP response is empty, хотя код
Code (php): скопировать код в буфер обмена
$client = new SoapClient('http://10.1.1.2/?wsdl', array (www.php.net/array)('timeout' => 3));
$result = $client->GetModelsList($aParams);
выдает правильный результат
Аналогичная проблема, PHP 5.3.8, Solaris.

+ На мой взгляд должна присутствовать очевидная вещь с таймаутом на получение WSDL, вот я сейчас работаю с сервисом, который перестал отдавать WSDL по таймауту, воркеры PHP сразу уперлись в потолок и все умерло и ваша либа содержит эту же ошибку.
Back to top
cb fbc
Guest





Карма: 386
   поощрить/наказать


PostPosted: Mon Sep 15, 2014 9:50 pm (спустя 2 года 8 месяцев 17 дней 10 часов 13 минут; написано за 3 секунды)
   Post subject: xncv bvnm
Reply with quote

bhn nmbnmbnm
Back to top
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
Post a reply
Username
Subject
Господа спамеры и оптимизаторы!

Вы можете даже и не пытаться вставлять в текст поста ссылки - они все равно автоматически удаляются (вернее, тэги <a> заменяются на тэги <u>).

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

Disable BBCode in this post
Disable Smilies in this post
    HTML is OFF
BBCode is ON
Smilies are ON
You cannot post new topics in this forum. You can reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML