SlideShare a Scribd company logo
1 of 32
PHP   in    Ruby
             2012/09/01
           闇PHP勉強会
                 do_aki
@do_aki

http://do-aki.net/
概要
Ruby on PHP sample (PHP Script)
<?php

ruby_eval(<<<'EOC'
 def hello_ruby_on_php
   "HELLO Ruby on PHP!!!"
 end
EOC
);

echo ruby_eval('hello_ruby_on_php()');
Ruby on PHP の 構造
php script


   php-extension


            libruby
反転させてみた
RubyscriptPHP の 構造
ruby   on



    ruby-extension

embed
 SAPI         libphp5
php_embed sample (Ruby Script)
# encoding: UTF-8
require 'php_embed'

p PhpEmbed.eval('1')              #1
p PhpEmbed.eval('true')           # true
p PhpEmbed.eval('null')           # nil
p PhpEmbed.eval('array(1,2,3)')   # [1, 2, 3]
導入
Install
1. php-embed SAPI を用意
  – コンパイル                            CentOS6

  – OS Package (php-embedded / php-devel)
2. ruby 1.9 環境
  – 1.8 では動きません
  – rbenv/ruby-builid が便利
3. gem install php-embed
php-embed SAPI
• ./configure --enable-embed=shared (or static)

• Windows 版もある

• 開発止まってる……?

php-build 使ってる場合は
PHP_BUILD_CONFIGURE_OPTS=‘--enable-embed’
で指定しましょー
ruby 1.9
• OS 標準はだいたい 1.8

• rbenv / ruby-build 使えば導入は簡単
 – https://github.com/sstephenson/rbenv
 – https://github.com/sstephenson/ruby-build
ruby 1.9 構築手順
$ cd
$ git clone git://github.com/sstephenson/rbenv.git .rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >>
~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

# ここで再ログイン

$ mkdir -p ~/.rbenv/plugins
$ cd ~/.rbenv/plugins
$ git clone git://github.com/sstephenson/ruby-build.git

$ rbenv install 1.9.3-p194


                                           readme に書いてあるけどね
gem install php-embed
• gem : Ruby のパッケージ管理ツール
 – 1.9 からは標準
 – rubygems.org
 – Pure Ruby or C拡張 関係ないみたい


• bundler で超簡単にライブラリ公開
PHP Programming (in Ruby)
# encoding: UTF-8
require 'php_embed'

p PhpEmbed::VERSION
p PhpEmbed.call('phpversion')

p PhpEmbed.call(‘array_intersect’, [1,2,3],
[2,3,4]) # [2,3]
深部
php-embed の簡単な使い方
#include <sapi/embed/php_embed.h>

int main(int argc, char* argv[]) {
   PHP_EMBED_START_BLOCK(argc, argv);
   zend_eval_string(
      "echo 'Hello Embeded PHP Workd';"
      , NULL, (char*)"Embeded PHP" TSRMLS_CC
   );
         PHP_EMBED_END_BLOCK();
         return 0;
}
// gcc sample.c –lphp5
zend_eval_stringl
• php code を実行
  – create_function / preg / ereg で使われてる
• 第3引数 retval_ptr
  – NULL  -> そのまま実行
  – 非NULL -> “return” と “;” で囲んで実行
• zend_compile_string (= compile_string)
  – Zend/zend_language_scanner.c
• zend_execute (=dtrace_execute or execute)
  – Zend/zend_dtrace.c
  – Zend/zend_vm_execute.h
PHP_EMBED_START(END)_BLOCK
• マクロ
• ZTS (Zend Thread Safety) の有無で分岐

• php_embed_init
• try – catch
• php_embed_shutdown
PHP_EMBED_*_BLOCK を展開(非ZTS)
int main(int argc, char* argv[])
{
      php_embed_init(argc, argv);
      zend_first_try {
             zend_eval_string(...)
      } zend_catch {

      } zend_end_try();
      php_embed_shutdown(TSRMLS_C);

      return 0;
}
さらに展開
php_embed_init(argc, argv);
EG(bailout)=NULL;
{
       JMP_BUF *__orig_bailout = EG(bailout);
       JMP_BUF __bailout;

      EG(bailout) = &__bailout;
      if (SETJMP(__bailout)==0) {
               zend_eval_string(...)
      } else {
               EG(bailout) = __orig_bailout;
      }
      EG(bailout) = __orig_bailout;
}
php_embed_shutdown(TSRMLS_C);
出力のハンドリング
static int php_ub_write(const char *str, unsigned int
str_length TSRMLS_DC) { return str_length }

