ある戦いの記憶から探る
 PHPの闇と戦うコツ


     FAL
ある戦いの記憶から探る
 PHPの闇と戦うコツ
  タイトル変えました…すみません




       FAL
自己紹介

●   HN:FAL
●   Twitter:@fal_aqua04
●   PHPは仕事で2年、趣味ではもっと前から。
●   最近は、スマホ向けサイト構築がメイン。
●   PHPの前はWeb系Java屋でした。
●   Objective-C, Python等も触ったり。
●   見た目は真っ黒!中身はおっさん!
ある戦いってなーに?



          Imagick

というPECL拡張モジュールと私との戦いです。
PECL::Imagickってなんぞや?

●   PHPで画像処理をするライブラリ
●   公式Manualの「画像処理および作成」参照
●   GDより高機能&高画質。ただし重い。
●   実際は、ImageMagickAPIのWrapper
PECL::Imagickってなんぞや?

●   PHPで画像処理をするライブラリ
●   公式Manualの「画像処理および作成」参照
●   GDより高機能&高画質。ただし重い。
●   実際は、ImageMagickAPIのWrapper

アニメGIFの編集という案件のため、利用開始
大変でした。

● メソッド多すぎ
大変でした。

● メソッド多すぎ
大変でした。

● メソッド多すぎ




            まだまだあります…
大変でした。

● 癖が強い
大変でした。

● 癖が強い(特にアニメGIF関係)
  ○ イテレータの概念とか。
  ○ 画像出力の方法の差とか。
  ○ 画像処理前に各コマをバラして、合成後に最適化する、
   とか。
大変でした。

● 癖が強い(特にアニメGIF関係)
  ○ イテレータの概念とか。
  ○ 画像出力の方法の差とか。
  ○ 画像処理前に各コマをバラして、合成後に最適化する、
   とか。

正直、PHPを書いているというより、
PHPでフォトレタッチソフトを触ってるイメージですね。
大変でした。

● ImageMagickのバージョンの罠
大変でした。

● ImageMagickのバージョンの罠
大変でした。

● サンプルソースで使ってないメソッドの重要性
  ○ パフォーマンスが出ないので調査。
大変でした。

● サンプルソースで使ってないメソッドの重要性
  ○ パフォーマンスが出ないので調査。
  ○ 参考に見ていたサイト上のソースにて
  destroy()
  という怪しいメソッドを発見。
大変でした。

● サンプルソースで使ってないメソッドの重要性
  ○ パフォーマンスが出ないので調査。
  ○ 参考に見ていたサイト上のソースにて
     destroy()
     という怪しいメソッドを発見。
 ○   ドキュメントの「基本的な使用法」に乗ってる
     サンプルソースにはそんなメソッド使われてないよ。
大変でした。

● サンプルソースで使ってないメソッドの重要性
  ○ パフォーマンスが出ないので調査。
  ○ 参考に見ていたサイト上のソースにて
     destroy()
     という怪しいメソッドを発見。
 ○   ドキュメントの「基本的な使用法」に乗ってる
     サンプルソースにはそんなメソッド使われてないよ。
 ○   でも、開いた画像っていつ解放してるんだ?
     もしかして、明示的に解放しないとダメなんじゃね?
大変でした。

● サンプルソースで使ってないメソッドの重要性
  ○ パフォーマンスが出ないので調査。
  ○ 参考に見ていたサイト上のソースにて
     destroy()
     という怪しいメソッドを発見。
 ○   ドキュメントの「基本的な使用法」に乗ってる
     サンプルソースにはそんなメソッド使われてないよ。
 ○   でも、開いた画像っていつ解放してるんだ?
     もしかして、明示的に解放しないとダメなんじゃね?
 ○   ビンゴ!
大変でした。

● 同時アクセスを捌けない
  ○ 単体アクセスは何とかなったけど、10程度の同時アクセ
   スに耐えられない。
大変でした。

● 同時アクセスを捌けない
  ○ 単体アクセスは何とかなったけど、10程度の同時アクセ
     スに耐えられない。
 ○   多重アクセス時の状況を想像してみる。
     →それって、PhotoShopで大量の画像を開いてるような
     モンじゃね?
大変でした。

● 同時アクセスを捌けない
  ○ 単体アクセスは何とかなったけど、10程度の同時アクセ
     スに耐えられない。
 ○   多重アクセス時の状況を想像してみる。
     →それって、PhotoShopで大量の画像を開いてるような
     モンじゃね?
 ○   無理じゃん。
大変でした。

● 同時アクセスを捌けない
  ○ 単体アクセスは何とかなったけど、10程度の同時アクセ
     スに耐えられない。
 ○   多重アクセス時の状況を想像してみる。
     →それって、PhotoShopで大量の画像を開いてるような
     モンじゃね?
 ○   無理じゃん。
 ○   対策:簡易キュー的なもので、同時実行数を減らす。
