PHP cURL สามารถดึงส่วนหัวการตอบสนองและเนื้อหาในคำขอเดียวได้หรือไม่?


314

มีวิธีใดที่จะได้ทั้งส่วนหัวและเนื้อหาสำหรับคำขอ cURL โดยใช้ PHP? ฉันพบว่าตัวเลือกนี้:

curl_setopt($ch, CURLOPT_HEADER, true);

กำลังจะส่งคืนร่างกายพร้อมส่วนหัวแต่จากนั้นฉันต้องแยกวิเคราะห์เพื่อให้ได้ร่างกาย มีวิธีใดบ้างที่จะนำทั้งสองอย่างมาใช้ (และปลอดภัย) ได้มากกว่าเดิม?

โปรดทราบว่าสำหรับ "คำขอเดียว" ฉันหมายถึงการหลีกเลี่ยงการออกคำขอ HEAD ก่อน GET / POST


3
มีวิธีแก้ปัญหาในตัวนี้ให้ดูคำตอบนี้: stackoverflow.com/a/25118032/1334485 (เพิ่มความคิดเห็นนี้ 'coz โพสต์นี้ยังคงได้รับมุมมองมากมาย)
Skacc

ดูความคิดเห็นที่ดีนี้: secure.php.net/manual/en/book.curl.php#117138
user956584


ฉันบอกว่าคำถามของฉันซ้ำกับคำถามนี้ ถ้าไม่ใช่คนที่ซ้ำกันได้โปรดเปิดใหม่อีกครั้ง? stackoverflow.com/questions/43770246/…ในคำถามของฉันฉันมีข้อกำหนดที่เป็นรูปธรรมในการใช้วิธีการส่งคืนวัตถุที่มีส่วนหัวและลำตัวแยกจากกันไม่ใช่สายเดียว
1.21 gigawatts

คำตอบ:


466

วิธีแก้ปัญหานี้ถูกโพสต์ในความคิดเห็นเอกสาร PHP: http://www.php.net/manual/en/function.curl-exec.php#80442

ตัวอย่างรหัส:

$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
// ...

$response = curl_exec($ch);

// Then, after your curl_exec call:
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$body = substr($response, $header_size);

คำเตือน: ดังที่ระบุไว้ในความคิดเห็นด้านล่างสิ่งนี้อาจไม่น่าเชื่อถือเมื่อใช้กับพร็อกซีเซิร์ฟเวอร์หรือเมื่อจัดการการเปลี่ยนเส้นทางบางประเภท @ คำตอบของ Geoffrey อาจจัดการกับสิ่งเหล่านี้ได้อย่างน่าเชื่อถือ


22
คุณสามารถทำได้เช่นlist($header, $body) = explode("\r\n\r\n", $response, 2)กัน แต่อาจใช้เวลานานกว่านี้เล็กน้อยขึ้นอยู่กับขนาดคำขอของคุณ
iblue

43
นี้เป็นวิธีการแก้ที่ไม่ดีเพราะถ้าคุณใช้พร็อกซีเซิร์ฟเวอร์และเซิร์ฟเวอร์พร็อกซี (ไวโอลินตัวอย่าง) เพิ่มส่วนหัวตัวเองเพื่อตอบสนอง - ส่วนหัวนี้ยากจนชดเชยทั้งหมดและคุณควรใช้ list($header, $body) = explode("\r\n\r\n", $response, 2)เป็นเพียงตัวแปรทำงาน
msangel

5
@msangel โซลูชันของคุณไม่ทำงานเมื่อมีหลายส่วนหัวในการตอบกลับเช่นเมื่อเซิร์ฟเวอร์เปลี่ยนเส้นทาง 302 ข้อเสนอแนะใด ๆ
เนท

4
@ เนทใช่ฉันรู้เรื่องนี้ AFAIK แต่มีเพียงสองส่วนหัวเพิ่มเติมที่เป็นไปได้ - ด้วยรหัส100(ดำเนินการต่อ) สำหรับส่วนหัวนี้คุณสามารถไปรอบ ๆ ด้วยการกำหนดตัวเลือกคำขออย่างถูกต้อง: curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:')); ปิดการใช้งานการส่งการตอบสนองส่วนหัวนี้ สำหรับ302สิ่งนี้ไม่ควรเกิดขึ้นเนื่องจากมีการเปลี่ยนเส้นทางส่วนหัว 302 ไม่คาดว่าจะมีเนื้อหา แต่ฉันรู้ว่าบางครั้งเซิร์ฟเวอร์ส่งเนื้อหาบางส่วนพร้อมกับ302การตอบกลับ แต่เบราว์เซอร์จะถูกละเว้นไปแล้ว )
msangel

5
CURLOPT_VERBOSEมีวัตถุประสงค์เพื่อส่งออกข้อมูลกระบวนการไปยังSTDERR(อาจรบกวนใน CLI) และสำหรับปัญหาที่กล่าวถึงนั้นไม่มีประโยชน์
hejdav

205

โซลูชันอื่น ๆ จำนวนมากที่นำเสนอเธรดนี้ทำงานไม่ถูกต้อง

  • การแยกเปิด\r\n\r\nไม่น่าเชื่อถือเมื่อCURLOPT_FOLLOWLOCATIONเปิดหรือเมื่อเซิร์ฟเวอร์ตอบสนองด้วยรหัส 100
  • ไม่ใช่เซิร์ฟเวอร์ทุกเครื่องที่เป็นไปตามมาตรฐานและส่งผ่านไปยัง\nบรรทัดใหม่
  • การตรวจจับขนาดของส่วนหัวผ่านCURLINFO_HEADER_SIZEยังไม่น่าเชื่อถือเสมอไปโดยเฉพาะอย่างยิ่งเมื่อมีการใช้พร็อกซีหรือในบางสถานการณ์การเปลี่ยนเส้นทางเดียวกัน

CURLOPT_HEADERFUNCTIONวิธีที่ถูกต้องที่สุดคือการใช้

นี่เป็นวิธีที่สะอาดมากในการแสดงโดยใช้การปิด PHP นอกจากนี้ยังแปลงส่วนหัวทั้งหมดเป็นตัวพิมพ์เล็กสำหรับการจัดการที่สอดคล้องกันในเซิร์ฟเวอร์และรุ่น HTTP

รุ่นนี้จะรักษาส่วนหัวที่ซ้ำกัน

เป็นไปตาม RFC822 และ RFC2616 โปรดอย่าแนะนำให้ทำการแก้ไขเพื่อใช้ประโยชน์จากmb_ฟังก์ชั่นสตริงมันไม่ถูกต้อง!

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

// this function is called by curl for each header received
curl_setopt($ch, CURLOPT_HEADERFUNCTION,
  function($curl, $header) use (&$headers)
  {
    $len = strlen($header);
    $header = explode(':', $header, 2);
    if (count($header) < 2) // ignore invalid headers
      return $len;

    $headers[strtolower(trim($header[0]))][] = trim($header[1]);

    return $len;
  }
);

$data = curl_exec($ch);
print_r($headers);

12
IMO นี่เป็นคำตอบที่ดีที่สุดในเธรดนี้และแก้ไขปัญหาการเปลี่ยนเส้นทางที่เกิดขึ้นกับคำตอบอื่น ๆ ที่ดีที่สุดในการอ่านเอกสารสำหรับCURLOPT_HEADERFUNCTIONเพื่อทำความเข้าใจวิธีการทำงานและ gotchas ที่เป็นไปได้ ฉันได้ปรับปรุงคำตอบเพื่อช่วยผู้อื่น
Simon East

เยี่ยมมากฉันได้อัปเดตคำตอบเพื่อรองรับส่วนหัวที่ซ้ำกัน ในอนาคตอย่าฟอร์แมตโค้ดใหม่ตามที่คุณเชื่อว่าควรเป็น สิ่งนี้ถูกเขียนขึ้นในลักษณะที่จะทำให้ชัดเจนว่าขอบเขตของฟังก์ชันการปิดอยู่ที่ใด
Geoffrey

@Geoffrey เป็น$headers = [];php ที่ถูกต้องหรือไม่
thealexbaron

6
@thealexbaron ใช่มันเป็นของ PHP 5.4 ดู: php.net/manual/en/migration54.new-features.php
Geoffrey

4
คำตอบนี้มีการประเมินค่าต่ำมากสำหรับวิธีการที่เป็นไปตามระเบียบและ RFC ควรทำคำตอบที่เหนียวและย้ายไปด้านบน ฉันแค่หวังว่าจะมีวิธีที่เร็วกว่าในการรับค่าของส่วนหัวที่ต้องการแทนที่จะแยกส่วนหัวทั้งหมดก่อน
Fr0zenFyr

114

Curl มีตัวเลือกในตัวสำหรับสิ่งนี้เรียกว่า CURLOPT_HEADERFUNCTION ค่าของตัวเลือกนี้จะต้องเป็นชื่อของฟังก์ชั่นการโทรกลับ Curl จะส่งผ่านส่วนหัว (และส่วนหัวเท่านั้น!) ไปยังฟังก์ชันการเรียกกลับนี้บรรทัดต่อบรรทัด (ดังนั้นฟังก์ชันจะถูกเรียกสำหรับแต่ละบรรทัดส่วนหัวโดยเริ่มจากด้านบนของส่วนหัว) ฟังก์ชั่นการโทรกลับของคุณสามารถทำอะไรกับมันได้ (และต้องคืนจำนวนไบต์ของบรรทัดที่กำหนด) นี่คือรหัสการทำงานที่ทดสอบแล้ว:

function HandleHeaderLine( $curl, $header_line ) {
    echo "<br>YEAH: ".$header_line; // or do whatever
    return strlen($header_line);
}


$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.google.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADERFUNCTION, "HandleHeaderLine");
$body = curl_exec($ch); 