static void php_log_message(char *message) {}

static void php_sapi_error(int type, const char *fmt, ...) {}


php_embed_module.ub_write = php_ub_write;
php_embed_module.log_message = php_log_message;
php_embed_module.sapi_error = php_sapi_error;
zval と VALUE
• zval                    構造体
  – php の内部表現
  – _zval_struct 構造体
  – = zvalue_value 構造体+ リファレンスカウンタ

• VALUE                  ポインタ
  – ruby の内部表現
  – ポインタと同じサイズを持つ unsigned な整数
  – RVALUE 構造体が実体 (FIXNUM を除いて)
TYPE(VALUE)
•   T_NONE          •   T_FILE
•   T_NIL           •   T_FIXNUM
•   T_OBJECT        •   T_TRUE
•   T_CLASS         •   T_FALSE
•   T_ICLASS        •   T_DATA
•   T_MODULE        •   T_MATCH
•   T_FLOAT         •   T_SYMBOL
•   T_STRING        •   T_RATIONAL
•   T_REGEXP        •   T_COMPLEX
•   T_ARRAY         •   T_UNDEF
•   T_HASH          •   T_NODE
•   T_STRUCT        •   T_ZOMBIE
•   T_BIGNUM
Z_TYPE (zval)
•   IS_NULL
•   IS_LONG
•   IS_DOUBLE
•   IS_BOOL
•   IS_ARRAY
•   IS_OBJECT
•   IS_STRING
•   IS_RESOURCE
•   IS_CONSTANT
•   IS_CONSTANT_ARRAY
•   IS_CALLABLE
相互変換
• それぞれの最終的な内部表現に応じて変
  換
• いずれも 言語が用意しているマクロや関
  数を介して操作

• まだ対応してない型も多い
• RESOURCE 型は難しいかもね
嵌ったこと
• Ruby 側も、setjmp / longjmp を使っている
  らしい
• 入れ子状態によってはコアダンプ
最後に
• ruby から php のコードを実行できるライ
  ブラリを作りました

• もうちょいきちんと作り込んで PHP
  Conference 2012 で発表するつもり
1




Questions?

More Related Content

What's hot

OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみたOPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみたYoshio Hanawa
 
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京hecomi
 
JIT のコードを読んでみた
JIT のコードを読んでみたJIT のコードを読んでみた
JIT のコードを読んでみたy-uti
 
signal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何かsignal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何かdo_aki
 
PHPとシグナル、その裏側
PHPとシグナル、その裏側PHPとシグナル、その裏側
PHPとシグナル、その裏側do_aki
 
PECL operator で演算子オーバーロード
PECL operator で演算子オーバーロードPECL operator で演算子オーバーロード
PECL operator で演算子オーバーロードy-uti
 
PHPの今とこれから2014
PHPの今とこれから2014PHPの今とこれから2014
PHPの今とこれから2014Rui Hirokawa
 
PECL を数えてみた
PECL を数えてみたPECL を数えてみた
PECL を数えてみたy-uti
 
Hack/HHVM 入門
Hack/HHVM 入門Hack/HHVM 入門
Hack/HHVM 入門y-uti
 
about Thrift
about Thriftabout Thrift
about ThriftNaoya Ito
 
Task Spooler を試した
Task Spooler を試したTask Spooler を試した
Task Spooler を試したy-uti
 
PHP の GC の話
PHP の GC の話PHP の GC の話
PHP の GC の話y-uti
 
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesBoost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesShintarou Okada
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかYuki Miyatake
 
CodeIgniter入門
CodeIgniter入門CodeIgniter入門
CodeIgniter入門Sho A
 
Windows で拡張モジュールをビルドしてみた
Windows で拡張モジュールをビルドしてみたWindows で拡張モジュールをビルドしてみた
Windows で拡張モジュールをビルドしてみたy-uti
 
Good Parts of PHP and the UNIX Philosophy
Good Parts of PHP and the UNIX PhilosophyGood Parts of PHP and the UNIX Philosophy
Good Parts of PHP and the UNIX PhilosophyYuya Takeyama
 

What's hot (20)

OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみたOPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
 
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
 
JIT のコードを読んでみた
JIT のコードを読んでみたJIT のコードを読んでみた
JIT のコードを読んでみた
 
signal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何かsignal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何か
 
