Laravel:getimagesize() read error の原因と対策について

Laravel:getimagesize() read error の原因と対策について

Laravel:getimagesize() read error の原因と対策について

まだ自動出品までは至っていませんが、商品DBとしてはかなりいい線まで作成できたと思っている今日この頃。

しかし!やっぱり予期せぬエラーは出てくるもの。
今回はそんなお話です。

ネットショップ運営では画像の管理と取得が必須

ネットショップ運営では画像の管理と取得が不可欠です。

今回のシステムでは、仕入先の画像URLや画像URLの命名ルールを記載する事で自動的に画像を取得保存するようにシステムを組みました。(定時crawler処理です)

先に結論を記載してしまうと、どうやら問題はこの画像取得にあったようです。

画像確認ページで getimagesize() read error が発生その原因は。

商品画像の管理が必要なので、画像の確認ページ内にUploaderとDownloaderを作成しています。
その画像確認ページを開こうとした所 【 getimagesize() read error 】と言われてしまいました。

特定の商品のみErrorが発生し、他の商品では問題なく画像確認ができます。
と言う事は「問題は画像??」と言うことで調べてみたところ、画像ファイルサイズが 0KB 。
どうやらcrawlerにダウンロードさせた画像がしっかり取得できておらず0KBの空データとして存在していました。

ファイル無しエラーを回避するために【 file_exists 】使っていたのにエラーが発生した理由がコレでした。

■0KBファイルの問題点

  • file_exists = True ※ファイルとして存在はしている
  • getimagesize = False ※画像情報が無いためデータを取得できない

ページ表示エラーを回避する簡単な方法

多くの方がご存知の通り、getimagesize の前に@を付け @getimagesize として記載していくだけで回避可能です。

コードの前に記載した@はエラー制御演算子(@ operator)といいます。

簡単に言うと『そこで発生したエラーは無視します』という指示をすると言う事です。

原因が分かったのでとりあえずの回避はエラー制御演算子で処理しました。

根本原因はConnectの切断

画像を取得するために、APIやスクレイピングを利用しました。

アクセス制限などで【取得に動いたけど完了しなかったもの】が残骸を残した事が原因を生んでいるようです。

回避の方法は2ルートです。

  1. 完全に取得出来てから保存を実行する
  2. 保存された画像を確認しサイズが0KBだったら削除する

前者は情報取得マーカーを保存時に実行すればいいだけなのでプログラム的な苦労はそれほどありません。
後者は実行するタイミングで難易度と不測の事態発生率が変わりそうです。

どっちで実装するかなぁ(悩)

まとめ

自作アプリの使い始めはやっぱりこういう想定外のエラー修復が出てきますね。

その都度修正する事で、皆様に使っていただく時はエラーの少ないものになっていると思います。

さぁ、今日も頑張ろう!