Соединение с Soap, как отловить connect timeout error

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
sergo
Сообщения: 23
Зарегистрирован: 2012.10.23, 15:26
Откуда: Россия

Соединение с Soap, как отловить connect timeout error

Сообщение sergo »

Через логин-форму беру от юзера логин/пароль и запросом к soap сравниваю их с данными, отдаваемые сервером. Всё хорошо, данные отдаются, сравниваю, отдаю в валидейт формы,
но если удалённый сервер лежит, то по таймауту выдается страшный экран с ошибкой:

Код: Выделить всё

PHP Error
SoapClient::SoapClient(http://xx.xx.xxx.xx:xxxx/uccp?wsdl): failed to open stream: Connection timed out 
Пытаюсь отлавливать этот эксепшн, но вижу, что-то неправильно делаю, т.к. не срабатывает:

Код: Выделить всё

try {
  $obj = new SoapClient(UC::WSDL, array( "login" => UC::USER,"password"  => UC::PASS,    "exceptions" => 1,    "trace" => 1));
  return $obj;
     }
        catch (SoapFault $e) { 

            Yii::log($obj->__getLastRequest());
            Yii::log($obj->__getLastResponse());

          throw new CHttpException(503,'Невозможно установить соединение с UCC-провайдером. Повторите попытку позже.');
        } 
Чего-то похоже, не хватает.
Как правильно закодить такую ситуацию?
Хотя бы Вместо экрана с PHP error делать редирект на нужную страницу с уведомлением, что "временно не работает"
Аватара пользователя
TranceSmile
Сообщения: 562
Зарегистрирован: 2011.06.27, 19:04
Откуда: Украина
Контактная информация:

Re: Соединение с Soap, как отловить connect timeout error

Сообщение TranceSmile »

а если так

Код: Выделить всё

if( $obj = new SoapClient(UC::WSDL, array( "login" => UC::USER,"password"  => UC::PASS,    "exceptions" => 1,    "trace" => 1)))
{
    return $obj;
}
else 
{
     // ошибка
}
Изображение
aspire
Сообщения: 40
Зарегистрирован: 2012.06.01, 12:18
Контактная информация:

Re: Соединение с Soap, как отловить connect timeout error

Сообщение aspire »

возникла такая же ошибка, как решили проблему?
sergo
Сообщения: 23
Зарегистрирован: 2012.10.23, 15:26
Откуда: Россия

Re: Соединение с Soap, как отловить connect timeout error

Сообщение sergo »

написал такой класс.

Код: Выделить всё

class UC extends SoapClient {

    const USER = "...";
    const PASS = "...";
    const WSDL = "http://../uccp?wsdl";
    const TIMEOUT = 10;    // число секунд на получение ответа от soap-сервера


    public static function init() {

       ini_set('default_socket_timeout', UC::TIMEOUT);

        $obj = new SoapClient(UC::WSDL, array(
                    "login" => UC::USER, "password"  => UC::PASS,
                    "exceptions" => 1, "trace" => 1 ));

        return $obj;

    }


    public static function __callStatic($name, $args = array()) {

        $args = $args[1];


        Yii::log("UC: take function $name");
        try {
            $obj = self::init();

            $res = $obj->$name($args);

                                          // раскомментить, если нужно подробно трейсить ответы от платформы
            //Yii::log( print_r($res) );

        } catch (SoapFault $e) {

             trigger_error("Ошибка SOAP: (faultcode: {$e->faultcode}, faultstring: {$e->faultstring})", E_USER_ERROR);

/*
* тут трейсим ответ об ошибке
            Yii::log("Soap UC error: " . $e->getMessage());
            Yii::log($obj->__getLastRequest());
            Yii::log($obj->__getLastResponse());
*/
            return null;
        }

                            // чекаем нужный нам код ответа
                            //
        if ($res->code != 200) {

            Yii::log("UC: returned code ".$res->code);
        }

        return $res;
    }
}

 
Ответить