PHPとシグナル、その裏側
PHPとシグナル、その裏側PHPとシグナル、その裏側
PHPとシグナル、その裏側
 
PECL operator で演算子オーバーロード
PECL operator で演算子オーバーロードPECL operator で演算子オーバーロード
PECL operator で演算子オーバーロード
 
PHPの今とこれから2014
PHPの今とこれから2014PHPの今とこれから2014
PHPの今とこれから2014
 
PECL を数えてみた
PECL を数えてみたPECL を数えてみた
PECL を数えてみた
 
HHVM Hack
HHVM HackHHVM Hack
HHVM Hack
 
Hack/HHVM 入門
Hack/HHVM 入門Hack/HHVM 入門
Hack/HHVM 入門
 
about Thrift
about Thriftabout Thrift
about Thrift
 
Task Spooler を試した
Task Spooler を試したTask Spooler を試した
Task Spooler を試した
 
PHP の GC の話
PHP の GC の話PHP の GC の話
PHP の GC の話
 
実"戦"CakePHP Plugin
実"戦"CakePHP Plugin実"戦"CakePHP Plugin
実"戦"CakePHP Plugin
 
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesBoost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
 
CodeIgniter入門
CodeIgniter入門CodeIgniter入門
CodeIgniter入門
 
emc++ chapter32
emc++ chapter32emc++ chapter32
emc++ chapter32
 
Windows で拡張モジュールをビルドしてみた
Windows で拡張モジュールをビルドしてみたWindows で拡張モジュールをビルドしてみた
Windows で拡張モジュールをビルドしてみた
 
Good Parts of PHP and the UNIX Philosophy
Good Parts of PHP and the UNIX PhilosophyGood Parts of PHP and the UNIX Philosophy
Good Parts of PHP and the UNIX Philosophy
 

Viewers also liked

20111206 GLT vol.40
20111206 GLT vol.4020111206 GLT vol.40
20111206 GLT vol.40kashew_nuts
 
ゆるLTのススメ+α
ゆるLTのススメ+αゆるLTのススメ+α
ゆるLTのススメ+αjoker1007
 
JoJoに学ぶプログラマが知るべきたった一つのこと
JoJoに学ぶプログラマが知るべきたった一つのことJoJoに学ぶプログラマが知るべきたった一つのこと
JoJoに学ぶプログラマが知るべきたった一つのことDaisuke Kasuya
 
Over The Rainbow
Over The RainbowOver The Rainbow
Over The RainbowJun OHWADA
 

Viewers also liked (6)

20111206 GLT vol.40
20111206 GLT vol.4020111206 GLT vol.40
20111206 GLT vol.40
 
ゆるLTのススメ+α
ゆるLTのススメ+αゆるLTのススメ+α
ゆるLTのススメ+α
 
闇RubyKaigi
闇RubyKaigi闇RubyKaigi
闇RubyKaigi
 
JoJoに学ぶプログラマが知るべきたった一つのこと
JoJoに学ぶプログラマが知るべきたった一つのことJoJoに学ぶプログラマが知るべきたった一つのこと
JoJoに学ぶプログラマが知るべきたった一つのこと
 
Over The Rainbow
Over The RainbowOver The Rainbow
Over The Rainbow
 
moon and strategy
moon and strategymoon and strategy
moon and strategy
 

Similar to Php in ruby

WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterWTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterMasanori Oobayashi
 
Modern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI SeminarModern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI SeminarSotaro Karasawa
 
PHPでマルチスレッド
PHPでマルチスレッドPHPでマルチスレッド
PHPでマルチスレッドkarky7
 
モダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasiaモダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasia鉄次 尾形
 
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)inaz2
 
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/1210分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12kenjis
 
Javaで簡単にgpgpu aparapi
Javaで簡単にgpgpu aparapiJavaで簡単にgpgpu aparapi
Javaで簡単にgpgpu aparapiKen'ichi Sakiyama
 
Web技術勉強会23回目
Web技術勉強会23回目Web技術勉強会23回目
Web技術勉強会23回目龍一 田中
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門伸男 伊藤
 
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1kenjis
 
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoyakenjis
 
メタメタプログラミングRuby
メタメタプログラミングRubyメタメタプログラミングRuby
メタメタプログラミングRubyemasaka
 
ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!Yohei Fushii
 
FuelPHP Osu Nagoya vol.1
FuelPHP Osu Nagoya vol.1FuelPHP Osu Nagoya vol.1
FuelPHP Osu Nagoya vol.1Fumito Mizuno
 
