ホームページ  >  記事  >  バックエンド開発  >  PHP に実装されたタイムアウト関数を備えた Get_headers 関数、phpget_headers_PHP チュートリアル

PHP に実装されたタイムアウト関数を備えた Get_headers 関数、phpget_headers_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:07:09989ブラウズ

PHPはタイムアウト関数付きのget_headers関数を実装しました、phpget_headers

コードはたくさんありますが、比較的シンプルで一目でわかるので、できるだけ少ない文字で書くようにしてください。
よく知られているネットワーク上の理由により、gavatar も徐々に遅くなり始めました。この問題を解決するために、非常に悲しいことに get_headers 関数に遭遇しました。これを記録しました。罠は後ほど。
レコードの更新、関数は少し変更されており、戻り値は以前のシリアライズ結果と基本的に同じです。サブ項目や配列などのサポートは現時点では考えていません。(細かいパフォーマンスを考慮して、これも欲しいです)。無駄な http ヘッダーを切り取るため...)
要件は単純です。画像の先頭情報を取得します。
プログラムをデバッグすると、IP がバインドされている場合でも、この関数の呼び出しが非常に遅いことがわかりました。
この件について考えると、タイムアウトを追加する必要がありますが、公式ドキュメントを見ると、指定されているエクスポート関数のインターフェイスは次のとおりです:

コードをコピーします コードは次のとおりです:

array get_headers(string$url[,int$format=0])

おっしゃるとおり、これにはタイムアウト インターフェイスがありません...
基礎となる実装を使用して再実装することを期待して、github でソース コードをチェックしてください:
アドレス https://github.com/php/php-src/blob/88ca46d92bc1c426e7c7f7313f0fd2b7dcc33cf6/ext/standard/url.c#L710

コードをコピーします コードは次のとおりです:

/* {{{ プロト配列 get_headers(string url[, int format])
HTTP リクエストに応じてサーバーから送信されたすべてのヘッダーを取得します */
PHP_FUNCTION(get_headers)
{
char*url;
サイズ_t url_len;
php_stream_context*コンテキスト;
php_stream*ストリーム;
zval*prev_val,*hdr=NULL,*h;
ハッシュテーブル*ハッシュT;
zend_long 形式=0;
                                                          if(zend_parse_parameters(ZEND_NUM_ARGS()TSRMLS_CC,"s|l",&url,&url_len,&format)==FAILURE){
戻ります;
}

/**他の多くのものは省略します... **/
}
/* }}} */

しかし、残念ながら、zend_parse_parameters と ZEND_NUM_ARGS には、PHP バージョンにはエクスポートされた関数がありません。

そこでホイール作りが始まります:

コードをコピーします コードは次のとおりです:

functionget_url_headers($url,$timeout=10)
{
    $ch=curl_init();
 
    curl_setopt($ch,CURLOPT_URL,$url);
    curl_setopt($ch,CURLOPT_HEADER,true);
    curl_setopt($ch,CURLOPT_NOBODY,true);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
    curl_setopt($ch,CURLOPT_TIMEOUT,$timeout);
 
    $data=curl_exec($ch);
    $data=preg_split('/n/',$data);
 
    $data=array_filter(array_map(function($data){
        $data=trim($data);
        if($data){
            $data=preg_split('/:s/',trim($data),2);
            $length=count($data);
            スイッチ($length){
                ケース2:
                    returnarray($data[0]=>$data[1]);
                    休憩;
                ケース1:
                    $データを返す;
                    休憩;
                デフォルト:
                    休憩;
            }
        }
    },$data));
 
    並べ替え($data);
 
    foreach($dataas$key=>$value){
        $itemKey=array_keys($value)[0];
        if(is_int($itemKey)){
            $data[$key]=$value[$itemKey];
        }elseif(is_string($itemKey)){
            $data[$itemKey]=$value[$itemKey];
            unset($data[$key]);
        }
    }
 
    $データを返す;
}

对比最終結果:
原版又是蛮长的等待,不知道校验啥去了(没继续追代了,有兴趣的童鞋可去跟下玩):

复制代価代価如下:

配列
(
    [0]=>HTTP/1.0302 が見つかりました
    [Accept-Ranges]=>バイト
    [キャッシュ制御]=>最大期間=300
    [コンテンツタイプ]=>配列
        (
            [0]=>text/html;charset=utf-8
            [1]=>text/html;charset=utf-8
        )
 
    [日付]=>配列
        (
            [0]=>2014年12月12日金曜日15:35:40GMT
            [1]=>2014年12月12日金曜日15:35:43GMT
        )
 
    [有効期限]=>2014 年 12 月 12 日金曜日 15:40:40GMT
    [Last-Modified]=>1981年1月11日水曜日08:00:00GMT
    [Link]=>; rel="正規"
    【所在地】=>http://i2.wp.com/[省略…]
    [サーバー]=>配列
        (
            [0]=>ECS(oxr/838B)
            [1]=>nginx
        )
 
    [ソース-年齢]=>85
    [経由]=>1.1ワニス
    [X-キャッシュ]=>302-HIT
    [X-ワニス]=>14702550881470006304
    [コンテンツの長さ]=>0
    [接続]=>配列
        (
            [0]=>閉じる
            [1]=>閉じる
        )
 
    [1]=>HTTP/1.1504ゲートウェイタイムアウト
)

轮子版返回(瞬间回返、双方内容略有異、你仔细看就能発行现一部趣的地方了):

复制代価代価如下:

配列
(
    [0]=>HTTP/1.1302 が見つかりました
    [Accept-Ranges]=>バイト
    [経由]=>1.1ワニス
    [キャッシュ制御]=>max-age=300
    [サーバー]=>ECS(oxr/838B)
    [Content-Type]=>text/html;charset=utf-8
    [X-ワニス]=>14702550881470006304
    [日付]=>2014年12月12日金曜日20:31:02GMT
    【所在地】=>http://i2.wp.com/[省略…]
    [有効期限]=>2014 年 12 月 12 日金曜日 20:36:02GMT
    [ソース-年齢]=>85
    [Last-Modified]=>1981年1月11日水曜日08:00:00GMT
    [X-キャッシュ]=>302-HIT
    [Link]=>; rel="正規"
    [コンテンツの長さ]=>0
)

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/955976.html技術記事 PHP で実現されるバンドル時間関数 get_headers 関数、phpget_headers のコードは非常に多いですが、比較的単純で、レンズを通過するため、文字は極力少なく書かれています。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。