この記事では主に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
)