はじめてのCodeIgniter
はじめてのCodeIgniterはじめてのCodeIgniter
はじめてのCodeIgniterYuya Matsushima
 
PHP & Queue
PHP & QueuePHP & Queue
PHP & Queuesasezaki
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputingNoboru Irieda
 

Similar to Php in ruby (20)

WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterWTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniter
 
Modern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI SeminarModern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI Seminar
 
PHPでマルチスレッド
PHPでマルチスレッドPHPでマルチスレッド
PHPでマルチスレッド
 
モダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasiaモダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasia
 
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
 
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/1210分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12
 
Thrift
ThriftThrift
Thrift
 
Javaで簡単にgpgpu aparapi
Javaで簡単にgpgpu aparapiJavaで簡単にgpgpu aparapi
Javaで簡単にgpgpu aparapi
 
Web技術勉強会23回目
Web技術勉強会23回目Web技術勉強会23回目
Web技術勉強会23回目
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
 
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
 
メタメタプログラミングRuby
メタメタプログラミングRubyメタメタプログラミングRuby
メタメタプログラミングRuby
 
ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!
 
FuelPHP Osu Nagoya vol.1
FuelPHP Osu Nagoya vol.1FuelPHP Osu Nagoya vol.1
FuelPHP Osu Nagoya vol.1
 
C#勉強会
C#勉強会C#勉強会
C#勉強会
 
はじめてのCodeIgniter
はじめてのCodeIgniterはじめてのCodeIgniter
はじめてのCodeIgniter
 
PHP & Queue
PHP & QueuePHP & Queue
PHP & Queue
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputing
 
VerilatorとSystemC
VerilatorとSystemCVerilatorとSystemC
VerilatorとSystemC
 

More from do_aki

Tritonn から Elasticsearch への移行話
Tritonn から Elasticsearch への移行話Tritonn から Elasticsearch への移行話
Tritonn から Elasticsearch への移行話do_aki
 
再考:列挙型
再考:列挙型再考:列挙型
再考:列挙型do_aki
 
Writing php extensions in golang
Writing php extensions in golangWriting php extensions in golang
Writing php extensions in golangdo_aki
 
N対1 レプリケーション + Optimizer Hint
N対1 レプリケーション + Optimizer HintN対1 レプリケーション + Optimizer Hint
N対1 レプリケーション + Optimizer Hintdo_aki
 
20150212 プレゼンテーションzen
20150212 プレゼンテーションzen20150212 プレゼンテーションzen
20150212 プレゼンテーションzendo_aki
 
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」do_aki
 
20141017 introduce razor
20141017 introduce razor20141017 introduce razor
20141017 introduce razordo_aki
 
20141011 mastering mysqlnd
20141011 mastering mysqlnd20141011 mastering mysqlnd
20141011 mastering mysqlnddo_aki
 
php in ruby
php in rubyphp in ruby
php in rubydo_aki
 
PHP から Groonga を使うにはこんなコードになるよ!
PHP から Groonga を使うにはこんなコードになるよ!PHP から Groonga を使うにはこんなコードになるよ!
PHP から Groonga を使うにはこんなコードになるよ!do_aki
 
N:1 Replication meets MHA
N:1 Replication meets MHAN:1 Replication meets MHA
N:1 Replication meets MHAdo_aki
 
Php radomize
Php radomizePhp radomize
Php radomizedo_aki
 
セキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editor
セキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editorセキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editor
セキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editordo_aki
 
マスタN対スレーブ1レプリケーションの作り方 ~あれから~
マスタN対スレーブ1レプリケーションの作り方 ~あれから~マスタN対スレーブ1レプリケーションの作り方 ~あれから~
マスタN対スレーブ1レプリケーションの作り方 ~あれから~do_aki
 
Immortal
ImmortalImmortal
Immortaldo_aki
 
Excel is image viewer
Excel is image viewerExcel is image viewer
Excel is image viewerdo_aki
 
A bridge between php and ruby
A bridge between php and ruby A bridge between php and ruby
A bridge between php and ruby do_aki
 
Ruby and comparison_and...php
Ruby and comparison_and...phpRuby and comparison_and...php
Ruby and comparison_and...phpdo_aki
 
Sore php
Sore phpSore php
Sore phpdo_aki
 
Ruby enumerable source code reading
Ruby enumerable source code readingRuby enumerable source code reading
Ruby enumerable source code readingdo_aki
 