戦いに勝つために必要だったのは?
戦いに勝つために必要だったのは?

1. 状況解析!
 ログ見たりプロファイラ見たりソース見たり…。
戦いに勝つために必要だったのは?

1. 状況解析!
 ログ見たりプロファイラ見たりソース見たり…。
2. 公式ドキュメントを見直す!
 見落としがあったり、コメントに重要な例があったり。
戦いに勝つために必要だったのは?

1. 状況解析!
 ログ見たりプロファイラ見たりソース見たり…。
2. 公式ドキュメントを見直す!
 見落としがあったり、コメントに重要な例があったり。
3. ソースを読む!
 Webに転がってる例を片っ端から見比べたり、
 PECLのソースを読んだり。
戦いに勝つために必要だったのは?

1. 状況解析!
 ログ見たりプロファイラ見たりソース見たり…。
2. 公式ドキュメントを見直す!
 見落としがあったり、コメントに重要な例があったり。
3. ソースを読む!
 Webに転がってる例を片っ端から見比べたり、
 PECLのソースを読んだり。

   でも、それだけではありませんでした。
正攻法でダメな時もある。
正攻法でダメな時もある。

● 色々やっても、原因がわからない時がある
  ○ 自分の知識不足
  ○ 開示されていないソースコード
正攻法でダメな時もある。

● 色々やっても、原因がわからない時がある
  ○ 自分の知識不足
  ○ 開示されていないソースコード
● 原因はわかっても、対策が判らない事も
  ○ 「これこれこういう不具合がでたよ!」
  というサイトは引っかかるが、解決が乗ってない
正攻法でダメな時もある。

● 色々やっても、原因がわからない時がある
  ○ 自分の知識不足
  ○ 開示されていないソースコード
● 原因はわかっても、対策が判らない事も
  ○ 「これこれこういう不具合がでたよ!」
  というサイトは引っかかるが、解決が乗ってない


そんな時、解決のヒントになったのは…
正攻法でダメな時もある。

● 色々やっても、原因がわからない時がある
  ○ 自分の知識不足
  ○ 開示されていないソースコード
● 原因はわかっても、対策が判らない事も
  ○ 「これこれこういう不具合がでたよ!」
  というサイトは引っかかるが、解決が乗ってない


そんな時、解決のヒントになったのは…
        PHP以外の知識
今回の場合…

● Objective-Cのリソース管理
● GIFアニメを遊びで作った経験
● 個人サイト用の素材を自力で作った経験
● Linuxの操作経験
● 既存ゲームの描画方法
…etc
今回の場合…

● Objective-Cのリソース管理
● GIFアニメを遊びで作った経験
● 個人サイト用の素材を自力で作った経験
● Linuxの操作経験
● 既存ゲームの描画方法
…etc

PHPと関係の低い知識でもヒントに!
PHP、よくdisられるけど…

「また○○istaとか××istにdisられた!
 もう○○や××の言語なんて触んねー!」
PHP、よくdisられるけど…

「また○○istaとか××istにdisられた!
 もう○○や××の言語なんて触んねー!」

ああ、勿体無い…。
インフラとか、興味ない?

「インフラなんて勉強する必要無いですよ?
 僕たち、インフラ担当じゃないんですから。
 インフラはインフラの人に任せればいいんですっ
て。」
インフラとか、興味ない?

「インフラなんて勉強する必要無いですよ?
 僕たち、インフラ担当じゃないんですから。
 インフラはインフラの人に任せればいいんですっ
て。」

ああ、勿体無い…。
エンジニアの装備は知識です

● 一つの武器(言語)だけを鍛えていても、
  いつか限界が来ます。
エンジニアの装備は知識です

● 一つの武器(言語)だけを鍛えていても、
  いつか限界が来ます。
● たくさんの武器を持っていても、
  防具無しでは即死の危険性があります。
エンジニアの装備は知識です

● 一つの武器(言語)だけを鍛えていても、
  いつか限界が来ます。
● たくさんの武器を持っていても、
  防具無しでは即死の危険性があります。
● まったく関係の無いような道具が
  思わぬところで役に立ったりします。
エンジニアの装備は知識です

● 一つの武器(言語)だけを鍛えていても、
  いつか限界が来ます。
● たくさんの武器を持っていても、
  防具無しでは即死の危険性があります。
● まったく関係の無いような道具が
  思わぬところで役に立ったりします。

      たくさんの知識をそろえて、
  PHPの抱える闇に立ち向かいましょう!
ご清聴ありがとうございました!

ある戦いの記憶から探るPHPの闇と戦うコツ