পিএইচপি সিআরএল একক অনুরোধে প্রতিক্রিয়া শিরোনাম এবং বডি পুনরুদ্ধার করতে পারে?


314

পিএইচপি ব্যবহার করে সিআরএল অনুরোধের জন্য উভয় শিরোলেখ পেতে কোনও উপায় আছে কি? আমি এই বিকল্পটি খুঁজে পেয়েছি:

curl_setopt($ch, CURLOPT_HEADER, true);

শরীরে প্লাস শিরোনামগুলি ফিরিয়ে আনতে চলেছে , তবে তারপরে আমাকে শরীরটি পেতে পার্স করা দরকার। উভয়কে আরও ব্যবহারযোগ্য (এবং সুরক্ষিত) উপায়ে পাওয়ার কোনও উপায় আছে কি?

মনে রাখবেন যে "একক অনুরোধ" এর জন্য আমার অর্থ জিইটি / পোষ্টের আগে হেড অনুরোধ জারি করা এড়ানো উচিত।


3
এর জন্য একটি বিল্ট ইন সমাধান রয়েছে, দেখুন এই উত্তরটি দেখুন: stackoverflow.com/a/25118032/1334485 (এই মন্তব্য যুক্ত করেছেন 'কোজ এই পোস্টটি এখনও অনেক ভিউ
পেয়েছে

এই দুর্দান্ত মন্তব্যটি দেখুন: নিরাপদ.পিপিএন
ম্যানুয়াল


আমাকে বলা হয়েছিল আমার প্রশ্নটি এই প্রশ্নের সদৃশ। যদি এটি সদৃশ না হয় তবে কেউ দয়া করে এটি আবার খুলতে পারেন? stackoverflow.com/questions/43770246/… আমার প্রশ্নে আমার এমন একটি পদ্ধতি ব্যবহার করার একটি দৃ concrete প্রয়োজনীয়তা রয়েছে যা শিরোনাম এবং শরীরে পৃথক পৃথক এবং একটি স্ট্রিং নয় এমন একটি বস্তু ফেরত দেয়।
1.21 গিগাওয়াটস

উত্তর:


466

এর একটি সমাধান পিএইচপি ডকুমেন্টেশন মন্তব্যগুলিতে পোস্ট করা হয়েছিল: 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);

সতর্কতা: নীচের মন্তব্যে উল্লিখিত হিসাবে, প্রক্সি সার্ভারের সাথে ব্যবহার করার সময় বা নির্দিষ্ট ধরণের পুনর্নির্দেশগুলি পরিচালনা করার সময় এটি নির্ভরযোগ্য হতে পারে না। @ জেফ্রির উত্তর এগুলি আরও নির্ভরযোগ্যভাবে পরিচালনা করতে পারে।


22
আপনি এটি করতে পারেন list($header, $body) = explode("\r\n\r\n", $response, 2), তবে এটি আপনার অনুরোধের আকারের উপর নির্ভর করে কিছুটা বেশি সময় নিতে পারে।
ইবলু

43
এটি খারাপ সমাধান কারণ আপনি যদি প্রক্সি সার্ভার এবং আপনার প্রক্সি সার্ভার ব্যবহার করেন (উদাহরণস্বরূপ ফিজার) প্রতিক্রিয়াতে নিজের শিরোনাম যুক্ত করে - এই শিরোনামগুলি সমস্ত অফসেট ভেঙে list($header, $body) = explode("\r\n\r\n", $response, 2)
ফেলেছে

5
@ এমএসএনজেল যখন প্রতিক্রিয়াতে একাধিক শিরোনাম উপস্থিত থাকে তখন আপনার সমাধান কাজ করে না যেমন সার্ভার যখন 302 পুনঃনির্দেশ করে। কোন পরামর্শ?
নোট

4
@ নাট, হ্যাঁ, আমি এটি জানি। আফাইক, তবে কেবলমাত্র একটি সম্ভাব্য অতিরিক্ত শিরোনাম রয়েছে - কোড সহ 100(চালিয়ে যাওয়া)। এই শিরোলেখের জন্য আপনি অনুরোধ বিকল্পটি সঠিকভাবে সংজ্ঞায়িত করতে পারেন: curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:')); এই শিরোনামের প্রতিক্রিয়াটি পাঠানো অক্ষম করে। হিসাবে 302, এটি হওয়া উচিত নয়, কারণ 302 শিরোলেখ পুনর্নির্দেশ করা হয়েছে, এটি শরীরের প্রত্যাশা করে না, তবে আমি জানি, কখনও কখনও সার্ভারগুলি 302প্রতিক্রিয়া সহ কিছু শরীর প্রেরণ করে , তবে এটি এখনও ব্রাউজার দ্বারা উপেক্ষা করা হবে, কেন এখনও কার্ল এটি পরিচালনা করবে? )
মিসানজেল

