PHP CURL 使用 HTTP 2 一次抓取 Header、Body 與分割

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

範例

  1. <?php
  2. $ch = curl_init();
  3. curl_setopt($ch, CURLOPT_URL, $url);
  4. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  5. curl_setopt($ch, CURLOPT_HEADER, true);
  6. curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
  7. curl_setopt($ch, CURLOPT_HTTPHEADER, ['Connection: close']);
  8. $response = curl_exec($ch);
  9. if ($response === false) {
  10. echo 'Curl error: ' . curl_error($ch);
  11. exit;
  12. }
  13. $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
  14. curl_close($ch);
  15. $header = substr($response, 0, $header_size);
  16. $body = substr($response, $header_size);
  17. if (preg_match('/Content-Type:\s([^\s]+)/i', $header, $matches)) // 若有需要抓 Header 的型態的話
  18. $content_type = $matches[1];
  19. echo "\nHeader:\n\n";
  20. echo $header;
  21. echo "\nBody:\n\n";
  22. echo $body;
  23. ?>

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料