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
)
http://www.bkjia.com/PHPjc/955976.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/955976.html技術記事 PHP で実現されるバンドル時間関数 get_headers 関数、phpget_headers のコードは非常に多いですが、比較的単純で、レンズを通過するため、文字は極力少なく書かれています。