5
CURLOPT_VERBOSEপ্রক্রিয়া সম্পর্কিত তথ্য STDERR(সিএলআইতে বিরক্ত করতে পারে) এ আউটপুট দেওয়ার উদ্দেশ্যে এবং আলোচিত সমস্যার জন্য অকেজো।
হিজদাভ

205

এই থ্রেড দেওয়া অন্যান্য সমাধানের মধ্যে অনেক হয় না এই সঠিকভাবে করছেন।

  • সার্ভারটি যখন 100 কোড দিয়ে প্রতিক্রিয়া জানায় তখন স্প্লিটিং অন \r\n\r\nনির্ভরযোগ্য নয় CURLOPT_FOLLOWLOCATION
  • সমস্ত সার্ভার মান সম্মত হয় না এবং \nনতুন লাইনের জন্য কেবল একটি প্রেরণ করে।
  • এর মাধ্যমে শিরোনামগুলির আকার সনাক্তকরণও CURLINFO_HEADER_SIZEসর্বদা নির্ভরযোগ্য নয়, বিশেষত যখন প্রক্সিগুলি ব্যবহৃত হয় বা একই সাথে পুনর্নির্দেশের কিছু পরিস্থিতিতে হয়।

সবচেয়ে সঠিক পদ্ধতি ব্যবহার করা হয় CURLOPT_HEADERFUNCTION

এখানে পিএইচপি ক্লোজারগুলি ব্যবহার করে এটি সম্পাদন করার একটি খুব পরিষ্কার পদ্ধতি is এটি সার্ভার এবং HTTP সংস্করণগুলিতে ধারাবাহিকভাবে পরিচালনা করার জন্য সমস্ত শিরোলেখকে ছোট হাতের কাছে রূপান্তর করে।

এই সংস্করণটি সদৃশ শিরোনাম ধরে রাখবে

এটি আরএফসি 822 এবং আরএফসি 2616 এর সাথে সম্মতি দেয়, দয়া করে 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
আইএমও এটি এই থ্রেডের সেরা উত্তর এবং অন্যান্য উত্তরের সাথে পুনঃনির্দেশগুলির সাথে সমস্যার সমাধান করে। এটি কীভাবে কাজ করে এবং সম্ভাব্য গোটাচাগুলি বোঝার জন্য CURLOPT_HEADERFUNCTION এর জন্য ডকুমেন্টেশন পড়ার পক্ষে সেরা । আমি অন্যকে সাহায্য করার জন্য উত্তরে কিছু উন্নতি করেছি।
সাইমন পূর্ব

দুর্দান্ত, আমি সদৃশ শিরোনামগুলির জন্য উত্তরটি আপডেট করেছি। ভবিষ্যতে কোডটি কী হওয়া উচিত বলে আপনার বিশ্বাস কোডটি পুনরায় ফর্ম্যাট করবেন না। ক্লোজার ফাংশন সীমানা কোথায় তা স্পষ্ট করার জন্য এটি এমনভাবে লেখা হয়েছে।
জেফ্রি

@ জিফ্রে কি $headers = [];পিএইচপি বৈধ?
thealexbaron

6
@ থিয়েলেক্সবারন হ্যাঁ এটি পিএইচপি ৫.৪ অনুসারে রয়েছে, দেখুন: পিএইচপিএন
জেফ্রি

4
এই উত্তরটি এমন পরিষ্কার এবং আরএফসি অনুগত পদ্ধতির জন্য অত্যন্ত আন্ডাররেটেড। এটি স্টিকি উত্তর তৈরি করা উচিত এবং শীর্ষে সরানো উচিত। আমি কেবল চাই যে সমস্ত শিরোনামকে আগে বিশ্লেষণ না করে পছন্দসই শিরোনামটির মান পেতে একটি দ্রুত পদ্ধতির উপস্থিতি রয়েছে।
Fr0zenFyr

114

এর জন্য কার্লের একটি বিল্ট ইন বিকল্প রয়েছে, যাকে CURLOPT_HEADERFUNCTION বলে। এই বিকল্পটির মান অবশ্যই একটি কলব্যাক ফাংশনের নাম হতে হবে। কার্ল এই কলব্যাক ফাংশনে শিরোনামটি (এবং কেবলমাত্র শিরোনাম!) পাস করবে, লাইন বাই লাইন (সুতরাং ফাংশনটি প্রতিটি শিরোনাম লাইনের জন্য কল করা হবে, শিরোনাম বিভাগের শীর্ষ থেকে শুরু করে)। আপনার কলব্যাক ফাংশন এর পরে এটি দিয়ে যে কোনও কিছু করতে পারে (এবং অবশ্যই প্রদত্ত লাইনের বাইটের সংখ্যাটি ফিরিয়ে দিতে হবে)। এখানে একটি পরীক্ষিত ওয়ার্কিং কোড দেওয়া হয়েছে:

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); 