ด้านบนใช้ได้กับทุกอย่างโปรโตคอลและพรอกซีต่างกันด้วยและคุณไม่จำเป็นต้องกังวลเกี่ยวกับขนาดส่วนหัวหรือตั้งค่าตัวเลือก curl ที่แตกต่างกันมากมาย

PS: การจัดการบรรทัดหัวข้อด้วยวิธีการวัตถุทำสิ่งนี้:

curl_setopt($ch, CURLOPT_HEADERFUNCTION, array(&$object, 'methodName'))

หมายเหตุฟังก์ชั่นการโทรกลับถูกเรียกสำหรับแต่ละส่วนหัวและดูเหมือนว่าพวกเขาจะไม่ถูกตัดแต่ง คุณสามารถใช้ตัวแปรส่วนกลางเพื่อเก็บส่วนหัวทั้งหมดหรือคุณสามารถใช้ฟังก์ชั่นที่ไม่ระบุชื่อสำหรับการโทรกลับและใช้ตัวแปรท้องถิ่น (ท้องถิ่นสำหรับขอบเขตหลักไม่ใช่ฟังก์ชั่นที่ไม่ระบุชื่อ)
MV

2
@MV ขอบคุณใช่โดย "ทีละบรรทัด" ฉันหมายถึง "แต่ละหัวข้อ" ฉันแก้ไขคำตอบเพื่อความชัดเจน ในการรับส่วนหัวทั้งหมด (หรือส่วนหัวทั้งหมด) คุณสามารถใช้วิธีการวัตถุสำหรับการโทรกลับเพื่อให้คุณสมบัติวัตถุสามารถเก็บไว้ได้ทั้งหมด
Skacc

