闇PHP勉強会 #yamiphp でASTとsignalについて話してきたこと

時間が開いてしまいましたが、先週 第七回闇PHP勉強化に参加し、トークしてきました。

タイトルは「PHP AST 徹底解説(補遺)」および、「signal の話 或いは Zend Signals とは何か」です。

前者は、過日 PHPカンファレンス2016 で発表した「PHP AST 徹底解説」の補足集で、PHPカンファレンス2016 では時間の都合上省略したり、発表後に指摘された内容について調べたものになります。

後者は PHP における signal 処理についての概要と、7.1 における変化を解説しました。

PHP AST 徹底解説(補遺) の、ASTに関する部分については 「PHP AST 徹底解説」にマージしてありますので、興味があればこちらを参照してください。


signal については、調べていくと OS の挙動を確認する必要があったりして、なかなか複雑だったりします。
また、signal は max_execution_time の実装においても利用されているのですが、時間の計測についてもなかなか奥深いものがあって、詳しく説明すると長くなりすぎると思ったので、あくまで signal にかかわる部分のみを解説しました。

そのため、想定よりもトーク時間が短くなってしまいました。(時間足りない詐欺してすみません。)

どっかで調べたことをもう一度整理してまとめたいところ。


自分以外のトークについて

「realpathキャッシュとOPcacheの面倒すぎる関係」

realpath キャッシュの実装が(phpのほかの機構を利用せず、)独自に実装されてるあたりが面白いなと。

ただこのキャッシュの実装。衝突時に単方向リンクドリスト*1となる固定長(1024)のハッシュマップ*2なので、コリジョンが多く発生するとパフォーマンスがだいぶ落ちそう。
単純に考えても、1024 file 以上なら必ずコリジョンは発生しますし、ハッシュキーの生成法も固定*3なので、もしかするとコリジョンが発生しやすいファイルパスもあるのではないかと思いました。

php スクリプトは、利用するテンプレートエンジンによっては大量に生成されますし、ある程度の規模であれば、realpathキャッシュを切るというのは正しい戦略なのかもしれません。

JITのコードを読んでみた

JIT についてはほかの言語での実装についても全く知らず、 php での実装の仕方を知ることができたのは大きかったです。
LuaJIT のコード生成エンジンを利用しているとは。

最適化という点で考えると、やはり(ネイティブな)型を意識していく方向に向かうのは当然ではありますが、今のところの実装は良くも悪くも php らしさがあるなと思いました。

このPHP拡張がすごい!2017

php は、他のLLと比べて拡張が作られることが少ないと感じていましたが、それでもこれだけの拡張が書かれていたのだと圧倒されました。

ゃ、もっとみんなカジュアルに拡張書けばいいのに。

XPathソースコード検索

ASTを XML に変換すれば、構造の一部を XPath で抽出できるという発想は斬新だなぁと。
聞き手からは XPathより JQuery セレクタ という声も聞こえましたけど、XPath、強力なんですよね。

jQuery セレクタCSSセレクタをベースにしていて、あまり柔軟な指定って出来なくて、長期的なメンテナンス性を考えなくて良いこういう時の XPath はほんと強力。

ストリームフィルタで暗号化しよう!

7.1 でmcrypt が非推奨になって、OpenSSL 使え (http://php.net/manual/ja/migration71.deprecated.php) とあるけど、OpenSSL だと暗号/複合処理が全体をまとめてでしかできないよね、と。

その時は、ブロック単位での暗号化インタフェースを (php拡張作って)実装すれば、それを利用してユーザ定義ストリームフィルタを登録してやればいいんじゃないかななんて言ってたけど、よくよく考えれば、openssl_encrypt をつかっても、IV を更新していくことでブロック単位で暗号化可能なんじゃないかなー?(未検証)

最後に

主催していただいた @hnw さん、会場提供の pixiv さん、ありがとうございました。