phpのgetimagesizeという関数についての質問です。


リモートの画像ファイルの情報を取得して、リサイズした上でサーバに保存し、携帯用に縮小画像を表示させたいと思っています。そこで、まずgetimagesizeで任意のリモート画像の情報を取得しに行くのですが、これが成功したりしなかったりします。

失敗した時は

Warning: getimagesize() [function.getimagesize]: Unable to access http://www.hoge.com/fuga.jpg in piyo.php on line **

Warning: getimagesize( http://www.hoge.com/fuga.jpg) [function.getimagesize]: failed to open stream: No such file or directory in piyo.php on line **

といった感じのWarningが出ます。実際にファイルが存在しない訳ではなく、存在しているのにNo such fileと出てしまうので、とまどっています。また、Warningが出るケースと出ないケースにおいて、ドメイン等に法則性は認められませんでした。なぜ取得できたりできなかったりするのかが分かりません。


何か見落としている点や、手がかりがありましたらご教示ください。宜しくお願いします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2008/09/22 00:25:52
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:wizemperor No.2

回答回数379ベストアンサー獲得回数52

ポイント35pt

http://jp2.php.net/function.getimagesize


を見ると、


>もし filename のイメージにアクセスできない場合、 もしくは有効な画像でない場合、getimagesize() は FALSE を返し、

>E_WARNING レベルのエラーを発生させます。 読み込み時にエラーが発生した場合は、 getimagesize() は E_NOTICE レベルのエラーを発生させます。


>5.2.3 読み込み時にエラーが発生した場合のエラーレベルが、 E_WARNING から E_NOTICE に変わりました。


とありますが、PHPは4.4.8ということなので、

Warningが出るのは「アクセスできない」か「有効な画像でない」か「読み込みエラー」のどれかでしょうね。

メッセージを見ると「アクセスできない」のようですが…。


エラーが発生したときに、手動でアクセスするとすぐに画像は表示されますか?

また、Warningが出るのは毎回、同じ画像ですか?

そうであれば、指定しているアドレスが間違っている、相手のサーバ・設定等の問題、画像形式が対応してないなどが考えられます。

違うのであれば、タイムアウトや何らかの制限の可能性がありそうです(1回の実行で大量に処理してるなど)。


他は、パラメータに指定するURLはエンコードしてありますよね?(空白文字や日本語とか)


とりあえず、思いつくのはこれくらいなのですが、同じ画像でWarningが出るのであれば、

エラーが出るファイルをローカルにダウンロードして、ファイルとして試してみたらどうでしょうか?

サーバ等の問題なのか、ファイル自体の問題なのかは切り分けられると思います。

id:mine-D

ありがとうございます。

・手動でアクセスできるか→OKです。

・毎回同じかどうか→何度かやってみましたが、同じ画像ですね。

やはり相手のサーバの設定をチェックしてみる必要がありますかね。

ただ、実は1回の実行で大量に処理←これにしっかり当てはまっているので、必要な分だけ処理するように変えてみようかとも思っています。

それと、ローカルにダウンロードするやり方、気がつきませんでした。やってみます。

2008/09/20 19:36:04

その他の回答1件)

id:wizemperor No.1

回答回数379ベストアンサー獲得回数52

ポイント35pt

タイムアウトしている可能性が高いですね。

つまり、相手のサーバ側の反応が遅いなど。

共用サーバでは、他の人に迷惑をかける可能性があるので、

スクリプトの実行時間が制限されているはずです。

XREAはたしか1分とかその辺じゃなかったかな。

他に考えられるのは、相手側のサーバでそういった画像の直接の呼び出しを拒否してるとか。

対策としては、タイムアウトしたアドレスは記録しておいて、

次回の巡回時に再度取得してみるとかそんな感じですかね。

だめなら専用サーバを借りたりとか。

id:mine-D

タイムアウトという発想はなかったです。なるほどー。勉強になります。

XREAの実行時間制限については調べてみますね。

画像の直リンは、実際Warningが出ている画像でやってみたんですが普通に表示できたので、可能性としては低いかと思います。

感謝です!

2008/09/20 03:59:53
id:wizemperor No.2

回答回数379ベストアンサー獲得回数52ここでベストアンサー

ポイント35pt

http://jp2.php.net/function.getimagesize


を見ると、


>もし filename のイメージにアクセスできない場合、 もしくは有効な画像でない場合、getimagesize() は FALSE を返し、

>E_WARNING レベルのエラーを発生させます。 読み込み時にエラーが発生した場合は、 getimagesize() は E_NOTICE レベルのエラーを発生させます。


>5.2.3 読み込み時にエラーが発生した場合のエラーレベルが、 E_WARNING から E_NOTICE に変わりました。


とありますが、PHPは4.4.8ということなので、

Warningが出るのは「アクセスできない」か「有効な画像でない」か「読み込みエラー」のどれかでしょうね。

メッセージを見ると「アクセスできない」のようですが…。


エラーが発生したときに、手動でアクセスするとすぐに画像は表示されますか?

また、Warningが出るのは毎回、同じ画像ですか?

そうであれば、指定しているアドレスが間違っている、相手のサーバ・設定等の問題、画像形式が対応してないなどが考えられます。

違うのであれば、タイムアウトや何らかの制限の可能性がありそうです(1回の実行で大量に処理してるなど)。


他は、パラメータに指定するURLはエンコードしてありますよね?(空白文字や日本語とか)


とりあえず、思いつくのはこれくらいなのですが、同じ画像でWarningが出るのであれば、

エラーが出るファイルをローカルにダウンロードして、ファイルとして試してみたらどうでしょうか?

サーバ等の問題なのか、ファイル自体の問題なのかは切り分けられると思います。

id:mine-D

ありがとうございます。

・手動でアクセスできるか→OKです。

・毎回同じかどうか→何度かやってみましたが、同じ画像ですね。

やはり相手のサーバの設定をチェックしてみる必要がありますかね。

ただ、実は1回の実行で大量に処理←これにしっかり当てはまっているので、必要な分だけ処理するように変えてみようかとも思っています。

それと、ローカルにダウンロードするやり方、気がつきませんでした。やってみます。

2008/09/20 19:36:04
  • id:mine-D
    書き忘れました。phpのバージョンは4.4.8、サーバはLinux(XREA)です。
  • id:wizemperor
    スクリプトが止まる場合は、XREA側のタイムアウト。
    止まらない場合は相手のサーバ側だと思います。

    書き忘れましたが、getimagesizeが対応していない画像形式ってことも考えられますね。
  • id:mine-D
    fatal errorは出ておらず、warningのみなのでスクリプトは停止していないかと思います。
    それで、相手のサーバ側の問題というのは、具体的にどういった事象なのでしょうか?
    例えばhtaccessで直リンク不可とかいった事はないようです。<img src="">で指定すると普通に表示されます。
    コメントではなく、回答としてお答えいただいてかまいません。なにとぞよろしくお願いします。
  • id:mine-D
    それと、現在取り扱っている画像ファイル形式はすべて.jpg拡張子のJPEGファイルで、特に変わったところは見受けられないようです。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません