0

HTTP ヘッダーを取得しようとしていますが、サーバー ソフトウェアの例: Apache、Microsoft-iis、Nginx など

関数

get_headers($url,1); 

遅すぎます 可能であればタイムアウトを設定したいですか、それとも別の方法ですか??

ありがとう

4

4 に答える 4

1

ローカル サーバーの場合、$ _SERVER 変数は、Web サーバーによって SERVER_* キーで公開されるすべてのものを提供します。

リモート サーバーの場合、libcurl を使用してヘッダーのみを要求できます。次に、応答を解析します。ネットワーク接続と他のサーバーの速度によっては、依然として長い遅延が発生する可能性があります. オフライン サーバーなどの長い遅延を避けるには、curl オプションを短いタイムアウト (5 秒など) に設定しcurl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 5)ます。

于 2012-07-20T15:17:33.263 に答える
1

これにより、コードが 2 秒後にタイムアウトするように設定されます。ミリ秒が必要な場合は、CURLOPT_TIMEOUT_MS を使用できます。

$timeoutSecs = 2;

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch, CURLOPT_HEADER, true); // Return the header
curl_setopt($ch, CURLOPT_NOBODY, true); // Don't return the body
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Return to a variable instead of echoing
curl_setopt($ch, CURLOPT_TIMEOUT, $timeoutSecs);

$header = curl_exec($ch);
curl_close($ch);

編集:これから単一のヘッダーを取得するだけでなく、ヘッダー全体を返すことに注意してください(正直に言うと、1つのセグメントだけを取得するよりも遅くはありません)ので、パターンを作成する必要があります「Server:」ヘッダーをプルします。

于 2012-07-20T15:42:37.313 に答える
0

curl または fsockopen でヘッダーを取得し、必要に応じて解析します。

fsockopen の関数は、タイムアウトの最後の引数です。

curl の関数は、タイムアウトのために「curl_setopt($curl, CURLOPT_TIMEOUT, 5)」を呼び出します。

例えば:

function getHttpHead($url) {
$url = parse_url($url);
if($fp = @fsockopen($url['host'],empty($url['port']) ? 80 : $url['port'],$error,
    $errstr,2)) {
    fputs($fp,"GET " . (empty($url['path']) ? '/' : $url['path']) . " HTTP/1.1\r\n");
    fputs($fp,"Host:$url[host]\r\n\r\n");
    $ret = '';
    while (!feof($fp)) {
        $tmp = fgets($fp);
        if(trim($tmp) == '') {
            break;
        }
        $ret .= $tmp;
    }
    preg_match('/[\r\n]Server\:\s([a-zA-Z]*)/is',$ret,$match);
    return $match[1];
    //return $ret;
} else {
    return null;
}
}
$servername= getHttpHead('http://google.com');

echo $servername;
于 2012-07-20T16:04:08.123 に答える
0

これは、cURL を使用して行うことができます。これにより、リモート サーバーからの応答を取得できます。cURL でタイムアウトを設定することもできます。

于 2012-07-20T15:19:23.997 に答える