Почему сессия PHP SOAP не является постоянной? - PullRequest
2 голосов
/ 13 июня 2010

Я определил сервер SOAP следующим образом.

ini_set('soap.wsdl_cache_enabled', 0);
ini_set('session.auto_start', 0); 
global $config_dir;     
session_start();

$server = new SoapServer("xxxx.wsdl");      
$server->setClass('import');
$server->setPersistence(SOAP_PERSISTENCE_SESSION);
$server->handle();

Когда я соединяю его с SoapClient и вызываю публичные функции, сеанс кажется не постоянным.Я установил приватную переменную при первом вызове, но эта переменная теряет свое значение при втором вызове ....

$client = new SoapClient('xxxx.wsdl', array('trace' => 1, 'exceptions' => 1));

//The First call. I set the fromdb private variable to "nostran"
$client->setFromdb("nostran");  

//The second call. Here I need the fromdb but it has not any value....
$b = $client->setIrodak_id("1234");

Есть мысли?Спасибо!

Ответы [ 3 ]

2 голосов
/ 13 июня 2010

_bogus_session_name представляется ключом в массиве сеансов, который использует расширение soap (см. source ).

Применяется обычный совет для объектов, хранящихся в сеансе: убедитесь, что определение класса доступно перед вызовом session_start или что у вас установлен обработчик автозагрузки перед вызовом handle.

0 голосов
/ 16 января 2014

Первый Вы можете всегда пытаться установить SoapHeader следующим образом:

$header = new SoapHeader('{NAMESPACE__YOU_CAN_FIND_IT_IN_YOUR_WSDL__TARGETNAMESPACE}', 'SessionPersistenceHeader');

$client = new SoapClient('xxxx.wsdl', array('trace' => 1, 'exceptions' => 1));

$client->__setSoapHeaders($header);

Второй параметр SoapHeader выбирается свободно, а третий параметр является необязательным и может быть пустым для решения этой проблемы.проблема.Просто добавьте пустой заголовок.

... и секунда вы не должны делать session_start() до инициализации вашего сервера.

... и третий попытайтесь не устанавливать ваши php.ini-настройки во время выполнения, но в самом php.ini.

Подсказка: когда вы используете Zend / Soap / Client.php из Zend Framework 2, SoapHeader будетвсегда установлен.Это решает это для меня.

ИСПЫТАНИЯ: Лучший способ протестировать ваш SoapServer на SOAP_PERSISTENCE_SESSIONs - это использовать класс Variable, установщик и получатель для него.

Вот примеркласс:

<?php

class soaptest {

    /**
     * var
     *
     * @var int
     * @access private
     */
    private $_var = 0;

    /**
     * setVar
     *
     * @param int $value
     * @access public
     * @return void
     */
    public function setVar($value) {
        $this->_var = $value;
    }

    /**
     * getVar
     *
     * @access public
     * @return int
     */
    public function getVar() {
        return $this->_var;
    }

}

?>

и чем в вашем TestClient:

<?php

    // [...]

    $value = 123;
    $client->setVar($value);
    $result = $client->getVar();

    if ($value == $result) {
        echo 'SoapAPI is session persistent.';
    } else {
        echo 'SoapAPI is NOT session persistent.';
    }
?>
0 голосов
/ 26 октября 2011

Библиотека SOAP в PHP не сохраняет куки между запросами по умолчанию. Вам нужно вручную извлечь их с помощью getLastResponseHeaders () и установить их с помощью __setCookie ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...