উপরেরগুলি সমস্ত কিছু, বিভিন্ন প্রোটোকল এবং প্রক্সিগুলির সাথেও কাজ করে এবং আপনাকে শিরোনামের আকার সম্পর্কে চিন্তা করতে বা বিভিন্ন কার্ল বিকল্পগুলি সেট করার দরকার নেই।

PS: একটি অবজেক্ট পদ্ধতিতে শিরোলেখ লাইনগুলি পরিচালনা করতে, এটি করুন:

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

একটি নোট হিসাবে, কলব্যাক ফাংশন প্রতিটি শিরোনামের জন্য কল করা হয় এবং মনে হয় তারা ছাঁটা হয়নি। আপনি সমস্ত শিরোলেখ ধরে রাখতে একটি বিশ্বব্যাপী পরিবর্তনশীল ব্যবহার করতে পারেন বা আপনি কলব্যাকের জন্য একটি বেনামি ফাংশন ব্যবহার করতে পারেন এবং একটি স্থানীয় ভেরিয়েবল ব্যবহার করতে পারেন (প্যারেন্ট স্কোপের জন্য স্থানীয়, বেনামে ফাংশন নয়)।
এমভি

2
@ এমভি ধন্যবাদ, হ্যাঁ, "লাইন বাই লাইন" দ্বারা আমি "প্রতিটি শিরোনাম" বোঝাতে চাইছি। আমি আমার উত্তরটি স্বচ্ছতার জন্য সম্পাদনা করেছি। পুরো শিরোনাম বিভাগটি (যেমন। সমস্ত শিরোনাম) পেতে, আপনি কলব্যাকের জন্য কোনও অবজেক্ট পদ্ধতিও ব্যবহার করতে পারেন যাতে কোনও বস্তুর সম্পত্তি তাদের সমস্তকে ধরে রাখতে পারে।
Skacc

8
এটি সেরা উত্তর আইএমও। এটি CURLOPT_FOLLOWLOCATION ব্যবহার করার সময় একাধিক "\ r \ n \ r \ n" নিয়ে সমস্যা সৃষ্টি করে না এবং আমার ধারণা এটি প্রক্সির অতিরিক্ত শিরোনাম দ্বারা প্রভাবিত হবে না।
রাফাł জি।

আমার জন্য খুব ভাল কাজ, তাও দেখতে stackoverflow.com/questions/6482068/... বিষয় ক্ষেত্রে
RHH

1
হ্যাঁ, তবে এটিই সর্বোত্তম পন্থা @ জিওফ্রির উত্তর গ্লোবাল ভেরিয়েবল এবং এর মতো কোনও প্রয়োজন নেই এমন একটি বেনামি ফাংশন ব্যবহার করে এই ক্লিনারটিকে তৈরি করে।
সাইমন পূর্ব

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 200 ঠিক আছে তার পরে বিরতি রাখুন। আমি অন্য পদ্ধতি সঙ্গে যেতে হবে।
ভুতফ্লাই

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.
অ্যারিক


যখন কার্লটি অবস্থান শিরোনাম অনুসরণ করতে সেট করা হয় তখন এই পদ্ধতিটি 302 পুনর্নির্দেশগুলিতেও ব্যর্থ হয়।
সাইমন পূর্ব

10

কেবলমাত্র বিকল্পগুলি সেট করুন:

  • CURLOPT_HEADER, 0

  • সিআরএলপিপিআরআরসিআরটিআরএনএসএফআর, ১

এবং CURLINFO_HTTP_CODE (বা কোনও অপ্ট প্যারাম নেই এবং আপনার সমস্ত তথ্য সহ আপনার একটি সহযোগী অ্যারে থাকবে) দিয়ে curl_getinfo ব্যবহার করুন

আরও এখানে: http://php.net/manual/fr/function.curl-getinfo.php


5
এটি মোটেও আপনাকে প্রতিক্রিয়া শিরোনাম ফিরিয়ে দেবে বলে মনে হয় না। বা কমপক্ষে তাদের ব্যবহার করে পুনরুদ্ধার করার কোনও উপায় নেই curl_getinfo()
সাইমন পূর্ব

8

আপনি যদি বিশেষভাবে এটি চান তবে Content-Typeএটি পুনরুদ্ধার করার জন্য একটি বিশেষ সিআরএল বিকল্প রয়েছে:

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

