Тайм-аут PHP SoapClient

Вы должны подклассифицировать NSWindow, чтобы изменить фон, а затем переопределить реализацию для

- (id)initWithContentRect:(NSRect)contentRect
                styleMask:(NSUInteger)styleMask
                  backing:(NSBackingStoreType)bufferingType
                    defer:(BOOL)flag

. В качестве примера см. HUDWindow Mat Gemmell: http://mattgemmell.com/2006 / 03/12 / hudwindow

23
задан hakre 2 January 2013 в 18:35
поделиться

6 ответов

Посмотрите на

, если вы чувствуете себя комфортно и ваша среда позволяет вам продлевать занятия.

Он в основном расширяет класс SoapClient, заменяет транспорт HTTP на curl, который может обрабатывать тайм-ауты:

class SoapClientTimeout extends SoapClient
{
    private $timeout;

    public function __setTimeout($timeout)
    {
        if (!is_int($timeout) && !is_null($timeout))
        {
            throw new Exception("Invalid timeout value");
        }

        $this->timeout = $timeout;
    }

    public function __doRequest($request, $location, $action, $version, $one_way = FALSE)
    {
        if (!$this->timeout)
        {
            // Call via parent because we require no timeout
            $response = parent::__doRequest($request, $location, $action, $version, $one_way);
        }
        else
        {
            // Call via Curl and use the timeout
            $curl = curl_init($location);

            curl_setopt($curl, CURLOPT_VERBOSE, FALSE);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
            curl_setopt($curl, CURLOPT_POST, TRUE);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $request);
            curl_setopt($curl, CURLOPT_HEADER, FALSE);
            curl_setopt($curl, CURLOPT_HTTPHEADER, array("Content-Type: text/xml"));
            curl_setopt($curl, CURLOPT_TIMEOUT, $this->timeout);

            $response = curl_exec($curl);

            if (curl_errno($curl))
            {
                throw new Exception(curl_error($curl));
            }

            curl_close($curl);
        }

        // Return?
        if (!$one_way)
        {
            return ($response);
        }
    }
}
17
ответ дан hakre 2 January 2013 в 18:35
поделиться

Хотя Андрей связался с достойным решением, у него меньше кода, но он нашел хорошее решение:

Пример кода:

//
// setting a connection timeout (fifteen seconds on the example)
//
$client = new SoapClient($wsdl, array("connection_timeout" => 15));

И есть также контекст потока, если вам нужно более детальное управление HTTP. См. Параметр stream_context для new SoapClient() Документов . Под поверхностью SoapClient используются транспорты HTTP и SSL.

49
ответ дан Chris 2 January 2013 в 18:35
поделиться
ini_set("default_socket_timeout", 15);
$client = new SoapClient($wsdl, array(......));

Параметр connection_timeout определяет время ожидания в секундах для подключения к службе SOAP. Этот параметр не определяет время ожидания для служб с медленными ответами. Для ограничения времени ожидания вызовов доступна настройка default_socket_timeout.

34
ответ дан gdtv 2 January 2013 в 18:35
поделиться

Принятый ответ нарушит все функциональные возможности, которые предлагает SoapClient. Как установка правильных заголовков контента, аутентификация и т. Д.

Это было бы лучшим решением проблемы

class MySoapClient extends \SoapClient
{
    private $timeout = 10;

    public function __construct($wsdl, array $options)
    {
        // Defines a timeout in seconds for the connection to the SOAP service.
        // This option does not define a timeout for services with slow responses.
        // To limit the time to wait for calls to finish the default_socket_timeout setting is available.
        if (!isset($options['connection_timeout'])) {
            $options['connection_timeout'] = $this->timeout;
        }

        parent::__construct($wsdl, $options);
    }

    public function setTimeout($timeout)
    {
        $this->timeout = $timeout;
    }

    public function __doRequest($request, $location, $action, $version, $one_way = 0)
    {
        $original = ini_get('default_socket_timeout');
        ini_set('default_socket_timeout', $this->timeout);
        $response = parent::__doRequest($request, $location, $action, $version, $one_way);
        ini_set('default_socket_timeout', $original);

        return $response;
    }

}
4
ответ дан Sander Visser 2 January 2013 в 18:35
поделиться

Вы можете установить это через композитор: https://github.com/ideaconnect/idct-soap-client

Он расширяет стандартный SoapClient и дает возможность установить количество повторные попытки, соединение и тайм-ауты чтения.

1
ответ дан George 2 January 2013 в 18:35
поделиться

Я использую следующую логику при работе с SOAPClient:

public function executeSoapCall($method, $params)
{
    try {
        $client = $this->tryGetSoapClient();

        $timeout = ini_get('default_socket_timeout');
        ini_set('default_socket_timeout', 60);//set new timeout value - 60 seconds
        $client->__soapCall($method, $params);//execute SOAP call
        ini_set('default_socket_timeout', $timeout);//revert timeout back
    } catch (\Throwable $e) {
        if (isset($timeout)) {
            ini_set('default_socket_timeout', $timeout);//revert timeout back
        }
    }
}
protected function tryGetSoapClient()
{
    $timeout = ini_get('default_socket_timeout');//get timeout (need to be reverted back afterwards)
    ini_set('default_socket_timeout', 10);//set new timeout value - 10 seconds
    try {
        $client = new \SoapClient($this->wsdl, $this->options);//get SOAP client
    } catch (\Throwable $e) {
        ini_set('default_socket_timeout', 10);//revert back in case of exception
        throw $e;
    }
    $this->iniSetTimeout($timeout);//revert back

    return $client;
}

Это помогает мне ждать до 10 секунд для установления соединения и 60 секунд для выполнения вызова.

0
ответ дан Dmytro Lukachuk 2 January 2013 в 18:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: