TRASH-NEWS プログラム経由で画像を表示させる際の表示バラつきを調べてみた

順路
  1. ホーム
  2. 2008年
  3. 06月
  4. 21日
  5. この記事 [現在地]
Search?
お知らせ
ここ数日更新が滞っていますが…… (2008/04/13 13:31)
4月より社会人となったため、時間の作り方がいまいちつかめないため、不定期の更新となります。まぁ……ニコニコメーカーでもお楽しみください!
1 2 3

プログラム経由で画像を表示させる際の表示バラつきを調べてみた

TRASH-NEWSは
生きていくうえではあまり役立ちそうにないサイトです
初出時刻
2008年06月21日 19時51分 投稿
最終更新時刻
2008年06月21日 20時25分 改訂
  • この記事をはてブする
  • Yahoo!ブックマークに登録

2つ前の記事『Opera9.5正式版で気になった点(不具合や変更点)を挙げてみる』で、Opera9.5では"imgのsrcで画像ファイル以外を指定できなくなった"という指摘をしましたが、実際のところどうなのかを確かめてみました。

ことの発端ははてなブックマークの登録人数を表示するための画像ファイルがOpera9.5にアップデートしてから表示されなくなった、という発見。しかしいろいろと試してみると、表示されるとき表示されないときが不規則的にあることが判明(更新ボタンを押すたびに変わる)。そして表示されやすい画像表示されにくい画像があることも発覚。バラつきの規則性がまったくわからないため、とりあえず実験してみるしかないじゃないか、ということでこのページに至ります。

先に書いてしまうと、“画像ファイルかどうかは関係なく画像が表示されないことがある”という実験結果を得ることができました。僕はてっきりimgのsrcが静的なURLだと読み込めなくなったのかと考えていましたが、URLと非表示の間には関係がなかったようです。ただ今回それ以上に重大なことがわかりました。それは……"そもそもブラウザとは関係なくプログラム経由で画像を呼び出すと表示されないことが多い"ということ……!!!!

使用した検証用のプログラムと結果、考察を以下に。

プログラムを利用した画像読み込みテスト

以下11コある画像(画像番号[1]-[11])は、すべてwww.dabun-doumei.comに設置したプログラム『20080621_Opera950ImageTest.php』で呼び出された画像です。引数を変えたURL(呼び出す方法が異なる)をそれぞれimgタグのsrcプロパティに指定しています。なお画像番号[1]~[6]はプログラムと同じサイト(同じドメイン)の画像、画像番号[7]~[11]は異なるサイト(異なるドメイン)の画像を読み込んでいます。

TRASH-NEWSロゴ : 画像ファイルURL直指定 ←[1]-[6]で読み込んでいる画像

TRASH-NEWSロゴ : 画像ファイルURL直指定 ←[7]-[11]で読み込んでいる画像

ちなみにこのきしめんロゴの画像についてはこの記事この記事を参照のこと。

さて、それでは検証用の画像ファイルを貼り付けていきます。

[1]-[6] :: www.trash-news.netというドメインからwww.dabun-doumei.comにあるプログラムを指定し、www.dabun-doumei.comにある画像を表示させる。

TRASH-NEWSロゴ : SameSiteRead TRASH-NEWSロゴ : SameSiteTempRedirect TRASH-NEWSロゴ : SameSitePermaRedirect
左[1] : http://www.dabun-doumei.com/topix/20080621_Opera950ImageTest.php?Mode=SameSiteRead
中[2] : http://www.dabun-doumei.com/topix/20080621_Opera950ImageTest.php?Mode=SameSiteTempRedirect
右[3] : http://www.dabun-doumei.com/topix/20080621_Opera950ImageTest.php?Mode=SameSitePermaRedirect

[1]はPHPのreadfile関数で読み込んだもの。[2]はPHPのheader関数(のLocation)で307 Temporary Redirect転送させて読み込んだもの。[3]はPHPのheader関数(のLocation)で301 Moved Permanently転送させて読み込んだもの。

TRASH-NEWSロゴ : SameSiteRead&Ext=.png TRASH-NEWSロゴ : SameSiteRead&Att=1&Ext=.png TRASH-NEWSロゴ : 無指定
左[4] : http://www.dabun-doumei.com/topix/20080621_Opera950ImageTest.php?Mode=SameSiteRead&Ext=.png
中[5] : http://www.dabun-doumei.com/topix/20080621_Opera950ImageTest.php?Mode=SameSiteRead&Att=1&Ext=.png
右[6] : http://www.dabun-doumei.com/topix/20080621_Opera950ImageTest.php