More from do_aki (20)

Tritonn から Elasticsearch への移行話
Tritonn から Elasticsearch への移行話Tritonn から Elasticsearch への移行話
Tritonn から Elasticsearch への移行話
 
再考:列挙型
再考:列挙型再考:列挙型
再考:列挙型
 
Writing php extensions in golang
Writing php extensions in golangWriting php extensions in golang
Writing php extensions in golang
 
N対1 レプリケーション + Optimizer Hint
N対1 レプリケーション + Optimizer HintN対1 レプリケーション + Optimizer Hint
N対1 レプリケーション + Optimizer Hint
 
20150212 プレゼンテーションzen
20150212 プレゼンテーションzen20150212 プレゼンテーションzen
20150212 プレゼンテーションzen
 
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
 
20141017 introduce razor
20141017 introduce razor20141017 introduce razor
20141017 introduce razor
 
20141011 mastering mysqlnd
20141011 mastering mysqlnd20141011 mastering mysqlnd
20141011 mastering mysqlnd
 
php in ruby
php in rubyphp in ruby
php in ruby
 
PHP から Groonga を使うにはこんなコードになるよ!
PHP から Groonga を使うにはこんなコードになるよ!PHP から Groonga を使うにはこんなコードになるよ!
PHP から Groonga を使うにはこんなコードになるよ!
 
N:1 Replication meets MHA
N:1 Replication meets MHAN:1 Replication meets MHA
N:1 Replication meets MHA
 
Php radomize
Php radomizePhp radomize
Php radomize
 
セキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editor
セキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editorセキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editor
セキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editor
 
マスタN対スレーブ1レプリケーションの作り方 ~あれから~
マスタN対スレーブ1レプリケーションの作り方 ~あれから~マスタN対スレーブ1レプリケーションの作り方 ~あれから~
マスタN対スレーブ1レプリケーションの作り方 ~あれから~
 
Immortal
ImmortalImmortal
Immortal
 
Excel is image viewer
Excel is image viewerExcel is image viewer
Excel is image viewer
 
A bridge between php and ruby
A bridge between php and ruby A bridge between php and ruby
A bridge between php and ruby
 
Ruby and comparison_and...php
Ruby and comparison_and...phpRuby and comparison_and...php
Ruby and comparison_and...php
 
Sore php
Sore phpSore php
Sore php
 
Ruby enumerable source code reading
Ruby enumerable source code readingRuby enumerable source code reading
Ruby enumerable source code reading
 

Recently uploaded

【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成Hiroshi Tomioka
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 

Recently uploaded (9)

【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 

