SlideShare a Scribd company logo
PHPエクステンションの
    開発tips
                             hnw
      第3回闇PHP勉強会 (2012/09/01) 発表資料
自己紹介


@hnw

カレーとバグが大好物

好きな境界値:2^53+1
(doubleで表現できない最小の自然数)
今日おはなしすること


最近PHPエクステンション書きました

PHP自体をいじるようなエクステンションは初挑戦でした

作ってみて気づいた点をとりとめなく話します
php-timecopの紹介

php-timecopというエクステンションを作りました

 https://github.com/hnw/php-timecop

 現在時刻をずらす関数を提供し、
 既存の日付系関数/クラスをオーバーライド

 現在時刻に依存する関数の例:strtotime( +1month )
php-timecop動作例
Cソース上の関数の分類
PHP_FUNCTION

 PHPの関数として実行可能

PHPAPI

 他のエクステンションから呼び出せる

通常の関数

 そのエクステンション内で閉じている
Cソース上の関数の分類


今回は既存の日付系関数のラッパー関数を作った

 dateエクステンションのC関数を呼びたい!

 呼びたい関数がPHPAPIになってない…

→PHP_FUNCTIONを呼ぶことにした
エクステンション内から
PHP関数を呼び出す
zend_call_functionを利用した
3重ポインタで悩んだ
zend_fcall_infoのparamsがなぜzval***なのか?

コピーオンライトを実現するためだと想像
既存のクラスを継承する
zend_register_internal_class_exの第2引数で親クラスを
指定する
関数のオーバーライド


EG(function_table)をzend_hash_updateする

 mbstringエクステンションからコピペしました

クラスについてはEG(class_table)を書き換え
PHPバージョン間の違い
当初PHP5.4で開発していた

PHP5.2でビルドしたら怒られた

  PHP_FE_END(5.3で定義された)

  zend_fcall_info_init(5.3から引数の個数が変わった)

  zend_parse_parameters( * への対応が5.3から)

→5.2対応する気なら最初から5.2で開発すべき
php-build+phpenv便利


php-build: PHP5.2から最新版までビルドするツール

phpenv: PHPのバージョンを切り替えるツール

 phpizeも切り替わる!

 エクステンション開発にオススメ
Travis CI便利

PHP 5.2、5.3、5.4を提供

 各バージョンについて
 「phpize && ./configure && make test」できる

pushするだけで3バージョンのmake testが自動実行

 .travis.yml参照

緑色になってると自己満足できる
make testのオプション
NO_INTERACTION=1

 テスト結果をメールするかどうか聞かない

 Travis CIでテストするときは必須

REPORT_EXIT_STATUS=1

 make testがしくじったらexit code非ゼロを返す

 いまは動いてない。GitHub上でissueになっている。
疑問点など

ZTSなにそれうまいの?

 対応できてない気がする

 しかし実運用してる人っているんですかね

mbstring.func_overloadって正しくはoverrideじゃね?

 あの方が間違うとは思えないし、どうなんでしょね
参考にした資料


「PHP Extension Writing」(2009年、PDF109ページ)

 マクロの説明が超親切に書いてあってオススメ

PHPソースコード
ご静聴
 ありがとう
ございました

More Related Content

KEY
php-timecopを実戦投入してみた
PDF
PHPの今とこれから2015
PDF
第21回関西PHP勉強会 ReactPHPは もっと流行って欲しい #phpkansai
PDF
Php非同期の技法
PDF
PHPの拡張モジュールをGoで作る
PDF
よりよいPHPUnitの実行方法を求めて
PDF
いまどきのPHP開発現場 -2015年秋-
PDF
php-buildがいかに便利かを力説する
php-timecopを実戦投入してみた
PHPの今とこれから2015
第21回関西PHP勉強会 ReactPHPは もっと流行って欲しい #phpkansai
Php非同期の技法
PHPの拡張モジュールをGoで作る
よりよいPHPUnitの実行方法を求めて
いまどきのPHP開発現場 -2015年秋-
php-buildがいかに便利かを力説する

What's hot (20)