[4]はPHPのheader関数で画像用のヘッダをつけたのち、PHPのreadfile関数で読み込んだもの。[5]はPHPのheader関数で画像用のヘッダ(Content-Disposition含)をつけたのち、PHPのreadfile関数で読み込んだもの。[6]はじかに画像を読み込んだもの(画像のURLを直接指定)。

以上、プログラムと画像が同じドメインにある環境でのテスト(はてブと同じ状態)でした。以下、プログラムとサーバーが違うドメインにある環境でのテストも念のため。

[7]-[11] :: www.trash-news.netというドメインからwww.dabun-doumei.comにあるプログラムを指定し、images.sakura.ne.jpにある画像を表示させる。

TRASH-NEWSロゴ : CrossSiteRead TRASH-NEWSロゴ : CrossSiteTempRedirect TRASH-NEWSロゴ : CrossSitePermaRedirect
左[7] : http://www.dabun-doumei.com/topix/20080621_Opera950ImageTest.php?Mode=CrossSiteRead
中[8] : http://www.dabun-doumei.com/topix/20080621_Opera950ImageTest.php?Mode=CrossSiteTempRedirect
右[9] : http://www.dabun-doumei.com/topix/20080621_Opera950ImageTest.php?Mode=CrossSitePermaRedirect

[7]はPHPのreadfile関数で読み込んだもの。[8]はPHPのheader関数(のLocation)で307 Temporary Redirect転送させて読み込んだもの。[9]はPHPのheader関数(のLocation)で301 Moved Permanently転送させて読み込んだもの。

TRASH-NEWSロゴ : CrossSiteRead&Ext=.png TRASH-NEWSロゴ : CrossSiteRead&Att=1&Ext=.png
左[10]: http://www.dabun-doumei.com/topix/20080621_Opera950ImageTest.php?Mode=CrossSiteRead&Ext=.png
右[11] : http://www.dabun-doumei.com/topix/20080621_Opera950ImageTest.php?Mode=CrossSiteRead&Att=1&Ext=.png

[10]はPHPのheader関数で画像用のヘッダをつけたのち、PHPのreadfile関数で読み込んだもの。[11]はPHPのheader関数で画像用のヘッダ(Content-Disposition含)をつけたのち、PHPのreadfile関数で読み込んだもの。

なおwww.dabun-doumei.comに設置した画像読み込み用プログラム(20080621_Opera950ImageTest.php)のソースコードは以下の通り。

20080621_Opera950ImageTest.phpのソースコード
$SameSiteSRC = '../image/event/20080621_Opera950ImageTest.png'; $CrossSiteSRC = 'http://images.sakura.ne.jp/20080621_Opera950ImageTest.png'; if(isset($_GET['Mode'])){ $Mode = $_GET['Mode']; if(isset($_GET['Ext'])){ header('Content-length: 6280'); header('Content-type: image/png'); if(isset($_GET['Att'])){ header('Content-Disposition: attachment; filename="TRASH-NEWS.png"'); } } switch($Mode){ case 'SameSiteRead' : readfile($SameSiteSRC); break; case 'SameSiteTempRedirect' : header("Location:{$SameSiteSRC}",TRUE,307); break; case 'SameSitePermaRedirect' : header("Location:{$SameSiteSRC}",TRUE,301); break; case 'CrossSiteRead' : readfile($CrossSiteSRC); break; case 'CrossSiteTempRedirect' : header("Location:{$CrossSiteSRC}",TRUE,307); break; case 'CrossSitePermaRedirect' : header("Location:{$CrossSiteSRC}",TRUE,301); break; default : break; } exit(); }else{ readfile($SameSiteSRC); exit(); }

なお同じドメインから同じドメインにあるプログラムを指定し~ということが検証できるように、www.dabun-doumei.comでも同じ検証用ページを設けています。

このプログラムではさまざまな方法で画像を読み込んでいます。[1]から[6]はいずれも過程は違えど読み込んでいるのは同じ画像ファイルなのです。[1]から[6]の中でもっともポピュラーな呼び出し方は[4]だと思われます。ヘッダは画像用のものをきちんと送出し、画像はreadfileで呼び出す。典型的と呼べる手順なのではないでしょうか。次いで[3](リダイレクト)、[1]([4]のヘッダ指定忘れ版)あたりが実用的といったところ。[2](一時的なリダイレクト)と[5](ダウンロード用ダイアログ表示)は特殊な書き方なのでまず見ないとは思いますが、念のため。[6]は処理は[1]とまったく同じですが、静的ページっぽいURLか否かで差異が出るかどうかを検証するため設けました。