Php in ruby

  • 1. PHP in Ruby 2012/09/01 闇PHP勉強会 do_aki
  • 3.
  • 5.
  • 6.
  • 7. Ruby on PHP sample (PHP Script) <?php ruby_eval(<<<'EOC' def hello_ruby_on_php "HELLO Ruby on PHP!!!" end EOC ); echo ruby_eval('hello_ruby_on_php()');
  • 8. Ruby on PHP の 構造 php script php-extension libruby
  • 10. RubyscriptPHP の 構造 ruby on ruby-extension embed SAPI libphp5
  • 11. php_embed sample (Ruby Script) # encoding: UTF-8 require 'php_embed' p PhpEmbed.eval('1') #1 p PhpEmbed.eval('true') # true p PhpEmbed.eval('null') # nil p PhpEmbed.eval('array(1,2,3)') # [1, 2, 3]
  • 13. Install 1. php-embed SAPI を用意 – コンパイル CentOS6 – OS Package (php-embedded / php-devel) 2. ruby 1.9 環境 – 1.8 では動きません – rbenv/ruby-builid が便利 3. gem install php-embed
  • 14. php-embed SAPI • ./configure --enable-embed=shared (or static) • Windows 版もある • 開発止まってる……? php-build 使ってる場合は PHP_BUILD_CONFIGURE_OPTS=‘--enable-embed’ で指定しましょー
  • 15. ruby 1.9 • OS 標準はだいたい 1.8 • rbenv / ruby-build 使えば導入は簡単 – https://github.com/sstephenson/rbenv – https://github.com/sstephenson/ruby-build
  • 16. ruby 1.9 構築手順 $ cd $ git clone git://github.com/sstephenson/rbenv.git .rbenv $ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile $ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile # ここで再ログイン $ mkdir -p ~/.rbenv/plugins $ cd ~/.rbenv/plugins $ git clone git://github.com/sstephenson/ruby-build.git $ rbenv install 1.9.3-p194 readme に書いてあるけどね
  • 17. gem install php-embed • gem : Ruby のパッケージ管理ツール – 1.9 からは標準 – rubygems.org – Pure Ruby or C拡張 関係ないみたい • bundler で超簡単にライブラリ公開
  • 18. PHP Programming (in Ruby) # encoding: UTF-8 require 'php_embed' p PhpEmbed::VERSION p PhpEmbed.call('phpversion') p PhpEmbed.call(‘array_intersect’, [1,2,3], [2,3,4]) # [2,3]
  • 20. php-embed の簡単な使い方 #include <sapi/embed/php_embed.h> int main(int argc, char* argv[]) { PHP_EMBED_START_BLOCK(argc, argv); zend_eval_string( "echo 'Hello Embeded PHP Workd';" , NULL, (char*)"Embeded PHP" TSRMLS_CC ); PHP_EMBED_END_BLOCK(); return 0; } // gcc sample.c –lphp5
  • 21. zend_eval_stringl • php code を実行 – create_function / preg / ereg で使われてる • 第3引数 retval_ptr – NULL -> そのまま実行 – 非NULL -> “return” と “;” で囲んで実行 • zend_compile_string (= compile_string) – Zend/zend_language_scanner.c • zend_execute (=dtrace_execute or execute) – Zend/zend_dtrace.c – Zend/zend_vm_execute.h
  • 22. PHP_EMBED_START(END)_BLOCK • マクロ • ZTS (Zend Thread Safety) の有無で分岐 • php_embed_init • try – catch • php_embed_shutdown
  • 23. PHP_EMBED_*_BLOCK を展開(非ZTS) int main(int argc, char* argv[]) { php_embed_init(argc, argv); zend_first_try { zend_eval_string(...) } zend_catch { } zend_end_try(); php_embed_shutdown(TSRMLS_C); return 0; }
  • 24. さらに展開 php_embed_init(argc, argv); EG(bailout)=NULL; { JMP_BUF *__orig_bailout = EG(bailout); JMP_BUF __bailout; EG(bailout) = &__bailout; if (SETJMP(__bailout)==0) { zend_eval_string(...) } else { EG(bailout) = __orig_bailout; } EG(bailout) = __orig_bailout; } php_embed_shutdown(TSRMLS_C);
  • 25. 出力のハンドリング static int php_ub_write(const char *str, unsigned int str_length TSRMLS_DC) { return str_length } static void php_log_message(char *message) {} static void php_sapi_error(int type, const char *fmt, ...) {} php_embed_module.ub_write = php_ub_write; php_embed_module.log_message = php_log_message; php_embed_module.sapi_error = php_sapi_error;
  • 26. zval と VALUE • zval 構造体 – php の内部表現 – _zval_struct 構造体 – = zvalue_value 構造体+ リファレンスカウンタ • VALUE ポインタ – ruby の内部表現 – ポインタと同じサイズを持つ unsigned な整数 – RVALUE 構造体が実体 (FIXNUM を除いて)
  • 27. TYPE(VALUE) • T_NONE • T_FILE • T_NIL • T_FIXNUM • T_OBJECT • T_TRUE • T_CLASS • T_FALSE • T_ICLASS • T_DATA • T_MODULE • T_MATCH • T_FLOAT • T_SYMBOL • T_STRING • T_RATIONAL • T_REGEXP • T_COMPLEX • T_ARRAY • T_UNDEF • T_HASH • T_NODE • T_STRUCT • T_ZOMBIE • T_BIGNUM
  • 28. Z_TYPE (zval) • IS_NULL • IS_LONG • IS_DOUBLE • IS_BOOL • IS_ARRAY • IS_OBJECT • IS_STRING • IS_RESOURCE • IS_CONSTANT • IS_CONSTANT_ARRAY • IS_CALLABLE
  • 29. 相互変換 • それぞれの最終的な内部表現に応じて変 換 • いずれも 言語が用意しているマクロや関 数を介して操作 • まだ対応してない型も多い • RESOURCE 型は難しいかもね
  • 30. 嵌ったこと • Ruby 側も、setjmp / longjmp を使っている らしい • 入れ子状態によってはコアダンプ
  • 31. 最後に • ruby から php のコードを実行できるライ ブラリを作りました • もうちょいきちんと作り込んで PHP Conference 2012 で発表するつもり