ওপিতে জিজ্ঞাসা করা হয়েছিল যে কোনও নির্দিষ্ট শিরোনাম নয়, শিরোনামগুলি পুনরুদ্ধার করার কোনও উপায় আছে কি না, এটি ওপি-র প্রশ্নের উত্তর দেয় না।
জেফ্রি

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অন্যান্য শিরোনামের আগে কাজ করে ।

আপনার যদি বগি সার্ভারগুলির সাথে কাজ করতে হয় যা লাইন ব্রেক হিসাবে সিআরএলএফের পরিবর্তে কেবল এলএফ প্রেরণ করে আপনি নীচে ব্যবহার করতে পারেন 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);2 হিসাবে বিস্ফোরণের জন্য 3 য় প্যারামিটার থাকা উচিত নয় ?
ব্যবহারকারী 4271704

@ ব্যবহারকারী 4271704 নং এটি সর্বশেষ এইচটিটিপি বার্তা সন্ধানের অনুমতি দেয়। HTTP/1.1 100 Continueঅনেক সময় প্রদর্শিত হতে পারে।
এনাইবি

তবে তিনি অন্য কিছু বলেছেন: স্ট্যাকওভারফ্লো.com / জিজ্ঞাসা / 9183178 /… আপনার মধ্যে কোনটি সঠিক?
ব্যবহারকারী 4271704

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...তার কোডটি সঠিকভাবে কাজ করে না
এনাইবি

1
\ R \ n এ বিভক্ত করা নির্ভরযোগ্য নয়, কিছু সার্ভার এইচটিটিপি নির্দিষ্টকরণের সাথে মানায় না এবং কেবল একটি send n প্রেরণ করবে। আরএফসি স্ট্যান্ডার্ড বলছে যে অ্যাপ্লিকেশনগুলিকে greatest r উপেক্ষা করা উচিত এবং সবচেয়ে বেশি নির্ভরযোগ্যতার জন্য on n এ বিভক্ত হওয়া উচিত।
জেফ্রি

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_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"এইচটিএমএলের শরীরে বৈধভাবে উপস্থিত হতে পারে, তাই আপনি নিশ্চিত হতে পারবেন না যে আপনি শিরোনামটি সঠিকভাবে বিভক্ত করছেন।

দেখে মনে হয় যে উপরে কল করার সাথে আলাদাভাবে শিরোনাম সঞ্চয় করার একমাত্র উপায় https://stackoverflow.com/a/25118032/3326494 এcurl_exec উপরে প্রস্তাবিত কলব্যাক ব্যবহার করা

এবং তারপরে (নির্ভরযোগ্যভাবে) অনুরোধটির কেবলমাত্র মূল অংশ পেতে, আপনাকে Content-Lengthশিরোনামের substr()মানটিকে নেতিবাচক শুরুর মান হিসাবে পাস করতে হবে ।


1
এটি বৈধভাবে হাজির হতে পারে তবে আপনার উত্তরটি ভুল। সামগ্রী-দৈর্ঘ্যের কোনও HTTP প্রতিক্রিয়াতে উপস্থিত থাকতে হবে না। শিরোনামকে ম্যানুয়ালি পার্স করার সঠিক পদ্ধতিটি হ'ল instance r \ n (বা \ n \ n) এর প্রথম উদাহরণটি সন্ধান করা। এটি কেবলমাত্র দুটি উপাদান ফেরত দেওয়ার জন্য বিস্ফোরণকে সীমাবদ্ধ করেই করা যেতে পারে, যেমন: list($head, $body) = explode("\r\n\r\n", $response, 2);তবে আপনি যদি ব্যবহার করেন তবে সিআরএল ইতিমধ্যে এটি আপনার জন্য করে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 য় প্যারামিটারটি কি সরানো উচিত নয়?
ব্যবহারকারী 4271704

@ ব্যবহারকারী 4271704, তৃতীয় পরম হ'ল "এইচটিটিপি / 1.1 100 চালিয়ে যান \ r \ n \ r \ nHTTP / 1.1 200 ঠিক আছে ... \ r \ n \ r \ n ..." শিরোনাম
ডায়াইজম

তবে তিনি আরও কিছু বলেছেন: স্ট্যাকওভারফ্লো.com / প্রশ্নস / ৯১৮৩১8৮ / আপনার কোনটি সঠিক?
ব্যবহারকারী 4271704

আপনি ব্যবহারকারী যে লিঙ্কটি উল্লেখ করছেন তা @ ব্যবহারকারী 4271704 ব্যবহার করুন: explode("\r\n\r\n", $parts, 2); তাই উভয়ই ঠিক।
সাইবার্গ

-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/en/remitted.variables.httpresponseheader.php দেখুন


16
আহ, আপনার আসলেই পিএইচপি দরকার নেই তবে প্রশ্নটি যা ঘটেছিল তা হ'ল ...
হ্যান্স জেড।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.