10

私はコードを持っています

    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, 1);        
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
    $ret = curl_exec($ch);
    $responseCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

ここで、ヘッダーなしで$retから本文を抽出したいと思います。それを行う方法はありますか?

4

3 に答える 3

40

raina77owの反応は良いです。コメントから、「爆発」が機能しない原因となるいくつかの条件があるように見えます。私は自分にとってよりうまくいく方法を見つけ、共有したいと思いました。

curl_getinfo($ ch、CURLINFO_HEADER_SIZE)を呼び出すことにより、応答ヘッダーの長さを取得できます。だから私は次のことをしました:

// Original Code
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);        
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
$ret = curl_exec($ch);
$responseCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

// Added Code
$header_len = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($ret, 0, $header_len);
$body = substr($ret, $header_len);

// Back to Original Code
curl_close($ch);

これは私にとってうまく機能しています。それが他の誰かに役立つことを願っています。

于 2014-03-24T21:45:39.340 に答える
21

これはどう:

list($headers, $content) = explode("\r\n\r\n", $ret, 2);

... $ content変数でリクエストの本文を提供する必要がありますか?

于 2012-04-30T13:52:49.213 に答える
3

このスレッドで@Geoffreyの優れた答えを利用して...

このスレッドで提供されている他のソリューションのいくつかは、これを正しく行っていません。

  • オンの場合、またはサーバーが100コードで応答する場合、オンの分割\r\n\r\nは信頼できません。CURLOPT_FOLLOWLOCATION
  • を介してヘッダーのサイズを検出することCURLINFO_HEADER_SIZEも、特にプロキシが使用されている場合、または同じリダイレクトシナリオの一部である場合は、常に信頼できるとは限りません。

ヘッダーを取得する最も信頼できる方法は、を使用することCURLOPT_HEADERFUNCTIONです。その後、あなたは取り除くことができcurl_setopt($ch, CURLOPT_HEADER, 1);、あなたの体はヘッダーなしできれいになります。

これは、PHPクロージャを使用してこれを実行する非常にクリーンな方法です。また、サーバーとHTTPバージョン間で一貫した処理を行うために、すべてのヘッダーを小文字に変換します。

$ch = curl_init();
$headers = [];
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// Run the following function for each header received
// Note: Does NOT handle multiple instances of the same header. Later one will overwrite.
//       Consider handling that scenario if you need it.
curl_setopt($ch, CURLOPT_HEADERFUNCTION, function($curl, $header) use (&$headers) {
    $len = strlen($header);
    $header = explode(':', $header, 2);
    if (count($header) >= 2)
        $headers[strtolower(trim($header[0]))] = trim($header[1]);
    return $len;
});

$data = curl_exec($ch);
print_r($headers);
于 2017-06-09T07:11:43.917 に答える