8
นี่คือคำตอบที่ดีที่สุด IMO มันไม่ได้ทำให้เกิดปัญหากับหลาย ๆ "\ r \ n \ r \ n" เมื่อใช้ CURLOPT_FOLLOWLOCATION และฉันคิดว่ามันจะไม่ได้รับผลกระทบจากส่วนหัวเพิ่มเติมจากพร็อกซี
Rafał G.

ทำงานได้ดีมากสำหรับฉันโปรดดูstackoverflow.com/questions/6482068//ในกรณีที่มีปัญหา
RHH

1
ใช่นี่เป็นวิธีที่ดีที่สุด แต่คำตอบของ @ Geoffrey ทำให้เครื่องนี้สะอาดขึ้นโดยใช้ฟังก์ชั่นนิรนามโดยไม่จำเป็นต้องใช้ตัวแปรทั่วโลก
Simon East

39

นี่คือสิ่งที่คุณกำลังมองหา?

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
$response = curl_exec($ch); 
list($header, $body) = explode("\r\n\r\n", $response, 2);

8
ทำงานได้ตามปกติยกเว้นเมื่อมี HTTP / 1.1 100 ดำเนินการต่อตามด้วยตัวแบ่งแล้ว HTTP / 1.1 200 ตกลง ฉันจะไปด้วยวิธีอื่น
ghostfly

