1

如何使用Buzz Browser实例更改呼叫的请求选项?

我想为通话添加更长的超时时间。现在,如果旧服务器花费的时间超过 x 秒,它就会触发和异常。我想延长这个超时时间,因为旧服务器总是返回结果,但有时可能需要 40 秒。

我在 Symfony2 控制器中使用,这是我的代码:

try {
    $buzz = new Browser();
    $legacyUrl = self::URL_LEGACY_SERVER . $urlSuffix .'?'. http_build_query($request->query->all());
    $legacyResponse = $buzz->get($legacyUrl, array());
} catch (\Exception $e) {
    return $this->sendError('Request to legacy server failed.', 500);
}
4

1 回答 1

9

学习阅读源代码。在那个 GitHub 页面上搜索“超时”。

它会告诉你AbstractClient有一个timeout属性和一个setTimeout()方法:

abstract class AbstractClient implements ClientInterface {
    // [...]
    protected $timeout = 5;
    // [...]
    public function setTimeout($timeout) {
        $this->timeout = $timeout;
    }
    // [...]
}

现在你应该想,“我怎样才能到达那个对象?”。由于您正在使用该Browser课程,因此您应该从那里开始。

查看Browser的构造函数,您可以看到它将client属性设置为实现的类ClientInterface

public function __construct(ClientInterface $client = null, FactoryInterface $factory = null) {
    $this->client = $client ?: new FileGetContents();
    $this->factory = $factory ?: new Factory();
}

由于您没有将任何参数传递给构造函数,它会将客户端设置为 的实例FileGetContents,该实例扩展AbstractStream,进而扩展AbstractClient(通过文件并自己查看)。

由于client在 的构造函数中设置的属性Browser设置为私有,因此您必须找到一种方法来获取它。浏览课程,您会发现

public function getClient() { /* ... */ }

好的。我们现在知道我们可以通过调用来获取客户端getClient()。我们也知道客户端有一个setTimeout()方法:

$buzz->getClient()->setTimeout(40);

瞧。

于 2014-09-26T14:17:35.047 回答