PHPカンファレンス2014 で「mysqlnd 徹底解説」を話してきたこと #phpcon2014

去る 2014/10/11。大田区産業プラザPiOにて PHPカンファレンス2014が開催されました。

その中で、「mysqlnd 徹底解説」というタイトルでトークさせていただきました。

雑感

思い返せば PHP カンファレンスで初LT をしたのが 2011年。
いつかLTではなく本編で話そうと思いつつ、気づけば3年経っていました。
相変わらず行動力に欠けるようで。

応募したのは完全にノリ。


けど、採択されてからが大変だった。
採択されたのが9月25日、2週間ちょいしかない。資料どころか、mysqlnd についてまだ全然分かってない。という状況。

応募したときはちょうど仕事で mysqlnd の挙動について軽く追っていた頃だったので「これきっかけに詳細にコード追ってみよう」という軽い気持ちだったのですが、追えば追うほどよく分からないコードが目の前にどんどん詰まれていくという状況。
資料が形になったのは数日前で、前日になって時間が足りない事に気づいて一部削るという判断をしました。
いやー、ホントに発表できるのか心配ダッタヨ。

ただ、今回のセッションの為に歴史や周辺のこと(ライセンス問題とか)を深く調べたことで、「なぜ今のコードになっているのか」を、だいたい把握できたのはとても大きな収穫だった。

内容について

前半は 「mysqlnd とは何か」について、後半は「mysqlnd で何が変わるのか」についてを中心にトークしました。
前半はスライド見れば分かると思いますが、後半は別途解説がないとわかりにくいと思います。

最後のメモリ爆発のくだりは実際に自分が陥った経験です。サーバーサイドプリペアドステートメント で PDO という、最も地雷なところを踏み抜いてしまったことにより、このセッションが生まれたと言っても過言ではありません。


資料中にはないのですが、実際にはメモリ消費を抑える方法があります。

store_result ではなく、use_result を使うという手法です。
実は、 mysqli においては、プリペアドステートメントをつかうとデフォルトでは use_result となります。
ですので問題が表面しにくくはあるのですが、ただ、mysqli_stmt::store_result や mysqli_stmt::get_result を呼んだ場合は store_result が行われるので注意が必要です。

また PDO の場合は、デフォルトで store_result が使われます。
明示的に use_result を使うためには pdo::setAttribute で明示的に PDO::MYSQL_ATTR_USE_BUFFERED_QUERY を false にする必要があります。(これ、マニュアル読むだけだとデフォルト false っぽいけど、実際にはデフォルトは true)

ただし、use_result を利用すると、そのコネクションに於ける MySQL のリソースを占有するため、結果セットを解放するまで次のクエリを実行することが出来ません。また、フェッチの度に MySQL にアクセスするため、その分 MySQL 側の負担が増えます。
必要に応じて使い分けるのが良いでしょう。

とはいえ、それぞれをラップしたライブラリとかだと、なかなか難しいんだよねこれ。

レポート記事への補足

PHPカンファレンス2014 当日レポート[更新終了]:PHPカンファレンス2014 スペシャルレポート|gihyo.jp … 技術評論社 でレポート記事がでています。

結構詰め込んだセッションだったと思うのですが、要点要点しっかり抑えられていて素晴らしいです。

が、一部誤った部分があるので補足。


誤: libmysqlはGPLv2という若干特殊なライセンスであり,同梱して別のところに配布ができない
正: libmysqlはFOSS例外付きGPLv2という若干特殊なライセンスであり, ソースコードの開示なしに同梱して頒布出来ない


この辺は自分自身しっかりと把握している訳で確実ではないのですが、
libmysqlclient を (商用ライセンスではなく) GPLv2 として利用した場合、それを利用した php スクリプトプロプライエタリとすることは出来ない という認識です。

ライセンス ムズカシイネー

PHPコアから読み解くPHP5.5」を聴いて

yield 使ったコードと使わないコードどっちが速い? -> ほとんど変わらないから yield 使った方がコードがすっきりしていいよね
(bool)$value と boolval($value) どっちが速い? -> キャストの方が早いからキャスト使おうね
zend_execute -> 5.4系までと5.5からとで異なるから注意な

という内容。

コアから読み解く、というわりにコアの一部だけだった感は否めない。
オペコードの数では速度は決まらないのにやけに数を強調してたり、具体的な処理時間出す割にベンチの仕方全く出さないしでうーん。

PHPにおけるI/O多重化とyield」を聴いて

yield には多くの可能性を感じますね

co-httpclient は、http request に特化しているけれど、event loop っぽいところは汎用化できると思うので、
具体処理を差し込むかたちにできると面白いかな−と思った。

perl の Coro 思い出すよね。

「HHVM + Hack == PHP++」を聴いて

久々にわくわくするセッションだった。

静的型付けで強力な型推論あれば最高だよねーな人間としては、こういう方向性ってのはホント面白い。


プログラミング言語って人間が扱うモノだから、正しい方向って一つじゃないんだよねーと思ってる。
そういう意味でも、facebookphp script のほとんどを hack に置き換えた後、 hack に何を加えていこうとしていくのかは気になるところ。

LT 「よいことも悪いこともぜんぶPHPが教えてくれた」を聴いて

これはもう、じっくりと時間をかけて聴きたかった。
クロージングの前にこれを基調講演として枠取ってやって欲しかった。

http://d.hatena.ne.jp/moriyoshi/20110204/1296808771 と、この続きを含めてどっかで講演して欲しい。

「哲学がないという哲学」なんという哲学や……。

最後に

PHP カンファレンス実行委員の皆様、お疲れ様でした&ありがとうございました。

またセッションを聞きに来てくださった方、ありがとうござました。

リンク

PHPコアから読み解くPHP5.5
http://www.slideshare.net/techblogyahoo/phpphp55
PHPにおけるI/O多重化とyield
https://joind.in/talk/view/12038
Cooperative multitasking using coroutines (in PHP!)
http://nikic.github.io/2012/12/22/Cooperative-multitasking-using-coroutines-in-PHP.html
よいことも悪いこともぜんぶPHPが教えてくれた
http://www.slideshare.net/moriyoshi/php-40137945
今さらだけどMySQLとライセンス
http://www.slideshare.net/h141/mysql-22023284
漢(オトコ)のコンピュータ道
FOSS License Exception:http://nippondanji.blogspot.jp/2009/05/foss-license-exception.html