Php 如何防止拦截的Guzzle 3请求生成DNS请求?
我正在使用Goutte 1.0.6(Guzzle 3的最新版本)来构建web刮板。对于测试,我希望加载一个HTTP响应并提供该响应,而不是一个真正的cURL响应,这基本上可以正常工作。目前用例是单元测试,但我希望我也会将其用于生产缓存 有趣的是,我有时注意到,如果我与web断开连接,我的单元测试就会减慢。我用Wireshark做了一些挖掘,发现我对Php 如何防止拦截的Guzzle 3请求生成DNS请求?,php,guzzle,goutte,Php,Guzzle,Goutte,我正在使用Goutte 1.0.6(Guzzle 3的最新版本)来构建web刮板。对于测试,我希望加载一个HTTP响应并提供该响应,而不是一个真正的cURL响应,这基本上可以正常工作。目前用例是单元测试,但我希望我也会将其用于生产缓存 有趣的是,我有时注意到,如果我与web断开连接,我的单元测试就会减慢。我用Wireshark做了一些挖掘,发现我对http://example.com/something正在生成DNS请求,即使它们是不必要的 下面是我的Guzzle插件的相关片段,用于提供虚假响应
http://example.com/something
正在生成DNS请求,即使它们是不必要的
下面是我的Guzzle插件的相关片段,用于提供虚假响应。相关位是捕获的请求。在发送事件之前,如果在推进表中找到缓存项,则在结束时填写请求的响应:
class SavedPageLoaderPlugin extends HttpPluginBase
{
public static function getSubscribedEvents()
{
return array(
'request.before_send' => 'onRequestBeforeSend',
);
}
/**
* Handles a Guzzle event before an HTTP op is attempted
*
* @param \Guzzle\Common\Event $event
* @throws \WebScraper\PauseException
*/
public function onRequestBeforeSend(Event $event)
{
// @var $request Guzzle\Http\Message\Response
$request = $event['request'];
// Decide if we are caching for this run
if (!$this->isLoadEnabled())
{
return;
}
// Decide if we have a URL for this request
$url = $request->getUrl();
$httpPage = HttpPageQuery::create()->
filterByUrl($url)->
findOne();
if (!$httpPage)
{
return;
}
// Set a notification message for all subscribers, then set response
$this->setContainerMessage(self::MESSAGE_USES_SAVED_PAGE);
$response = new Response(
200,
$this->convertHeadersIntoKeyedArray($httpPage->getHeaders()),
$httpPage->getBody()
);
$request->setResponse($response);
}
总而言之,代码本身正在工作。Wireshark没有实际尝试通过端口80获取数据,也没有与example.com无法提供我要求的文档相关的故障异常(例如404)。所以,我的假反应似乎很好
有没有一种方法可以让我防止狂饮者打这些毫无意义的DNS电话?我确实考虑过使用,但当时我不确定如何做到这一点,现在也不确定这是否能解决这个遗留问题
(我更喜欢在插件内部进行伪装/模仿,因此虽然我在使用MockPlugin
方面没有问题,但我希望在插件内部进行拦截,而不是按照文档的要求在插件外部进行拦截。我想我可能可以扩展它?)
也许我需要换到更高版本的Guzzle,如果这是唯一的方法,那就这样吧。我在做一个老项目,当时最新的痛风用的是Guzzle 3。我打算升级,但如果可能的话,我宁愿以后再升级,因为我当前的版本可以做我想做的一切
Post Script:我突然想到DNS调用可能来自Goutte而不是Guzzle。我不知道如何调试它,至少部分是因为Goutte是由Composer以.phar
文件的形式获取的。像xdebug
这样的调试器在这里是否有助于查看网络调用的内容和位置?Aha:这既不是狂饮也不是痛风。在代码的其他地方,我截获了request.success
事件,以便进行HTTP日志记录。这里我调用gethostbyname()
,其目的是明确地执行DNS查找
现在这个功能被禁用,“神秘的”DNS调用已经消失