ZF2 日志 curl 请求

Posted

技术标签:

【中文标题】ZF2 日志 curl 请求【英文标题】:ZF2 log curl requests 【发布时间】:2017-03-14 08:06:19 【问题描述】:

我需要捕获应用程序在执行期间发出的所有 curl 请求,并将它们显示在 ZF 开发人员工具工具栏的新选项卡中。

我为 ZF Developer Toolbar 创建了一个收集器,但现在不知道如何捕获应用程序在执行期间发出的所有 curl 请求并记录它们。

【问题讨论】:

请查看***.com/questions/17092677/… & ***.com/questions/866946/… 了解如何配置 curl。也许您可以将所有请求写入文件,然后在开发人员工具栏中显示该文件。我认为 curl 中没有类似的事件可以让您参与其中。 这就是我的想法。我必须在某处和开发工具中写入日志,只是为了显示这些日志。我想到的第一件事是扩展 Curl 适配器,但我认为这个扩展的 curl 适配器实例应该只能通过服务管理器访问。可能处于自动加载级别应该尝试强制使用我的扩展适配器...我实际上不知道 不要直接使用 curl 而是使用某种包装器/抽象,您可以扩展它来为您编写日志。 【参考方案1】:

经过一些研究,我认为没有针对所有 curl 请求的通用解决方案(例如来自某些第三方库的请求)。如果我错了,请纠正我。

正如您所提到的,您可以编写自己的连接器/服务来记录您自己的请求。

您还可以使用 tcpdump 之类的工具将来自应用程序的所有传出流量记录到文件中,并在 DevToolbar 中显示该文件的内容。这不仅限于 curl 请求,这可能对您更好。

【讨论】:

【参考方案2】:

您可以捕获 zf2 应用程序在执行期间发出的所有 curl 请求,并使用 CURLOPT_VERBOSE 将它们记录下来,并使用 CURLOPT_WRITEHEADER 或 curl_getinfo() 将其写入一个日志文件,然后像这样读取它以在 ZF 开发人员工具栏上显示它。 .

准备具有 CURLOPT_VERBOSE 和 CURLOPT_WRITEHEADER 选项的 curl 请求,如下所示。

function curl_request($url, $log_file_path) 

    //1. Prepare log file to append request details in to this log file
    $logfile_fp = fopen($log_file_path, "a+"); 

    //2. Prepare curl request to having CURLOPT_VERBOSE and CURLOPT_WRITEHEADER parameters in it
    $request = new Request();
    $request->setUri($url);
    $request->setMethod('POST');
    $client = new Client();
    $adapter = new \Zend\Http\Client\Adapter\Curl();
    $client->setAdapter($adapter);
    $adapter->setOptions(array(
        'curloptions' => array(
        CURLOPT_POST => 1,
        CURLOPT_POSTFIELDS => $data,
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_VERBOSE => 1, 
        CURLOPT_WRITEHEADER => $logfile_fp,
        // Your curl request options here...
        // Your curl request options here...
        // Your curl request options here...
        // Your curl request options here...
        // Your curl request options here...
        )
    ));
    //3. Execute curl request
    $response = $client->dispatch($request);

    //4. Get curl request info
    $handle = $client->getAdapter()->getHandle();
    $request_info = curl_getinfo($handle);

    //5. Write curl request info into log file
    @fwrite($logfile_fp, implode(",", $request_info);
    @fclose($logfile_fp);

说明:

    准备日志文件以将请求详细信息附加到此日志文件中。 准备 curl 请求以在其中包含 CURLOPT_VERBOSE 和 CURLOPT_WRITEHEADER 参数。 执行 curl 请求。 使用 curl_getinfo() 获取 curl 请求信息。 将 curl 请求信息写入日志文件

在此之后,您可以使用 zend 文件阅读器或 fread() 读取日志文件以将其显示在开发人员工具栏上。

除此之外,还有其他第三方解决方法可以使用 netstat 或 tcpdump 或 wireshark 跟踪您的服务器流量,如下所示。

您可以使用 netstat。例如:

$ netstat -nputw
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 192.168.2.48:60614      151.101.65.69:80        ESTABLISHED 2527/chrome     
tcp        0      0 192.168.2.48:58317      198.252.206.25:443      ESTABLISHED 2527/chrome     

阅读netstat's 手册页了解更多详情。

您可以在 apache 之外的服务器上使用 tcpdump 工具来跟踪所有网络流量,例如:

$ tcpdump -vv -s0 tcp port 80 -w /tmp/apache_outgoing.pcap

阅读tcpdump's 手册页了解更多详情。

【讨论】:

【参考方案3】:

如果您使用 Zend_Http_Client,您可以从 CURL-Adapter 类扩展并覆盖 write-method,您可以在其中记录调用,然后再调用其父类的 write-method。

可能是这样的(草稿):

<?php
$adapter = new MY_Zend_Http_Client_Adapter_Curl();
$client = new Zend_Http_Client();
$client->setAdapter($adapter);
$client->request();

class MY_Zend_Http_Client_Adapter_Curl 
    public function write()
    
        // do the logging
        parent.write();
    

在 Zend 2 中应该是类似的。

【讨论】:

这是一个适用于所有使用 Zend Http Client 的模块的解决方案。但是一些库和外部模块正在创建新的 Curl 对象。对于那些我有问题。

以上是关于ZF2 日志 curl 请求的主要内容,如果未能解决你的问题,请参考以下文章

在ZF2中发生404错误“请求的URL无法通过路由匹配”

如何使得 HTTP 请求记录在 Domino 的日志中

记一次curl post请求数据被截断问题处理

Spring RestTemplate - 如何启用请求/响应的完整调试/日志记录?

当我想在zf2客户端代码中使用“application / json”时,接受请求标头是“text / html,application / xhtml ...(etc)”

如果使用 https 连接,则 cURL 为空请求数据