PPTX
あるあるLT〜サーバーサイドエンジニア〜 Vol.3
PDF
anyenv + phpenv + php-build が便利すぎる件
PDF
PHPデプロイツールの世界
PDF
Cake php + php unitによる実践的ユニットテスト
PPTX
Behat Driven Development
PPTX
PHP x AWS でスケーラブルなシステムをつくろう
PDF
PHPとJavaScriptの噺
PDF
PHP7の内部実装から学ぶ性能改善テクニック
PDF
PSGIへの誘い
PDF
PHP7の拡張モジュール事情
PDF
WordPress on HHVM + Hack
PDF
YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情
PDF
PHPUnit でテスト駆動開発を始めよう
PDF
PhpStormを使おう --高槻からは快速急行が早くなります #jbugj
ODP
Pinoco phptal-phpcon-kansai
PDF
Zend OPcacheの速さの秘密を探る
PDF
PHP5.6からPHP7.0への移行
PDF
Windows で拡張モジュールをビルドしてみた
PDF
Drupal 8 - モダンなアーキテクチャのPHPベースOSS CMS
PDF
Windows で PHP をビルドしてみた
あるあるLT〜サーバーサイドエンジニア〜 Vol.3
anyenv + phpenv + php-build が便利すぎる件
PHPデプロイツールの世界
Cake php + php unitによる実践的ユニットテスト
Behat Driven Development
PHP x AWS でスケーラブルなシステムをつくろう
PHPとJavaScriptの噺
PHP7の内部実装から学ぶ性能改善テクニック
PSGIへの誘い
PHP7の拡張モジュール事情
WordPress on HHVM + Hack
YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情
PHPUnit でテスト駆動開発を始めよう
PhpStormを使おう --高槻からは快速急行が早くなります #jbugj
Pinoco phptal-phpcon-kansai
Zend OPcacheの速さの秘密を探る
PHP5.6からPHP7.0への移行
Windows で拡張モジュールをビルドしてみた
Drupal 8 - モダンなアーキテクチャのPHPベースOSS CMS
Windows で PHP をビルドしてみた
Ad

Similar to PHPエクステンションの開発tips (8)

PDF
PHPで時間旅行をする方法
PDF
Modern PHP Programming @ PFI Seminar
PPTX
Immortal
PDF
PHPの今とこれから 2013
PPTX
php-src の歩き方
PDF
20120507 zendform
PPTX
PHP基礎勉強会
PPTX
詳説ぺちぺち
PHPで時間旅行をする方法
Modern PHP Programming @ PFI Seminar
Immortal
PHPの今とこれから 2013
php-src の歩き方
20120507 zendform
PHP基礎勉強会
詳説ぺちぺち
Ad

More from Yoshio Hanawa (20)

PPTX
自宅の消費電力をリアルタイムに グラフ化してみた
PDF
Zend VMにおける例外の実装
PDF
Zend VMにおける例外の実装
PDF
ぼくのかんがえる
さいきょうの銀行振込
PDF
「OKグーグル! 銀行振込1000円」
PDF
浮動小数点数とOSSのバグの話
PDF
PHP拡張をPECLに登録してわかったこと
PDF
GitHubからお金をもらった話
PDF
iOS/macOSとAndroid/Linuxのサンドボックス機構について調べた
PDF
realpathキャッシュと OPcacheの面倒すぎる関係
PDF
家庭用ブロードバンドルータ上でWordPressを動かそう
PDF
Laungage Update PHP編
PDF
GitHubにバグ報告して賞金$500を頂いた話
PDF
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
PDF
PHPの正規表現と最長一致
PDF
PHP7で変わること ——言語仕様とエンジンの改善ポイント
PDF
偶然にも500万個のSSH公開鍵を手に入れた俺たちは
PDF
PHP7はなぜ速いのか
PDF
PHPNGの動向
PDF
zval をダイエットしてみた
自宅の消費電力をリアルタイムに グラフ化してみた
Zend VMにおける例外の実装
Zend VMにおける例外の実装
ぼくのかんがえる
さいきょうの銀行振込
「OKグーグル! 銀行振込1000円」
浮動小数点数とOSSのバグの話
PHP拡張をPECLに登録してわかったこと
GitHubからお金をもらった話
iOS/macOSとAndroid/Linuxのサンドボックス機構について調べた
realpathキャッシュと OPcacheの面倒すぎる関係
家庭用ブロードバンドルータ上でWordPressを動かそう
Laungage Update PHP編
GitHubにバグ報告して賞金$500を頂いた話
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
PHPの正規表現と最長一致
PHP7で変わること ——言語仕様とエンジンの改善ポイント
偶然にも500万個のSSH公開鍵を手に入れた俺たちは
PHP7はなぜ速いのか
PHPNGの動向
zval をダイエットしてみた

PHPエクステンションの開発tips

Editor's Notes