PHP में curl का उपयोग करके HTTP कोड प्राप्त करना


177

मैं किसी साइट की स्थिति प्राप्त करने के लिए CURL का उपयोग कर रहा हूं, यदि यह किसी अन्य साइट पर अप / डाउन या रीडायरेक्ट हो रहा है। मैं इसे जितना संभव हो उतना सुव्यवस्थित करना चाहता हूं, लेकिन यह अच्छी तरह से काम नहीं कर रहा है।

<?php
$ch = curl_init($url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_TIMEOUT,10);
$output = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

return $httpcode;
?>

मैंने इसे एक फंक्शन में लपेटा है। यह ठीक काम करता है लेकिन प्रदर्शन सबसे अच्छा नहीं है क्योंकि यह पूरे पृष्ठ को डाउनलोड करता है, अगर मैं $output = curl_exec($ch);इसे हटाता हूं तो यह 0हर समय रहता है।

क्या किसी को पता है कि प्रदर्शन को बेहतर कैसे बनाया जाए?

जवाबों:


260

पहले यह सुनिश्चित कर लें कि URL वास्तव में वैध है (एक स्ट्रिंग, खाली नहीं, अच्छा सिंटैक्स), यह सर्वर साइड की जाँच करने के लिए त्वरित है। उदाहरण के लिए, ऐसा करने से बहुत समय बच सकता है:

if(!$url || !is_string($url) || ! preg_match('/^http(s)?:\/\/[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?(\/.*)?$/i', $url)){
    return false;
}

सुनिश्चित करें कि आप केवल हेडर प्राप्त करते हैं, न कि शरीर की सामग्री:

@curl_setopt($ch, CURLOPT_HEADER  , true);  // we want headers
@curl_setopt($ch, CURLOPT_NOBODY  , true);  // we don't need body

URL स्थिति http कोड प्राप्त करने के बारे में अधिक जानकारी के लिए मैं अपने द्वारा की गई एक अन्य पोस्ट का उल्लेख करता हूं (यह निम्नलिखित रीडायरेक्ट के साथ भी मदद करता है):


एक पूरे के रूप में:

$url = 'http://www.example.com';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, true);    // we want headers
curl_setopt($ch, CURLOPT_NOBODY, true);    // we don't need body
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_TIMEOUT,10);
$output = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

echo 'HTTP code: ' . $httpcode;

4
मैंने आपकी पोस्ट संपादित की और काम के उदाहरण कोड को एक पूरे के रूप में चिपकाया। मुझे यह इस तरह से अधिक उपयोगी लगता है। Btw।, CURLOPT_HEADER और CURLOPT_NOBODY सेटिंग्स का उल्लेख करने के लिए +1! :)
Sk8erPeter

25
CURLOPT_HEADER को सही पर सेट करना आवश्यक नहीं है। आप अभी भी रास्ते से curl_getinfo () से httpcode प्राप्त करते हैं।
ब्रेनवेयर

7
पीएचपी 5.5.0 और cURL 7.10.8, इस [CURLINFO_HTTP_CODE] के रूप में CURLINFO_RESPONSE_CODE की विरासत अन्य नाम है ( रेफरी )
sshow

किसी कारण से यह लाइन curl_setopt($ch, CURLOPT_NOBODY, true);लटकी हुई है। सुनिश्चित नहीं है कि यह सर्वर के PHP संस्करण से संबंधित है।
इटोक्टोपस

126
// must set $url first....
$http = curl_init($url);
// do your curl thing here
$result = curl_exec($http);
$http_status = curl_getinfo($http, CURLINFO_HTTP_CODE);
curl_close($http);
echo $http_status;

16
इस सवाल का सबसे सीधा जवाब है
पहेली प्लस

6
इस शरीर को अनदेखा करने की आवश्यकता नहीं है और यह केवल एक कॉल करता है, जिससे यह मेरा पसंदीदा उत्तर भी बन जाता है।
माइक_के

24
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_TIMEOUT, 20);
$rt = curl_exec($ch);
$info = curl_getinfo($ch);
echo $info["http_code"];

1
आपने एक प्रकार बनाया, यह $ जानकारी ["http_code"] प्रतिध्वनित होनी चाहिए; ; गूंज $ जानकारी [ "HTTP_CODE] के बजाय
लूडो - रिकॉर्ड से परे


4

curl_getinfo - एक विशिष्ट हस्तांतरण के बारे में जानकारी प्राप्त करें

Curl_getinfo की जाँच करें

<?php
// Create a curl handle
$ch = curl_init('http://www.yahoo.com/');

// Execute
curl_exec($ch);

// Check if any error occurred
if(!curl_errno($ch))
{
 $info = curl_getinfo($ch);

 echo 'Took ' . $info['total_time'] . ' seconds to send a request to ' . $info['url'];
}

// Close handle
curl_close($ch);


0

function getStatusCode()
{
    $url = 'example.com/test';
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_HEADER, true);    // we want headers
    curl_setopt($ch, CURLOPT_NOBODY, true);    // we don't need body
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch, CURLOPT_TIMEOUT,10);
    $output = curl_exec($ch);
    $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    return  $httpcode;
}
print_r(getStatusCode());

0

सभी प्रकार की एपीआई प्रतिक्रिया प्राप्त करें / प्राप्त करें / पोस्ट करें, इस हिटचर्ल विधि का उपयोग करें

        function hitCurl($url,$param = [],$type = 'POST'){
        $ch = curl_init();
        if(strtoupper($type) == 'GET'){
            $param = http_build_query((array)$param);
            $url = "{$url}?{$param}";
        }else{
            curl_setopt_array($ch,[
                CURLOPT_POST => (strtoupper($type) == 'POST'),
                CURLOPT_POSTFIELDS => (array)$param,
            ]);
        }
        curl_setopt_array($ch,[
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => true,
        ]);
        $resp = curl_exec($ch);
        $statusCode = curl_getinfo($ch,CURLINFO_HTTP_CODE);
        curl_close($ch);
        return [
            'statusCode' => $statusCode,
            'resp' => $resp
        ];
    }

एपीआई परीक्षण करने के लिए डेमो फ़ंक्शन

 function fetchApiData(){
        $url = 'https://postman-echo.com/get';
        $resp = $this->hitCurl($url,[
            'foo1'=>'bar1',
            'foo2'=>'bar2'
        ],'get');
        $apiData = "Getting header code {$resp['statusCode']}";
        if($resp['statusCode'] == 200){
            $apiData = json_decode($resp['resp']);
        }
        echo "<pre>";
        print_r ($apiData);
        echo "</pre>";
    }

-3

नियमित रूप से सर्वर की स्थिति की जांच के लिए यहां मेरे समाधान की स्थिति स्टेटस Http प्राप्त करने की आवश्यकता है

$url = 'http://www.example.com'; // Your server link

while(true) {

    $strHeader = get_headers($url)[0];

    $statusCode = substr($strHeader, 9, 3 );

    if($statusCode != 200 ) {
        echo 'Server down.';
        // Send email 
    }
    else {
        echo 'oK';
    }

    sleep(30);
}

1
जेथेडर्स कर्ल की तुलना में धीमा है।
माइक कोरमेन्डी

1
आप नींद और अंतहीन लूप का उपयोग करने के बजाय क्रोन या वेबहूक का उपयोग क्यों नहीं करते हैं?
उगुर कजदल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.