[7]から[11]はそれぞれimages.sakura.ne.jpという、大昔に取得したサーバーに置いた画像を呼び出しているだけで、処理自体は同様です(それぞれ[1]から[5]に対応しています)。異なるドメイン・サーバーの画像を呼び出すと変わるのかどうかを検証するため設けました。

[1]-[11]、すべての画像が毎回表示されることを期待して、検証を始めました。理論的には毎回表示されてしかるべきです。

テストの結果

リロードを繰り返した回数 : 100回(Opera9.5/IE7/Firefox3それぞれにて)。

すべての画像が表示された回数 : 0回。

オオオオオ……。

実際にこのページ(か先述のこのページ)をリロードしていただければ一目瞭然ですが、かならずどれか1つは表示されない画像があるはずです。しかも毎回表示されない画像が異なるという……意味のわからない結果に(はてブ画像の問題と同じ結果ではある)! 1回表示したらキャッシュとして残るから安泰(?)だろうと思いきや、リロード後には非表示ということもしばしば。キャッシュの存在意義は?

そしてこのテスト結果はOpera9.5に限らずIE7でもほぼ同様のものが出ました。唯一Firefox3が"大体どの画像も90%以上の確率で表示される"という程度でしたが、すべての画像が表示された回数は100回中1回もありませんでした。……ハハハ。

PHPなどのプログラムで画像を表示させるというのは非常にありふれたことであり、僕自身何度も作成・設置してきました。が、まさかここまで表示されないことが多いとは思いもしませんでした。今回作ったプログラムにどこか穴があるのではと勘ぐりたくなるくらい……いや実際どう考えてもおかしい結果なので勘ぐっているのですが、とにかくそのくらい予想外の結果が出てしまいました。

以下気づいた点を列挙。

このテストで気づいた点
  1. [1]~[11]、すべての画像が100回の試行のうち1回は表示された(Opera9.5/IE7)
  2. Firefox3では[2][3][8][9]、つまりheader関数でLocation転送させたものが常に表示されなかった
  3. [1]~[6]と[7]~[11]の表示確率を見てみると後者のほうが低い
  4. [2]と[3]は結局同じファイルに転送(=キャッシュも同じファイルとして登録)されているにも関わらず、片方が表示されてもう片方は非表示、という状況がかなりの確率で発生
  5. 画像のURLを直に指定したもの(冒頭の2つ)はどのブラウザでも毎回表示された

きちんと各ブラウザごとに回数を見たほうが良いんでしょうけれど、面倒かつ回数を厳密に見なくても"ヤバい結果"ということがわかっているので、感覚論で語ってみました。

考えられる可能性

ブラウザの設定によるものかと思いましたが、Operaの『ページの更新をサーバーに確認するタイミング』などを変えて試してみても結果は変わらず。まぁブラウザごと(Opera9.5+IE7 / Firefox3)で明らかな差が出ているということは、どこかの設定でその差が生まれていると見て間違いないでしょう。

もうひとつ考えられる原因は、プログラムへ一度に複数のアクセスがあったことによる動作不良。今回のテストでは一度に10回アクセスがあるわけですから、処理し切れなかったのかもしれません。異なるサーバーの画像を呼び出した[7]から[11]の結果が悪かったのは、呼び出しに時間がかかってのタイムアウトが原因と考えるのが妥当でしょうか。プログラムないし画像へのアクセス不良、つまりはサーバーの仕様で表示されなかった、という可能性です。

画像へのアクセス不良が原因という説を裏付けそうな現象があります。はてなブックマークの画像で"1人"と書かれた画像には表示/非表示のばらつきがありましたが、2人、あるいはそれ以上の画像はほぼ毎回表示されていました。他のサイトを見ても"1人"という画像が表示される回数が圧倒的に多いと思われるため、局所的なアクセス集中によるタイムアウト、ということが考えられます。まぁ他の画像も共倒れしそうな気はしますけど。

Opera9.5の不具合を探るつもりが、インターネットの仕組みを調べる長旅に足をつっこんでしまいました。先が見えないうえに、自力ではどう考えても答えまでたどり着きそうにないため、この問題に関してはお蔵入りとさせていただきます。何か原因がつかめそうな方はどうぞ僕の屍を越えていってください。