1
ลองดูคำตอบที่เลือกไว้ของstackoverflow.com/questions/14459704/…ก่อนดำเนินการบางอย่างเช่นนี้ w3.org/Protocols/rfc2616/rfc2616-sec14.html (14.20) A server that does not understand or is unable to comply with any of the expectation values in the Expect field of a request MUST respond with appropriate error status. The server MUST respond with a 417 (Expectation Failed) status if any of the expectations cannot be met or, if there are other problems with the request, some other 4xx status.
Alrik


วิธีนี้ยังล้มเหลวในการเปลี่ยนเส้นทาง 302 เมื่อตั้งค่า curl ให้ทำตามส่วนหัวของตำแหน่ง
Simon East

10

เพียงตั้งค่าตัวเลือก:

  • CURLOPT_HEADER, 0

  • CURLOPT_RETURNTRANSFER, 1

และใช้ curl_getinfo กับ CURLINFO_HTTP_CODE (หรือไม่เลือก opt และคุณจะมีอาร์เรย์ที่เชื่อมโยงกับข้อมูลทั้งหมดที่คุณต้องการ)

เพิ่มเติมได้ที่: http://php.net/manual/fr/function.curl-getinfo.php


5
ดูเหมือนจะไม่ส่งคืนส่วนหัวการตอบกลับให้คุณเลย curl_getinfo()หรืออย่างน้อยก็มีวิธีที่จะดึงพวกเขาใช้ไม่มี
Simon East

8

หากคุณต้องการเฉพาะContent-Typeมีตัวเลือก cURL พิเศษเพื่อดึงมัน:

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
$content_type = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);

OP ถามว่ามีวิธีในการดึงส่วนหัวไม่ใช่ส่วนหัวที่เฉพาะเจาะจงหรือไม่ไม่ตอบคำถามของ OP
เจฟฟรีย์

2
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);

$parts = explode("\r\n\r\nHTTP/", $response);
$parts = (count($parts) > 1 ? 'HTTP/' : '').array_pop($parts);
list($headers, $body) = explode("\r\n\r\n", $parts, 2);

ทำงานร่วมกับHTTP/1.1 100 Continueก่อนส่วนหัวอื่น ๆ

หากคุณต้องการทำงานกับเซิร์ฟเวอร์ buggy ซึ่งส่งเฉพาะ LF แทน CRLF เนื่องจากตัวแบ่งบรรทัดคุณสามารถใช้preg_splitดังนี้:

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);

$parts = preg_split("@\r?\n\r?\nHTTP/@u", $response);
$parts = (count($parts) > 1 ? 'HTTP/' : '').array_pop($parts);
list($headers, $body) = preg_split("@\r?\n\r?\n@u", $parts, 2);

ไม่ควร$parts = explode("\r\n\r\nHTTP/", $response);มีพารามิเตอร์ที่ 3 สำหรับการระเบิดเป็น 2 ใช่ไหม
user4271704

@ user4271704 ไม่อนุญาตให้ค้นหาข้อความ HTTP ล่าสุด HTTP/1.1 100 Continueสามารถปรากฏได้หลายครั้ง
Enyby

แต่เขาพูดอย่างอื่น: stackoverflow.com/questions/9183178/…คุณคนไหนที่ถูกต้อง?
user4271704

HTTP/1.1 100 Continueสามารถปรากฏได้หลายครั้ง เขาดูเคสถ้ามันปรากฏเพียงครั้งเดียว แต่มันผิดในกรณีทั่วไป ตัวอย่างเช่นHTTP/1.1 100 Continue\r\n\r\nHTTP/1.1 100 Continue\r\n\r\nHTTP/1.1 200 OK...\r\n\r\n...รหัสของเขาทำงานไม่ถูกต้อง
Enyby

