Posted 2021-09-14 with tags curl, PHP, PHP output buffer, snippets

//start the output buffer
ob_start();
$out = fopen('php://output', 'w');

$ch = curl_init();

//setting the curl options
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

//increase verbosity of curl output
curl_setopt($ch, CURLOPT_VERBOSE, 1);

//store output in the stream we've initalized
curl_setopt($ch, CURLOPT_STDERR, $out);

//CURLINFO_HEADER_OUT silently causes CURLOPT_VERBOSE to fail
//curl_setopt($ch, CURLINFO_HEADER_OUT, 1); // capture the header info

$output = [];
$output['result'] = curl_exec($ch);
$output['info'] = curl_getinfo($ch);

curl_close($ch);

fclose($out);
$output['debug'] = ob_get_clean();

curl Verbosity Settings Warning

CURLINFO_HEADER_OUT and CURLOPT_VERBOSE options conflict; when CURLINFO_HEADER_OUT is set, CURLOPT_VERBOSE does not work, apparently because CURLINFO_HEADER_OUR uses CURLOPT_VERBOSE internally to obtain the header, and discards the rest of the verbose output according to https://bugs.php.net/bug.php?id=65348.

Since the output of CURLOPT_VERSBOSE contains the header anyway, it's easier to just use that setting alone and you'll get additional request output as well.