Вы должны подклассифицировать NSWindow, чтобы изменить фон, а затем переопределить реализацию для
- (id)initWithContentRect:(NSRect)contentRect
styleMask:(NSUInteger)styleMask
backing:(NSBackingStoreType)bufferingType
defer:(BOOL)flag
. В качестве примера см. HUDWindow Mat Gemmell: http://mattgemmell.com/2006 / 03/12 / hudwindow
Посмотрите на
, если вы чувствуете себя комфортно и ваша среда позволяет вам продлевать занятия.
Он в основном расширяет класс 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);
}
}
}
Хотя Андрей связался с достойным решением, у него меньше кода, но он нашел хорошее решение:
Пример кода:
//
// setting a connection timeout (fifteen seconds on the example)
//
$client = new SoapClient($wsdl, array("connection_timeout" => 15));
И есть также контекст потока, если вам нужно более детальное управление HTTP. См. Параметр stream_context
для new SoapClient()
Документов sup> . Под поверхностью SoapClient
используются транспорты HTTP и SSL.
ini_set("default_socket_timeout", 15);
$client = new SoapClient($wsdl, array(......));
Параметр connection_timeout определяет время ожидания в секундах для подключения к службе SOAP. Этот параметр не определяет время ожидания для служб с медленными ответами. Для ограничения времени ожидания вызовов доступна настройка default_socket_timeout.
Принятый ответ нарушит все функциональные возможности, которые предлагает 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;
}
}
Вы можете установить это через композитор: https://github.com/ideaconnect/idct-soap-client
Он расширяет стандартный SoapClient и дает возможность установить количество повторные попытки, соединение и тайм-ауты чтения.
Я использую следующую логику при работе с 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 секунд для выполнения вызова.