1
การแยกบน \ r \ n ไม่น่าเชื่อถือบางเซิร์ฟเวอร์ไม่สอดคล้องกับข้อกำหนดของ HTTP และจะส่ง \ n เท่านั้น มาตรฐาน RFC ระบุว่าแอปพลิเคชันควรละเว้น \ r และแยกบน \ n เพื่อความน่าเชื่อถือสูงสุด
Geoffrey

1

ทางของฉันคือ

$response = curl_exec($ch);
$x = explode("\r\n\r\n", $v, 3);
$header=http_parse_headers($x[0]);
if ($header=['Response Code']==100){ //use the other "header"
    $header=http_parse_headers($x[1]);
    $body=$x[2];
}else{
    $body=$x[1];
}

หากจำเป็นต้องใช้สำหรับวงและลบขีด จำกัด การระเบิด


1

นี่คือการมีส่วนร่วมในการอภิปรายของฉัน ... นี่จะส่งคืนอาร์เรย์เดียวโดยแยกข้อมูลและส่วนหัวที่ระบุไว้ สิ่งนี้ทำงานบนพื้นฐานที่ CURL จะส่งคืนข้อมูลส่วนหัว [บรรทัดว่าง]

curl_setopt($ch, CURLOPT_HEADER, 1); // we need this to get headers back
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_VERBOSE, true);

// $output contains the output string
$output = curl_exec($ch);

$lines = explode("\n",$output);

$out = array();
$headers = true;

foreach ($lines as $l){
    $l = trim($l);

    if ($headers && !empty($l)){
        if (strpos($l,'HTTP') !== false){
            $p = explode(' ',$l);
            $out['Headers']['Status'] = trim($p[1]);
        } else {
            $p = explode(':',$l);
            $out['Headers'][$p[0]] = trim($p[1]);
        }
    } elseif (!empty($l)) {
        $out['Data'] = $l;
    }

    if (empty($l)){
        $headers = false;
    }
}

0

ปัญหาของคำตอบมากมายที่นี่คือ"\r\n\r\n"สามารถปรากฏอย่างถูกต้องในเนื้อหาของ html ได้ดังนั้นคุณไม่สามารถแน่ใจได้ว่าคุณแยกส่วนหัวได้อย่างถูกต้อง

ดูเหมือนว่าวิธีเดียวที่จะจัดเก็บส่วนหัวแยกจากกันด้วยการโทรเพียงครั้งเดียวcurl_execคือการใช้การโทรกลับตามที่แนะนำข้างต้นในhttps://stackoverflow.com/a/25118032/3326494

จากนั้นเมื่อต้องการรับเนื้อหาของคำขอคุณจะต้องส่งค่าของContent-Lengthส่วนหัวsubstr()เป็นค่าเริ่มต้นเชิงลบ


1
สามารถปรากฏได้อย่างถูกต้อง แต่คำตอบของคุณไม่ถูกต้อง ไม่จำเป็นต้องมีความยาวเนื้อหาในการตอบกลับ HTTP วิธีที่ถูกต้องในการแยกวิเคราะห์ส่วนหัวด้วยตนเองคือการค้นหาอินสแตนซ์แรกของ \ r \ n (หรือ \ n \ n) นี้สามารถทำได้ง่ายๆโดยการ จำกัด การระเบิดที่จะกลับมาเพียงสององค์ประกอบเช่น: list($head, $body) = explode("\r\n\r\n", $response, 2);แต่ CURL แล้วนี้ไม่ได้สำหรับคุณถ้าคุณใช้curl_setopt($ch, CURLOPT_HEADERFUNCTION, $myFunction);
เจฟฟรีย์

-1

ในกรณีที่คุณไม่สามารถ / ไม่ใช้CURLOPT_HEADERFUNCTIONหรือแก้ไขปัญหาอื่น ๆ

$nextCheck = function($body) {
    return ($body && strpos($body, 'HTTP/') === 0);
};

[$headers, $body] = explode("\r\n\r\n", $result, 2);
if ($nextCheck($body)) {
    do {
        [$headers, $body] = explode("\r\n\r\n", $body, 2);
    } while ($nextCheck($body));
}

-2

ส่งคืนส่วนหัวการตอบกลับพร้อมพารามิเตอร์อ้างอิง:

