ZF2日志卷曲请求

时间:2016-11-01 07:28:02

标签: php curl zend-framework2

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

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

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

您可以捕获zf2应用程序在执行过程中发出的所有curl请求,并使用CURLOPT_VERBOSE将其记录下来,并使用CURLOPT_WRITEHEADER或curl_getinfo()将其写入一个日志文件,然后将其读取以便像这样在ZF Developer Toolbar上显示。

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

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);
}

解释:

  1. 准备日志文件以将请求详细信息附加到此日志文件中。
  2. 准备卷曲请求以包含CURLOPT_VERBOSE和CURLOPT_WRITEHEADER参数。
  3. 执行curl请求。
  4. 使用curl_getinfo()获取curl请求信息。
  5. 将curl请求信息写入日志文件
  6. 在此之后,您可以使用zend文件阅读器或fread()读取日志文件,以便在开发人员工具栏上显示它。

    OR

    除此之外,还有其他第三方解决方法,它将使用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手册页以获取更多详细信息。

    OR

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

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

    阅读tcpdump's手册页以获取更多详细信息。

答案 2 :(得分:1)

如果您正在使用Zend_Http_Client,您可以从CURL-Adapter类扩展并覆盖write-method,您可以在调用其父类的write方法之前记录该调用。

可能是这样的(草稿):

<?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中,它应该是相似的。