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

PHP_PHP チュートリアルにタイムアウト関数が実装された Get_headers 関数

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

PHPで実装されたタイムアウト関数を備えたGet_headers関数

この記事では主にPHPで実装されたタイムアウト関数を備えたget_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

コードは次のとおりです:

/* {{{ proto array get_headers(string url[, int format])

HTTP リクエストに応じてサーバーから送信されたすべてのヘッダーを取得します */

PHP_FUNCTION(get_headers)

{

char*url;

size_t url_len;

php_stream_context*context;

php_stream*stream;

zval*prev_val,*hdr=NULL,*h;

ハッシュテーブル*hashT;

zend_long format=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));

sort($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]);

}

}

$data を返す;

}

最終結果を比較します:

オリジナルバージョンはかなり長い間待たされます。検証がどうなったかわかりません (私はコードを追求し続けるつもりはありません。興味のある子供は行って遊んでください):

コードは次のとおりです:

配列

(

[0]=>HTTP/1.0302が見つかりました

[Accept-Ranges]=>バイト

[キャッシュ制御]=>max-age=300

[Content-Type]=>配列

(

[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

[有効期限]=>Fri,12Dec201415:40:40GMT

[Last-Modified]=>水曜日、1984年1月11日08:00:00GMT

[リンク]=>

[所在地]=>http://i2.wp.com/[省略…]

[サーバー]=>配列

(

[0]=>ECS(oxr/838B)

[1]=>nginx

[出典-年齢]=>85

[Via]=>1.1ワニス

[X-キャッシュ]=>302-HIT

[X-ワニス]=>14702550881470006304

[Content-Length]=>0

[接続]=>配列

(

[0]=>閉じる

[1]=>閉じる

[1]=>HTTP/1.1504ゲートウェイタイムアウト

ホイール バージョンに戻ります (すぐに戻ります。2 つの内容は少し異なります。注意深く見るといくつかの興味深い点が見つかります):

コードは次のとおりです:

配列

(

[0]=>HTTP/1.1302が見つかりました

[Accept-Ranges]=>バイト

[Via]=>1.1ワニス

[キャッシュ制御]=>max-age=300

[サーバー]=>ECS(oxr/838B)

[Content-Type]=>text/html;charset=utf-8

[X-ワニス]=>14702550881470006304

[日付]=>Fri,12Dec201420:31:02GMT

[所在地]=>http://i2.wp.com/[省略…]

[有効期限]=>Fri,12Dec201420:36:02GMT

[出典-年齢]=>85

[Last-Modified]=>水曜日、1984年1月11日08:00:00GMT

[X-キャッシュ]=>302-HIT

[リンク]=>

[Content-Length]=>0

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/955832.html技術記事この記事では、PHP で実装されたタイムアウト関数を含む get_headers 関数を主に紹介します。必要な方は、それを参照してください。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。