Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何防止拦截的Guzzle 3请求生成DNS请求?_Php_Guzzle_Goutte - Fatal编程技术网

Php 如何防止拦截的Guzzle 3请求生成DNS请求?

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插件的相关片段,用于提供虚假响应

我正在使用Goutte 1.0.6(Guzzle 3的最新版本)来构建web刮板。对于测试,我希望加载一个HTTP响应并提供该响应,而不是一个真正的cURL响应,这基本上可以正常工作。目前用例是单元测试,但我希望我也会将其用于生产缓存

有趣的是,我有时注意到,如果我与web断开连接,我的单元测试就会减慢。我用Wireshark做了一些挖掘,发现我对
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调用已经消失