サイト内検索
検索する
このサイトについて
  • サイト名 : TRASH-NEWS
  • 分類 : ニュースとネタのサイト
  • ジャンル : 井戸端からアレゲまで
  • もっと詳しく見る
最近の記事
08月31日の記事
  1. Quad+GeForce 9600GTの新PCでタイムリープぶーとべんちしてみた
08月28日の記事
  1. 初音ミクの星間飛行や振り付けランカちゃんなど最近見たニコニコ動画
08月25日の記事
  1. 初音ミクと小林オニキスさんの新曲『ORCA』がまたも素晴らしい
08月19日の記事
  1. こもんちゃん(ニコニ・コモンズ)で解説する『PhotoshopCS3でアニメgifを編集する方法』
08月18日の記事
  1. ブルースクリーン・ブルース
08月17日の記事
  1. 夏コミのために有給を取ったにもかかわらず
07月16日の記事
  1. マルタと釘宮のために買ったWii、Priceless.
07月12日の記事
  1. 2008年7月に発売されるマンガのスケジュール表
07月06日の記事
  1. I'veコンピアルバム 『master groove circle』など気になったニュース
07月05日の記事
  1. テイルズオブ釘宮やSound Blaster Play!など購入検討物リスト
日刊人気記事ランキング
2008年09月05日のぶん
1
Windows XP SP3インストールで不具合が起きることが発覚
213
2
XP SP3における不具合報告と32bitOSでのメモリのRAMDisk化の話
54
3
画像解析系ジェネレータ・BannerCodeBattler2(仮)着手開始
45
4
Windows XPのSP3は思いのほかスゴいらしい
39
5
テイルズオブ新作『テイルズ オブ ヴェスペリア』のまとめと推察
30
6
「テイルズ オブ」シリーズが全世界で売り上げ1,000万本突破
20
7
I'veコンピアルバム 『master groove circle』など気になったニュース
16
8
マリオっぽい自作のゲーム改めしょぼんのアクション公開開始
16
9
アリゾナ在住のアニメ大好きGrumpyJiisanなど最近見たニコニコ動画
16
10
ハニカム1巻や花やしきの住人たち1巻など最近読んだマンガの感想
16

2008年09月06日 0時更新

人気記事ランキング

カテゴリ(折畳表示)
ニュース・ネタ
サブカテゴリを開く
俺研究舎
サブカテゴリを開く
お知らせ
サブカテゴリを開く
特集・企画
サブカテゴリを開く
管理人近況
サブカテゴリを開く
カスタムアーキテクチャ
1回めのようこそ!
ゲストさん
  • 文字の大きさ : 12px
  • フォント : MS Pゴシック
  • レイアウト : 3段組
  • カスタムする
カレンダー
2008年6月
«  05月 - 07月  »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          
管理人について
管理人 : 八満かシアン
文系なのにエンジニア、なんてこったい(八満のほう)
今頃たぶん聴いている曲
砂漠の雪 by MELL
月別アーカイブ
2008年
2007年
最近記事に掲載した画像
タイムリープぶーとべんち本編開始前の寸劇でKO
タイムリープぶーとべんち本編開始前の寸劇でKO
タイムリープぶーとべんちでも比較的驚きの結果
タイムリープぶーとべんちでも比較的驚きの結果
Vista標準搭載のエクスペリエンスインデックススコアで性能評価
Vista標準搭載のエクスペリエンスインデックススコアで性能評価
ラタトスクとWiiはマルタと釘宮のために存在している
ラタトスクとWiiはマルタと釘宮のために存在している
夏海ケイ作画『うみねこのなく頃にEP1』が面白い
夏海ケイ作画『うみねこのなく頃にEP1』が面白い
画像に関するリンク
ユーティリティ
RSSフィード
ソーシャルブックマーク
  • iGoogle
  • はてなアンテナにTRASH-NEWSを追加する TRASH-NEWSのはてなブックマーク数 この記事を含むはてなブックマーク
サイトプロフィール
Powered by
  • Movable Type 4.1 + [XHTML + CSS + JavaScript] + PHP
  • TRASH-NEWS / Hachiman_Cian 2007-
このページについて
題名
プログラム経由で画像を表示させる際の表示バラつきを調べてみた
内容
  • 2つ前の記事『Opera9.5正式版で気になった点(不具合や変更点)を挙げてみる
TRASH-NEWS ロゴ
TRASH-NEWS ロゴ
TRASH-NEWS : http://www.trash-news.net/