PHP-调试Curl

PHP-调试Curl,php,debugging,curl,Php,Debugging,Curl,在发送请求之前,我想查看请求中的post字段。(用于调试目的) 我正在使用的PHP库(类)已经制作好了(不是我自己制作的),所以我试图理解它 据我所知,它使用curl\u setopt()来设置不同的选项,如头等等,然后使用curl\u exec()来发送请求 如何查看发送的帖子字段?您可以启用CURLOPT\u VERBOSE选项: curl_setopt($curlhandle, CURLOPT_VERBOSE, true); 设置CURLOPT\u VERBOSE时,输出将写入STDER

在发送请求之前,我想查看请求中的post字段。(用于调试目的)

我正在使用的PHP库(类)已经制作好了(不是我自己制作的),所以我试图理解它

据我所知,它使用
curl\u setopt()
来设置不同的选项,如头等等,然后使用
curl\u exec()
来发送请求


如何查看发送的帖子字段?

您可以启用
CURLOPT\u VERBOSE
选项:

curl_setopt($curlhandle, CURLOPT_VERBOSE, true);
设置
CURLOPT\u VERBOSE
时,输出将写入STDERR或使用
CURLOPT\u STDERR
指定的文件。输出的信息非常丰富


您还可以使用tcpdump或wireshark监视网络流量。

您可以启用
CURLOPT\u VERBOSE
选项,并将该信息记录到(临时)
CURLOPT\u STDERR

// CURLOPT_VERBOSE: TRUE to output verbose information. Writes output to STDERR, 
// or the file specified using CURLOPT_STDERR.
curl_setopt($handle, CURLOPT_VERBOSE, true);

$verbose = fopen('php://temp', 'w+');
curl_setopt($handle, CURLOPT_STDERR, $verbose);
然后,您可以在curl完成请求后读取它:

$result = curl_exec($handle);
if ($result === FALSE) {
    printf("cUrl error (#%d): %s<br>\n", curl_errno($handle),
           htmlspecialchars(curl_error($handle)));
}

rewind($verbose);
$verboseLog = stream_get_contents($verbose);

echo "Verbose information:\n<pre>", htmlspecialchars($verboseLog), "</pre>\n";

下面是一个更简单的代码:

   $fp = fopen(dirname(__FILE__).'/errorlog.txt', 'w');
其中,$fp是输出错误的文件句柄。例如:

curl_setopt($curl, CURLOPT_VERBOSE, true);
curl_setopt($curl, CURLOPT_STDERR, fopen('php://stderr', 'w'));

(继续阅读)

这里有一种更简单的方法,直接写入php错误输出

$response = curl_exec($ch);

$info = curl_getinfo($ch);
var_dump($info);

要仅获取CURL请求的信息,请执行以下操作:

nc -l -p 8000 -w 3 | tee curldbg.txt
另一个(粗略的)选项是利用netcat转储完整请求:

curl_setup(CURLOPT_URL, "http://localhost/testytest");
当然,向它发送失败的请求:

$curlHandler = curl_init();

curl_setopt_array($curlHandler, [
    CURLOPT_URL => 'https://postman-echo.com/get?foo=bar',
    CURLOPT_RETURNTRANSFER => true,

    /**
     * Specify debug option
     */
    CURLOPT_VERBOSE => true,
]);

curl_exec($curlHandler);

curl_close($curlHandler);

值得注意的是,这将总是挂起+失败,因为netcat永远不会构造有效的HTTP响应。这真的只是为了检查真正发送的内容。当然,更好的选择是使用。

将调试信息输出到STDERR:

$curlHandler = curl_init();

curl_setopt_array($curlHandler, [
    CURLOPT_URL => 'https://postman-echo.com/get?foo=bar',
    CURLOPT_RETURNTRANSFER => true,

    /**
     * Specify debug option.
     */
    CURLOPT_VERBOSE => true,

    /**
     * Specify log file.
     * Make sure that the folder is writable.
     */
    CURLOPT_STDERR => fopen('./curl.log', 'w+'),
]);

curl_exec($curlHandler);

curl_close($curlHandler);
将调试信息输出到文件:

$ch = curl_init();
curl_exec($ch);
$curl_error = curl_error($ch);
echo "<script>console.log($curl_error);</script>"

如果您只想快速调试结果,请参见:

$ch=curl_init();
curl_exec($ch);
$curl\u error=curl\u error($ch);
echo“console.log($curl_error);”

另请参见。值得注意的是,如果将
CURLINFO\u HEADER\u OUT
设置为
TRUE
,则此操作将不起作用。据我所知…比工作$info=curl_getinfo($curlhandle);-我自己的评论)fopen选项应该是“w+”@iisisrael:你说得对。更正。感谢您的提示。但是,在开始调试之前:请尝试检查apache日志,以防抛出错误(例如没有安装curl php,因此函数失败!),因为“after”响应curl_getinfo它很好,但是对于格式错误的URL,例如getinfo返回non-info,opt CURLOPTëu VERBOSE是一个更好的例子,我本想使用@Michaël-R的答案,但我在PHP日志中没有得到详细的答案。像这样登录到一个新文件是有效的。
$curlHandler = curl_init();

curl_setopt_array($curlHandler, [
    CURLOPT_URL => 'https://postman-echo.com/get?foo=bar',
    CURLOPT_RETURNTRANSFER => true,

    /**
     * Specify debug option.
     */
    CURLOPT_VERBOSE => true,

    /**
     * Specify log file.
     * Make sure that the folder is writable.
     */
    CURLOPT_STDERR => fopen('./curl.log', 'w+'),
]);

curl_exec($curlHandler);

curl_close($curlHandler);
$ch = curl_init();
curl_exec($ch);
$curl_error = curl_error($ch);
echo "<script>console.log($curl_error);</script>"