Доброго времени суток.
Пытаюсь освоить веб сервис SOAP.
Прописал все по мануалу,
public function actions()
{
return array(
'wsdl' => array(
'class' => 'CWebServiceAction',
),
);
}
WSDL получаю, тут все ок. Далее есть пока единственный метод возвращающий ассоциативный массив.
/**
* @param string $needle строка для поиска
* @param array $attributes атрибуты модели
* @return array значение
* @soap
*/
public function findByName($needle, $attributes = array())
{
...
}
Создаю клиент, вызываю метод - в ряде случаев все отрабатывает нормально, иногда вылетает ошибка
"looks like we got no XML document". В ответе от сервера в этом случае приходит обрезанный xml последний тег выглядит вот так - </SOAP-ENV:Envelop. Преимущественно ошибка вываливается на больших пакетах, когда в массиве много значений.
Очень надеюсь на вашу помощь. Перерыл все, не нашел ничего похожего.
Набросал пример подтверждающий ошибку, может быть так будет нагляднее
<?php
class FiasController extends CController
{
public function actions()
{
return array(
'wsdl' => array(
'class' => 'CWebServiceAction',
),
);
}
/**
* @return array
* @soap
*/
public function success()
{
$result = array();
for ($i = 0; $i < 4; $i++) {
$result[$i] = array(
'foo1' => '18ad96e6-5526-11e0-9c19-00248c654095',
'foo2' => '18ad96e6-5526-11e0-9c19-00248c654095',
'foo3' => '18ad96e6-5526-11e0-9c19-00248c654095',
'foo4' => '18ad96e6-5526-11e0-9c19-00248c654095',
'foo5' => '18ad96e6-5526-11e0-9c19-00248c654095',
'foo6' => '18ad96e6-5526-11e0-9c19-00248c654095',
'foo7' => '18ad96e6-5526-11e0-9c19-00248c654095',
'foo8' => '18ad96e6-5526-11e0-9c19-00248c654095',
'foo9' => '18ad96e6-5526-11e0-9c19-00248c654095',
'foo10' => '18ad96e6-5526-11e0-9c19-00248c654095',
'foo11' => '18ad96e6-5526-11e0-9c19-00248c654095',
'foo12' => '18ad96e6-5526-11e0-9c19-00248c654095',
);
}
return $result;
}
/**
* @return array
* @soap
*/
public function fail()
{
$result = array();
for ($i = 0; $i < 5; $i++) {
$result[$i] = array(
'foo1' => '18ad96e6-5526-11e0-9c19-00248c654095',
'foo2' => '18ad96e6-5526-11e0-9c19-00248c654095',
'foo3' => '18ad96e6-5526-11e0-9c19-00248c654095',
'foo4' => '18ad96e6-5526-11e0-9c19-00248c654095',
'foo5' => '18ad96e6-5526-11e0-9c19-00248c654095',
'foo6' => '18ad96e6-5526-11e0-9c19-00248c654095',
'foo7' => '18ad96e6-5526-11e0-9c19-00248c654095',
'foo8' => '18ad96e6-5526-11e0-9c19-00248c654095',
'foo9' => '18ad96e6-5526-11e0-9c19-00248c654095',
'foo10' => '18ad96e6-5526-11e0-9c19-00248c654095',
'foo11' => '18ad96e6-5526-11e0-9c19-00248c654095',
'foo12' => '18ad96e6-5526-11e0-9c19-00248c654095',
);
}
return $result;
}
public function actionTestSoap()
{
ini_set("soap.wsdl_cache_enabled", "0");
$client = new SoapClient('адрес_сервера/fias/wsdl/', array("trace" => 1,
"exceptions" => 0));
$result = $client->success();
echo "<b>Success Request:</b><br>";
echo htmlspecialchars($client->__getLastRequest()) . "<br>";
echo "<b>Success Response:</b><br>";
echo htmlspecialchars($client->__getLastResponse()) . "<br>";
echo "<b>Success Result:</b>";
var_dump($result);
$result = $client->fail();
echo "<b>Fail Request:</b><br>";
echo htmlspecialchars($client->__getLastRequest()) . "<br>";
echo "<b>Fail Response:</b><br>";
echo htmlspecialchars($client->__getLastResponse()) . "<br>";
echo "<b>Fail Result:</b>";
var_dump($result);
}
}
В экшне fias/testSoap сначала вызываю функцию success - при этом все ок, потом функцию fail в этом случае xml ответ обрезан, конечный тег не закрывается. Разница между методами success и fail в том что во второй на 1 элемент в массиве больше.