SlideShare a Scribd company logo
1 of 44
Download to read offline
ある戦いの記憶から探る
 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の抱える闇に立ち向かいましょう!
ご清聴ありがとうございました!

More Related Content

What's hot

VimとRubyのアツい関係
VimとRubyのアツい関係VimとRubyのアツい関係
VimとRubyのアツい関係Misao X
 
非同期系統の基礎
非同期系統の基礎非同期系統の基礎
非同期系統の基礎segayuu
 
我が evil-mode を嫌いな理由 〜evil-mode の闇〜
我が evil-mode を嫌いな理由 〜evil-mode の闇〜我が evil-mode を嫌いな理由 〜evil-mode の闇〜
我が evil-mode を嫌いな理由 〜evil-mode の闇〜Shougo
 
かなりすごい発表(かなり) at VimConf2014
かなりすごい発表(かなり) at VimConf2014かなりすごい発表(かなり) at VimConf2014
かなりすごい発表(かなり) at VimConf2014Sugoi Kanari
 
Java初心者がJava8のラムダ式をやってみた
Java初心者がJava8のラムダ式をやってみたJava初心者がJava8のラムダ式をやってみた
Java初心者がJava8のラムダ式をやってみたAya Ebata
 
2021 01-25 lt sho kato
2021 01-25 lt sho kato2021 01-25 lt sho kato
2021 01-25 lt sho katokatosho1
 
5回目Java script構文
5回目Java script構文5回目Java script構文
5回目Java script構文Takuya Shishido
 
mrubyで作るマイコンボード
mrubyで作るマイコンボードmrubyで作るマイコンボード
mrubyで作るマイコンボードkishima7
 
Introducing hhvm hack-async
Introducing hhvm hack-asyncIntroducing hhvm hack-async
Introducing hhvm hack-asyncKenjiro Kubota
 
負荷テストについて
負荷テストについて負荷テストについて
負荷テストについてTakahiro Ishida
 

What's hot (13)

VimとRubyのアツい関係
VimとRubyのアツい関係VimとRubyのアツい関係
VimとRubyのアツい関係
 
非同期系統の基礎
非同期系統の基礎非同期系統の基礎
非同期系統の基礎
 
我が evil-mode を嫌いな理由 〜evil-mode の闇〜
我が evil-mode を嫌いな理由 〜evil-mode の闇〜我が evil-mode を嫌いな理由 〜evil-mode の闇〜
我が evil-mode を嫌いな理由 〜evil-mode の闇〜
 
かなりすごい発表(かなり) at VimConf2014
かなりすごい発表(かなり) at VimConf2014かなりすごい発表(かなり) at VimConf2014
かなりすごい発表(かなり) at VimConf2014
 
Webページで学ぶJavaScript2013 第7回
Webページで学ぶJavaScript2013 第7回Webページで学ぶJavaScript2013 第7回
Webページで学ぶJavaScript2013 第7回
 
Java初心者がJava8のラムダ式をやってみた
Java初心者がJava8のラムダ式をやってみたJava初心者がJava8のラムダ式をやってみた
Java初心者がJava8のラムダ式をやってみた
 
Vimはこわくない
VimはこわくないVimはこわくない
Vimはこわくない
 
2021 01-25 lt sho kato
2021 01-25 lt sho kato2021 01-25 lt sho kato
2021 01-25 lt sho kato
 
5回目Java script構文
5回目Java script構文5回目Java script構文
5回目Java script構文
 
mrubyで作るマイコンボード
mrubyで作るマイコンボードmrubyで作るマイコンボード
mrubyで作るマイコンボード
 
Introducing hhvm hack-async
Introducing hhvm hack-asyncIntroducing hhvm hack-async
Introducing hhvm hack-async
 
Botと対話する
Botと対話するBotと対話する
Botと対話する
 
負荷テストについて
負荷テストについて負荷テストについて
負荷テストについて
 

Recently uploaded

Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Hiroshi Tomioka
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsWSO2
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...Toru Tamaki
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video UnderstandingToru Tamaki
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Gamesatsushi061452
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptxsn679259
 

Recently uploaded (12)

Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 

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