Joomlaを使ってサイトを作っているのですが、他のサイト上にある画像をホットリンクしないで自分のサイト上に置けると良いなと思っていました。(著作権的に問題が生じやすいケースです。Creative Commons(クリエイティブコモンズ)や著作権法違反と出処の表示義務についての記事も書いています。よろしければ読んでください。)
何か良い方法はないかと思っていたところ、簡単に使えるPHPクラス「PHP Image Cache」を見つけたので使ってみました。
PHP Image Cacheの機能
PHP Image CacheはPHPで画像の圧縮してキャッシュするクラスです。ソースコードも短くて容量は軽量です。
公開サイト上にはキャッシュを作成する元画像が自サーバー上限定かどうかは(読めた場所には)書かれていませんでしたが、使ってみたところ他のサイトから画像を拾ってきて、キャッシュしてくれました。
初期設定では、JPEGの画質85/100に圧縮するという設定になっており、元の画像にもよると思いますが1割~2割くらいの容量削減ができました。試しに20に設定してみたら、半分以下になりましたが、とても見れない画像になってしまいました。PhotoshopのWeb用にセーブとかとはだいぶ違います。
PHP Image Cacheを使うには、PHPファイルを読み込んだ後、クラスを初期化してキャッシュしたい画像を指定すると画像を取得して圧縮してくれます。圧縮された結果は、指定したディレクトリにハッシュ化された名前で保存されます。
圧縮された画像へのファイルパスがクラスインスタンスの中に変数として保存されるので、画像を載せたい場所でechoすれば圧縮された画像を使うことが出来ます。
PHP Image Cacheを使うには、ファイルの画像ライブラリのGDが必要です。
URLが異常
公式サイトに出ている例を使ったところ、簡単にキャッシュさせることが出来ました。
が、不具合が幾つかあるようです。一つは、サーバーの設定のせいかもしれませんが、出力されるURLが異常になりました。
例えば、https://tek2tech.com/cache/ABCDEFG.jpegがキャッシュファイルだとするとhttps://tek2tech.com/tek2tech.comcache/ABCDEFG.jpegが出力されてしまいます。
$_SERVER['HTTP_HOST'].str_replace($_SERVER['DOCUMENT_ROOT'], '',$this->cached_filename)
になっていたところを、
str_replace($_SERVER['DOCUMENT_ROOT'], '',$this->cached_filename)
になるようにしたらとりあえず動くようになりました。
画面が真っ白
もう一つの不具合はかなり痛くて、解決策がわかりません。エラーがでるわけではないのですが、開いた画面が真っ白で何も表示されません。(ソースもGoogleのGPT設定らしいものの断片が残っていただけで空っぽです)
PHPのエラー報告を最大に設定しても、何もエラー表示はでてきませんし、ファイルのキャッシュ自体は滞り無く終わっているので、謎です。じっとソースと格闘したらわかるかもしれませんが・・・・。
初期設定のままだとキャッシュは期限がなく、一旦作成されたファイルが無効になることはありません。なので、キャッシュされた画像を最初に見た人に見えないだけです。
キャッシュ元の画像が変わる可能性があるときにはかなり痛い異常ですが、キャッシュする画像が動的に変わらないなら、多少面倒ですが自分で開けば良いので我慢できる範囲です。
遅いらしい
PHPで画像ファイルを取得して圧縮するクラスですから、遅いはずです。掲示板には、「8つ画像を載せたらいつまでも終わらない」という人がいましたが、画像のサイズによりますが、遅いに違いないと予想できます。
自分で運用しているサーバーなら、マルチスレッド的動作をさせるための拡張ライブラリ「pthreads」を入れれば並列動作できますが、レンタルサーバーでは厳しいです。
multi curl(curl_multi_)を使えば少しは早くなりそうですが、PHP Image Cacheに導入するのは難しそうです。
自分で作るなら、ユーザーには元画像を見せつつignore_user_abortを使ってバックグラウンドで作業して出来上がったら次のユーザーには差し替えるというような風でしょうか?
が、ignore_user_abortってJoomlaを始めとしたCMSと共存できなさそうな。
キャッシュされていないキャッシュ対象ファイルが表示されるときにファイル情報を記録しておいて元画像を見せておき、Cronjobか自分でスクリプトを開始させてまとめて処理するという方法なら、問題なくコーディングできる気がします。
使い所は?
真っ白になることが解決できなければ、意識しないで使うのは難しそうです。
このPHPクラスを使うと、自分のサーバーに画像ファイルを圧縮して保存できますので、ブログカード的なものが作れそうです。
- はてなブログカード
- Embed.ly
といったサービスに頼らなくても良くなるので、結構大きなメリットです。
混在コンテンツを避けられる
はてなはHTTPSに対応していないので、はてなブログカードを使うとアドレスバーに混在コンテンツの警告が出てしまいます。(このサイト「てく2テック」では、この理由ではてなブログカードは使っていません)画像を拾ってきて自サーバーに保存するこの方法なら、混在コンテンツの問題は防げそうです。
著作権的には
はてなもEmbed.lyも、元画像のサイトで共有を意図していない画像を持って来ますしEmbed.lyは勝手に全文拾ってくるらしいので、結構微妙な気がしています。
自分のサイトにキャッシュしようと、はてなやEmbed.ly上のキャッシュだろうと、自分のサイトに表示させる以上は著作権侵害の可能性は排除しきれません。(OGPに設定してある画像なら他のサイトに表示されることを前提にしているので大丈夫だと思いますが)
ブログカードの表示なら
ブログカードの表示なら、WordPressなら最近出てきたプラグイン「Pz-LinkCard」は画像をキャッシュしてくれるようなので最適だと思います。
だいぶ前に試した時にこのサイトでは動かず、やむなく「One Box」や「Content Cards」というプラグインにしています。近いうちにもう一度「Pz-LinkCard」も試してみたいと思います。
Joomlaには、残念ながらブログカード的なプラグインは見当たりません。ないなら作ってしまえ!と言えるほどのスキルと根気、時間が欲しいです。面倒なので、邪道ですがツイートして貼り付けています。(Twitter CardもしくはOGPに対応したページ限定です)
WordPress 4.4.0以上の新機能
WordPress 4.4.0で追加された新機能の中に、URLエンベッドというのがあります。URLを直書きするとブログカード的な表示にしてくれます。
4.4.0導入当初は上手く作動していたのですが、(当サイトでは)いつの間にか上手く動かなくなっていたり・・・。
貼り付けられる側のサイトが対応していないとダメだという話もありますし、まだまだこれからの機能だと思います。
コメント