<?php
$data=array('device_token'=>'5641c5b10751c49c07ceb4',
            'content'=>'测试测试test'
           );
$rtn=curl_to_host('POST', 'http://test.com/send_by_device_token', array(), $data, $resp_headers);
echo $rtn;
var_export($resp_headers);

function curl_to_host($method, $url, $headers, $data, &$resp_headers)
         {$ch=curl_init($url);
          curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $GLOBALS['POST_TO_HOST.LINE_TIMEOUT']?$GLOBALS['POST_TO_HOST.LINE_TIMEOUT']:5);
          curl_setopt($ch, CURLOPT_TIMEOUT, $GLOBALS['POST_TO_HOST.TOTAL_TIMEOUT']?$GLOBALS['POST_TO_HOST.TOTAL_TIMEOUT']:20);
          curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
          curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
          curl_setopt($ch, CURLOPT_HEADER, 1);

          if ($method=='POST')
             {curl_setopt($ch, CURLOPT_POST, true);
              curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
             }
          foreach ($headers as $k=>$v)
                  {$headers[$k]=str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', $k)))).': '.$v;
                  }
          curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
          $rtn=curl_exec($ch);
          curl_close($ch);

          $rtn=explode("\r\n\r\nHTTP/", $rtn, 2);    //to deal with "HTTP/1.1 100 Continue\r\n\r\nHTTP/1.1 200 OK...\r\n\r\n..." header
          $rtn=(count($rtn)>1 ? 'HTTP/' : '').array_pop($rtn);
          list($str_resp_headers, $rtn)=explode("\r\n\r\n", $rtn, 2);

          $str_resp_headers=explode("\r\n", $str_resp_headers);
          array_shift($str_resp_headers);    //get rid of "HTTP/1.1 200 OK"
          $resp_headers=array();
          foreach ($str_resp_headers as $k=>$v)
                  {$v=explode(': ', $v, 2);
                   $resp_headers[$v[0]]=$v[1];
                  }

          return $rtn;
         }
?>

คุณแน่ใจว่า$rtn=explode("\r\n\r\nHTTP/", $rtn, 2);ถูกต้องหรือไม่ ไม่ควรลบพารามิเตอร์ที่ 3 ของการระเบิดออกหรือ
user4271704

@ user4271704 พารามิเตอร์ที่ 3 คือการจัดการกับ "HTTP / 1.1 100 ดำเนินการต่อ \ r \ n \ r \ nHTTP / 1.1 200 ตกลง ... \ r \ n \ r \ n ... " ส่วนหัว
diyism

แต่เขาพูดอย่างอื่น: stackoverflow.com/questions/9183178/…คุณคนไหนที่ถูกต้อง?
user4271704

@ user4271704 ลิงก์ที่คุณอ้างถึงใช้ด้วย: explode("\r\n\r\n", $parts, 2); ดังนั้นทั้งคู่จึงถูกต้อง
Cyborg

-5

หากคุณไม่จำเป็นต้องใช้ขด

$body = file_get_contents('http://example.com');
var_export($http_response_header);
var_export($body);

ซึ่งเอาท์พุท

array (
  0 => 'HTTP/1.0 200 OK',
  1 => 'Accept-Ranges: bytes',
  2 => 'Cache-Control: max-age=604800',
  3 => 'Content-Type: text/html',
  4 => 'Date: Tue, 24 Feb 2015 20:37:13 GMT',
  5 => 'Etag: "359670651"',
  6 => 'Expires: Tue, 03 Mar 2015 20:37:13 GMT',
  7 => 'Last-Modified: Fri, 09 Aug 2013 23:54:35 GMT',
  8 => 'Server: ECS (cpm/F9D5)',
  9 => 'X-Cache: HIT',
  10 => 'x-ec-custom-error: 1',
  11 => 'Content-Length: 1270',
  12 => 'Connection: close',
)'<!doctype html>
<html>
<head>
    <title>Example Domain</title>...

ดูhttp://php.net/manual/th/reserved.variables.httpresponseheader.php


16
อืมคุณไม่ต้องการ PHP จริง ๆ แต่นั่นก็เป็นคำถามที่เกี่ยวกับ ...
Hans Z.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.