PHP 使用 CURL 想要把 Header、Body 一次抓回來,要如何做呢?
PHP CURL 使用 HTTP 2 一次抓取 Header、Body 與分割
PHP CURL 要把 Header 也一起抓下來,需要加這個設定:
- curl_setopt($ch, CURLOPT_HEADER, true);
若需要使用 HTTP/2.0 則可加下述:
- curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0); // 基本上加上這行即可
- curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2TLS); // 這是 HTTP/2.0 + TLS
- curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); // 這是強制使用 HTTP/1.1
若有要抓 HTTP Header 的話,就會需要把 Header 和 Body 切開,會需要下述:
- $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE); // 抓 Header 長度
- $header = substr($response, 0, $header_size); // 切割出 Header
- $body = substr($response, $header_size); // 切割出 Body
範例
<?php $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0); curl_setopt($ch, CURLOPT_HTTPHEADER, ['Connection: close']); $response = curl_exec($ch); if ($response === false) { echo 'Curl error: ' . curl_error($ch); exit; } $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE); curl_close($ch); $header = substr($response, 0, $header_size); $body = substr($response, $header_size); if (preg_match('/Content-Type:\s([^\s]+)/i', $header, $matches)) // 若有需要抓 Header 的型態的話 $content_type = $matches[1]; echo "\nHeader:\n\n"; echo $header; echo "\nBody:\n\n"; echo $body; ?>