使用curl在PHP中获取HTTP代码

使用curl在PHP中获取HTTP代码,php,performance,curl,http-headers,Php,Performance,Curl,Http Headers,我使用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_c

我使用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\u exec($ch)
它始终返回
0

有人知道如何提高性能吗?

试试PHP的“”函数

大致如下:

<?php
    $url = 'http://www.example.com';
    print_r(get_headers($url));
    print_r(get_headers($url, 1));
?>


curl\u exec
是必需的。尝试
CURLOPT_NOBODY
不下载正文。这可能会更快。

首先确保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;

curl\u getinfo
-获取有关特定传输的信息

检查


这是我的解决方案,需要获取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);
}

使用此hitCurl方法获取所有类型的api响应,即Get/Post

        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
        ];
    }
用于测试api的演示函数

函数fetchApiData(){ $url='1https://postman-echo.com/get'; $resp=$this->hitCurl($url[ 'foo1'=>'bar1', 'foo2'=>'bar2' ]“得到”; $apiData=“获取头代码{$resp['statusCode']}”; 如果($resp['statusCode']==200){ $apiData=json_解码($resp['resp']); } 回声“; 打印(apiData); 回声“; }
我编辑了您的文章,并将工作示例代码作为一个整体粘贴。我觉得这样更有帮助。顺便说一句,提到CURLOPT_标题和CURLOPT_无人设置时+1:)无需将CURLOPT_HEADER设置为true。不管怎样,您仍然可以从curl_getinfo()获得httpcode。从PHP5.5.0和curl 7.10.8开始,这个[CURLINFO_HTTP_CODE]是CURLINFO_RESPONSE_CODE()的传统别名,出于某种原因,这行curl_setopt($ch,CURLOPT_NOBODY,true)挂起。不确定这是否与服务器的PHP版本有关。您创建了一个类型,它应该是echo$info[“http_code”];而不是echo$info[“http_代码];这是对这个问题最直接的回答。这个问题不需要忽略主体,只需要调用一次,这也是我的首选答案。查看2021年的文档:
从PHP5.5.0和Curl7.10.8开始,这是CURLINFO\u RESPONSE\u code的传统别名,Getheaders比cURL慢。为什么不改用cron或webhook呢与curl相比,使用sleep和无尽循环?Get头的广告速度较慢。
<?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);
$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);
}
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());
        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>";
    }