SlideShare a Scribd company logo
1 of 43
Download to read offline
PHP と
Ruby の
架け橋
             2013/01/13
      Tokyo Ruby Kaigi 10
                  do_aki
@do_aki

http://do-aki.net/
About 2 extensions

      php-extension ruby
Runnable ruby script in PHP (>=5.4)




           php_embed gem library
                       Runnable php script in Ruby(>= 1.9)
https://github.com/do-aki/php-ext-ruby
php-ext-ruby sample code
<?php
// php.ini : extension=ruby.so
ruby_eval(<<<'EOS'
     def hello
             “Ruby #{RUBY_VERSION} in PHP! "
     end
EOS
);

echo ruby_eval('hello()');   # Ruby 1.9.3 in PHP!
Web Application?
<?php
       sinatra on ext-ruby
// php.ini : extension=ruby.so
ruby_require(‘sinatra’);
ruby_eval(<<<EOS
     get ‘/’
             ‘Hello sinatra in PHP!’
     end
EOS
);
sinatra on ext-ruby
<?php                                  (not
                       work)
// php.ini : extension=ruby.so
ruby_require(‘sinatra’);
ruby_eval(<<<EOS
     get ‘/’
             ‘Hello sinatra in PHP!’
     end
EOS
);
ruby_require calls
            rb_require but…

•   rb_require is ‘require’ in Ruby script
•   require is not rb_require in Ruby 1.9
•   rb_require(“rubygems”) already called
•   rubygems override original require!

• also not work (another reason)
  rb_funcall(rb_mKernel, rb_intern(“require”)) ?
sinatra on ext-ruby again
<?php
ruby_eval(<<<EOS
     require 'sinatra/base‘
     class App < Sinatra::Base
           get '/' do
                  'Hello Sinatra in PHP!'
           end
     end
EOS
);
突然の死
(Segmentation fault)
次回作にご期待ください

• Runnable standard library
• ruby-mysql library runs too

• Web application works in PHP and Ruby if you
  make F/W which runnable on this extension!

                                     o...rz
<?php
ruby_eval(<<<'EOC'
     require 'mysql'
     client = Mysql.connect('127.0.0.1', ‘usr', ‘pas’, 'test')
     client.query("SELECT id,name FROM
                        hoge").each do |id, name|
            p [id, name]
     end
EOC
);
php_embed (rubygems.org)




     https://rubygems.org/gems/php_embed
require ‘php_embed’
    php_embed sample code
PhpEmbed.eval <<EOS
      function hello($rv) {
            $pv = phpversion();
            return “PHP {$pv} in Ruby {$rv}!”;
      }
EOS
retval = PhpEmbed.call(:hello, RUBY_VERSION)
p retval # PHP 5.4.10 in Ruby 1.9.3!
PhpEmbed::Value Class
• This class holds a PHP variable
• Convert Ruby variables into PHP variables
  (new)
• Convert PHP variables into Ruby variables
  (to_X)

• PHPnized comparison rule
p_ary = PhpEmbed::Value.new([1, 2, 3])
  PhpEmbed::Value sample code
p p_ary                   # Array
p p_ary.to_a              # [1, 2, 3]
p p_ary.to_a[0].class # PhpEmbed::Value
---------------------------------------------------------
p_zero = PhpEmbed::Value.new(0)
p_false = PhpEmbed::Value.new(false)
p pzero == p_false # true
func = PhpEmbed::Value.evalsample
  PhpEmbed::Value            << EOS   code
     function ($ary) {
           return count($ary);
     }
EOS

p func.class           # PhpEmbed::Value
p func.callable?       # true
p func.call(1..100);   # 100
Web Application?
sorry……
PHP Architecture

                     PHP Script
                 Extensions
 Web
Server
  or
                         Zend
              SAPI
 OS                     Engine
PHP SAPIs

aolserver / apache / apache2filter /
apache2handler / apache_hooks /
caudium / cgi / cli / continuity / embed
/ fpm / isapi / litespeed / milter / nsapi
/ phttpd / pi3web / roxen / thttpd / tux
/ webjames
                under sapi directory in php-5.4.10 source code
PHP SAPIs

aolserver / apache / apache2filter /
        php_embed uses embed SAPI .
          But embed SAPI has not
apache2handler /web server
           interface to apache_hooks /

caudium / cgi / cli / continuity / embed
/ fpm / isapi / litespeed / milter / nsapi
/ phttpd / pi3web / roxen / thttpd / tux
/ webjames
                under sapi directory in php-5.4.10 source code
PHP Installer
• gem install php_embed
  – require “libphp5”
  – yum install php-embedded php-devel
  – Or compile php yourself


• gem install php_embed -- --compile-php
  – compile minimal php (in gem directory)
  – require gcc / tar / make
php-extension ruby
Runnable ruby script in PHP (>=5.4)




           php_embed gem library
                       Runnable php script in Ruby(>= 1.9)
Just for Fun
Difference between
   PHP and Ruby
   in extensions
Overview of PHP/Ruby extension

                    Extension
                   (C Function)
PHP                                          PHP
                                  retrun
        args
                                   value
Ruby                                         Ruby



 • Written by C language mostly
 • Method(Function) in Ruby/PHP calls C Function
Overview of PHP/Ruby extension

                          Extension
                         (C Function)
PHP                                                       PHP
         zval                             zval
        VALUE                            VALUE
Ruby                                                      Ruby



            zval                          VALUE
   internal representation of     internal representation of
        variable in PHP                variable in Ruby
zval           zval VSVALUE
                       VALUE
type info                  pointer (*RVALUE)
 + reference count            RBasic / RObject / RClass /
 + value                   RFloat / RString / RArray /
                           RRegexp / RHash … and others
   lval (integer)
   dval (floating point)   or value
   str (string)               – false / true / nil / symbol
   ht (hash table)            – same integer
                              – some float (>= 2.0?)
   obj (object)

               Simple                      Complex
Garbage Collection
zval                     VALUE

  reference counting        mark and sweep
  + circular reference       (conservative)
        collector



   difficulty handling       easy handling
zend_eval_string (PHP)
define:
  ZEND_API int zend_eval_string(
    char *str, zval *retval_ptr, char *string_name
    TSRMLS_DC);

example:
  char *code = “$value=1”, *name=“value”;
  zval ret;

  zend_eval_string(code, &ret, name TSRMLS_CC);
rb_eval_string (Ruby)
define:
  VALUE rb_eval_string(const char *str);

example:
  char *code = “value=1”;
  VALUE ret;

  ret = rb_eval_string(code);
Build extensions
PHP                 Ruby

 $ phpize            $ ruby extconf.rb
 $ configure         $ make
 $ make              $ make install
 $ make install

m4 macros           Ruby script
autoconf            mkmf library
Code Reading
GNU Global (htags)
 http://www.gnu.org/software/global/
cgdb
http://cgdb.github.com/
References
Ruby:
      RHG (Rubyソースコード完全解説)
      http://i.loveruby.net/ja/rhg/
PHP :
      php.net
      PHP Extension Writing (PHP Quebec 2009)
     http://talks.somabo.de/200903_montreal_php_extension_writing.pdf


                                              Notice: they are old a little
Commit log
Conclusion


 処理系/拡張
  いじるの
めっさ楽しい!
Thank you!



               2013/01/13 Tokyo Ruby Kaigi 10
                    A Bridge Between PHP and Ruby
                                           @do_aki
英語間違えてたらこっそり教えて><

More Related Content

What's hot

PHP traits, treat or threat?
PHP traits, treat or threat?PHP traits, treat or threat?
PHP traits, treat or threat?Nick Belhomme
 
What lies beneath the beautiful code?
What lies beneath the beautiful code?What lies beneath the beautiful code?
What lies beneath the beautiful code?Niranjan Sarade
 
Understanding PHP objects
Understanding PHP objectsUnderstanding PHP objects
Understanding PHP objectsjulien pauli
 
Mastering Namespaces in PHP
Mastering Namespaces in PHPMastering Namespaces in PHP
Mastering Namespaces in PHPNick Belhomme
 
Quick tour of PHP from inside
Quick tour of PHP from insideQuick tour of PHP from inside
Quick tour of PHP from insidejulien pauli
 
JRuby 9000 - Optimizing Above the JVM
JRuby 9000 - Optimizing Above the JVMJRuby 9000 - Optimizing Above the JVM
JRuby 9000 - Optimizing Above the JVMCharles Nutter
 
これからのPerlプロダクトのかたち(YAPC::Asia 2013)
これからのPerlプロダクトのかたち(YAPC::Asia 2013)これからのPerlプロダクトのかたち(YAPC::Asia 2013)
これからのPerlプロダクトのかたち(YAPC::Asia 2013)goccy
 
I Know Kung Fu - Juggling Java Bytecode
I Know Kung Fu - Juggling Java BytecodeI Know Kung Fu - Juggling Java Bytecode
I Know Kung Fu - Juggling Java BytecodeAlexander Shopov
 
不深不淺,帶你認識 LLVM (Found LLVM in your life)
不深不淺,帶你認識 LLVM (Found LLVM in your life)不深不淺,帶你認識 LLVM (Found LLVM in your life)
不深不淺,帶你認識 LLVM (Found LLVM in your life)Douglas Chen
 
Php Extensions for Dummies
Php Extensions for DummiesPhp Extensions for Dummies
Php Extensions for DummiesElizabeth Smith
 
PHP 7 OPCache extension review
PHP 7 OPCache extension reviewPHP 7 OPCache extension review
PHP 7 OPCache extension reviewjulien pauli
 
Lifting The Veil - Reading Java Bytecode During Lunchtime
Lifting The Veil - Reading Java Bytecode During LunchtimeLifting The Veil - Reading Java Bytecode During Lunchtime
Lifting The Veil - Reading Java Bytecode During LunchtimeAlexander Shopov
 
Lifting The Veil - Reading Java Bytecode
Lifting The Veil - Reading Java BytecodeLifting The Veil - Reading Java Bytecode
Lifting The Veil - Reading Java BytecodeAlexander Shopov
 
Profiling php5 to php7
Profiling php5 to php7Profiling php5 to php7
Profiling php5 to php7julien pauli
 
PHP Tips for certification - OdW13
PHP Tips for certification - OdW13PHP Tips for certification - OdW13
PHP Tips for certification - OdW13julien pauli
 

What's hot (20)

PHP traits, treat or threat?
PHP traits, treat or threat?PHP traits, treat or threat?
PHP traits, treat or threat?
 
What lies beneath the beautiful code?
What lies beneath the beautiful code?What lies beneath the beautiful code?
What lies beneath the beautiful code?
 
Hacking with hhvm
Hacking with hhvmHacking with hhvm
Hacking with hhvm
 
Understanding PHP objects
Understanding PHP objectsUnderstanding PHP objects
Understanding PHP objects
 
Mastering Namespaces in PHP
Mastering Namespaces in PHPMastering Namespaces in PHP
Mastering Namespaces in PHP
 
Modern PHP
Modern PHPModern PHP
Modern PHP
 
Quick tour of PHP from inside
Quick tour of PHP from insideQuick tour of PHP from inside
Quick tour of PHP from inside
 
JRuby 9000 - Optimizing Above the JVM
JRuby 9000 - Optimizing Above the JVMJRuby 9000 - Optimizing Above the JVM
JRuby 9000 - Optimizing Above the JVM
 
これからのPerlプロダクトのかたち(YAPC::Asia 2013)
これからのPerlプロダクトのかたち(YAPC::Asia 2013)これからのPerlプロダクトのかたち(YAPC::Asia 2013)
これからのPerlプロダクトのかたち(YAPC::Asia 2013)
 
I Know Kung Fu - Juggling Java Bytecode
I Know Kung Fu - Juggling Java BytecodeI Know Kung Fu - Juggling Java Bytecode
I Know Kung Fu - Juggling Java Bytecode
 
不深不淺,帶你認識 LLVM (Found LLVM in your life)
不深不淺,帶你認識 LLVM (Found LLVM in your life)不深不淺,帶你認識 LLVM (Found LLVM in your life)
不深不淺,帶你認識 LLVM (Found LLVM in your life)
 
Php Extensions for Dummies
Php Extensions for DummiesPhp Extensions for Dummies
Php Extensions for Dummies
 
Shark
Shark Shark
Shark
 
PHP 7 OPCache extension review
PHP 7 OPCache extension reviewPHP 7 OPCache extension review
PHP 7 OPCache extension review
 
Lifting The Veil - Reading Java Bytecode During Lunchtime
Lifting The Veil - Reading Java Bytecode During LunchtimeLifting The Veil - Reading Java Bytecode During Lunchtime
Lifting The Veil - Reading Java Bytecode During Lunchtime
 
Lifting The Veil - Reading Java Bytecode
Lifting The Veil - Reading Java BytecodeLifting The Veil - Reading Java Bytecode
Lifting The Veil - Reading Java Bytecode
 
Puppet NBLUG 2008-09
Puppet NBLUG 2008-09Puppet NBLUG 2008-09
Puppet NBLUG 2008-09
 
Lecture8
Lecture8Lecture8
Lecture8
 
Profiling php5 to php7
Profiling php5 to php7Profiling php5 to php7
Profiling php5 to php7
 
PHP Tips for certification - OdW13
PHP Tips for certification - OdW13PHP Tips for certification - OdW13
PHP Tips for certification - OdW13
 

Similar to A bridge between php and ruby

DevOps in PHP environment
DevOps in PHP environmentDevOps in PHP environment
DevOps in PHP environmentEvaldo Felipe
 
Php7 HHVM and co
Php7 HHVM and coPhp7 HHVM and co
Php7 HHVM and coweltling
 
Ruby C extensions at the Ruby drink-up of Sophia, April 2012
Ruby C extensions at the Ruby drink-up of Sophia, April 2012Ruby C extensions at the Ruby drink-up of Sophia, April 2012
Ruby C extensions at the Ruby drink-up of Sophia, April 2012rivierarb
 
Php7 hhvm and co
Php7 hhvm and coPhp7 hhvm and co
Php7 hhvm and coPierre Joye
 
PHP from soup to nuts Course Deck
PHP from soup to nuts Course DeckPHP from soup to nuts Course Deck
PHP from soup to nuts Course DeckrICh morrow
 
Opal chapter 4_a_new_hope
Opal chapter 4_a_new_hopeOpal chapter 4_a_new_hope
Opal chapter 4_a_new_hopeForrest Chang
 
Zephir - A Wind of Change for writing PHP extensions
Zephir - A Wind of Change for writing PHP extensionsZephir - A Wind of Change for writing PHP extensions
Zephir - A Wind of Change for writing PHP extensionsMark Baker
 
Flying under the radar
Flying under the radarFlying under the radar
Flying under the radarMark Baker
 
Php i basic chapter 3 (mardhiah kamaludin's conflicted copy 2013-04-23)
Php i basic chapter 3 (mardhiah kamaludin's conflicted copy 2013-04-23)Php i basic chapter 3 (mardhiah kamaludin's conflicted copy 2013-04-23)
Php i basic chapter 3 (mardhiah kamaludin's conflicted copy 2013-04-23)Muhamad Al Imran
 
Building web framework with Rack
Building web framework with RackBuilding web framework with Rack
Building web framework with Racksickill
 

Similar to A bridge between php and ruby (20)

PHP
PHPPHP
PHP
 
DevOps in PHP environment
DevOps in PHP environmentDevOps in PHP environment
DevOps in PHP environment
 
Php7 HHVM and co
Php7 HHVM and coPhp7 HHVM and co
Php7 HHVM and co
 
Ruby C extensions at the Ruby drink-up of Sophia, April 2012
Ruby C extensions at the Ruby drink-up of Sophia, April 2012Ruby C extensions at the Ruby drink-up of Sophia, April 2012
Ruby C extensions at the Ruby drink-up of Sophia, April 2012
 
Php7 hhvm and co
Php7 hhvm and coPhp7 hhvm and co
Php7 hhvm and co
 
How DSL works on Ruby
How DSL works on RubyHow DSL works on Ruby
How DSL works on Ruby
 
PHP - Introduction to PHP Fundamentals
PHP -  Introduction to PHP FundamentalsPHP -  Introduction to PHP Fundamentals
PHP - Introduction to PHP Fundamentals
 
PHP from soup to nuts Course Deck
PHP from soup to nuts Course DeckPHP from soup to nuts Course Deck
PHP from soup to nuts Course Deck
 
Opal chapter 4_a_new_hope
Opal chapter 4_a_new_hopeOpal chapter 4_a_new_hope
Opal chapter 4_a_new_hope
 
Zephir - A Wind of Change for writing PHP extensions
Zephir - A Wind of Change for writing PHP extensionsZephir - A Wind of Change for writing PHP extensions
Zephir - A Wind of Change for writing PHP extensions
 
Flying under the radar
Flying under the radarFlying under the radar
Flying under the radar
 
Php mysql
Php mysqlPhp mysql
Php mysql
 
Php i basic chapter 3 (mardhiah kamaludin's conflicted copy 2013-04-23)
Php i basic chapter 3 (mardhiah kamaludin's conflicted copy 2013-04-23)Php i basic chapter 3 (mardhiah kamaludin's conflicted copy 2013-04-23)
Php i basic chapter 3 (mardhiah kamaludin's conflicted copy 2013-04-23)
 
Building web framework with Rack
Building web framework with RackBuilding web framework with Rack
Building web framework with Rack
 
Basics PHP
Basics PHPBasics PHP
Basics PHP
 
Prersentation
PrersentationPrersentation
Prersentation
 
Php resque
Php resquePhp resque
Php resque
 
Introduction to php basics
Introduction to php   basicsIntroduction to php   basics
Introduction to php basics
 
Laravel level 0 (introduction)
Laravel level 0 (introduction)Laravel level 0 (introduction)
Laravel level 0 (introduction)
 
Ruby
RubyRuby
Ruby
 

More from do_aki

Tritonn から Elasticsearch への移行話
Tritonn から Elasticsearch への移行話Tritonn から Elasticsearch への移行話
Tritonn から Elasticsearch への移行話do_aki
 
php-src の歩き方
php-src の歩き方php-src の歩き方
php-src の歩き方do_aki
 
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とPHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とdo_aki
 
PHPとシグナル、その裏側
PHPとシグナル、その裏側PHPとシグナル、その裏側
PHPとシグナル、その裏側do_aki
 
再考:列挙型
再考:列挙型再考:列挙型
再考:列挙型do_aki
 
signal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何かsignal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何かdo_aki
 
PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)do_aki
 
PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説do_aki
 
Writing php extensions in golang
Writing php extensions in golangWriting php extensions in golang
Writing php extensions in golangdo_aki
 
php7's ast
php7's astphp7's ast
php7's astdo_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
 
php and sapi and zendengine2 and...
php and sapi and zendengine2 and...php and sapi and zendengine2 and...
php and sapi and zendengine2 and...do_aki
 

More from do_aki (20)

Tritonn から Elasticsearch への移行話
Tritonn から Elasticsearch への移行話Tritonn から Elasticsearch への移行話
Tritonn から Elasticsearch への移行話
 
php-src の歩き方
php-src の歩き方php-src の歩き方
php-src の歩き方
 
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とPHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
 
PHPとシグナル、その裏側
PHPとシグナル、その裏側PHPとシグナル、その裏側
PHPとシグナル、その裏側
 
再考:列挙型
再考:列挙型再考:列挙型
再考:列挙型
 
signal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何かsignal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何か
 
PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)
 
PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説
 
Writing php extensions in golang
Writing php extensions in golangWriting php extensions in golang
Writing php extensions in golang
 
php7's ast
php7's astphp7's ast
php7's ast
 
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
 
php and sapi and zendengine2 and...
php and sapi and zendengine2 and...php and sapi and zendengine2 and...
php and sapi and zendengine2 and...
 

Recently uploaded

Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptxLBM Solutions
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsAndrey Dotsenko
 
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptx
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptxMaking_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptx
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptxnull - The Open Security Community
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Wonjun Hwang
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
Science&tech:THE INFORMATION AGE STS.pdf
Science&tech:THE INFORMATION AGE STS.pdfScience&tech:THE INFORMATION AGE STS.pdf
Science&tech:THE INFORMATION AGE STS.pdfjimielynbastida
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
costume and set research powerpoint presentation
costume and set research powerpoint presentationcostume and set research powerpoint presentation
costume and set research powerpoint presentationphoebematthew05
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024BookNet Canada
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions
 
Build your next Gen AI Breakthrough - April 2024
Build your next Gen AI Breakthrough - April 2024Build your next Gen AI Breakthrough - April 2024
Build your next Gen AI Breakthrough - April 2024Neo4j
 

Recently uploaded (20)

Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptx
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptx
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptxMaking_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptx
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptx
 
Hot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort Service
Hot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort ServiceHot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort Service
Hot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort Service
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
Science&tech:THE INFORMATION AGE STS.pdf
Science&tech:THE INFORMATION AGE STS.pdfScience&tech:THE INFORMATION AGE STS.pdf
Science&tech:THE INFORMATION AGE STS.pdf
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special EditionDMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
 
costume and set research powerpoint presentation
costume and set research powerpoint presentationcostume and set research powerpoint presentation
costume and set research powerpoint presentation
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
Vulnerability_Management_GRC_by Sohang Sengupta.pptx
Vulnerability_Management_GRC_by Sohang Sengupta.pptxVulnerability_Management_GRC_by Sohang Sengupta.pptx
Vulnerability_Management_GRC_by Sohang Sengupta.pptx
 
Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food Manufacturing
 
Build your next Gen AI Breakthrough - April 2024
Build your next Gen AI Breakthrough - April 2024Build your next Gen AI Breakthrough - April 2024
Build your next Gen AI Breakthrough - April 2024
 

A bridge between php and ruby

  • 1. PHP と Ruby の 架け橋 2013/01/13 Tokyo Ruby Kaigi 10 do_aki
  • 3. About 2 extensions php-extension ruby Runnable ruby script in PHP (>=5.4) php_embed gem library Runnable php script in Ruby(>= 1.9)
  • 5.
  • 6. php-ext-ruby sample code <?php // php.ini : extension=ruby.so ruby_eval(<<<'EOS' def hello “Ruby #{RUBY_VERSION} in PHP! " end EOS ); echo ruby_eval('hello()'); # Ruby 1.9.3 in PHP!
  • 8. <?php sinatra on ext-ruby // php.ini : extension=ruby.so ruby_require(‘sinatra’); ruby_eval(<<<EOS get ‘/’ ‘Hello sinatra in PHP!’ end EOS );
  • 9. sinatra on ext-ruby <?php (not work) // php.ini : extension=ruby.so ruby_require(‘sinatra’); ruby_eval(<<<EOS get ‘/’ ‘Hello sinatra in PHP!’ end EOS );
  • 10. ruby_require calls rb_require but… • rb_require is ‘require’ in Ruby script • require is not rb_require in Ruby 1.9 • rb_require(“rubygems”) already called • rubygems override original require! • also not work (another reason) rb_funcall(rb_mKernel, rb_intern(“require”)) ?
  • 11. sinatra on ext-ruby again <?php ruby_eval(<<<EOS require 'sinatra/base‘ class App < Sinatra::Base get '/' do 'Hello Sinatra in PHP!' end end EOS );
  • 13. 次回作にご期待ください • Runnable standard library • ruby-mysql library runs too • Web application works in PHP and Ruby if you make F/W which runnable on this extension! o...rz
  • 14. <?php ruby_eval(<<<'EOC' require 'mysql' client = Mysql.connect('127.0.0.1', ‘usr', ‘pas’, 'test') client.query("SELECT id,name FROM hoge").each do |id, name| p [id, name] end EOC );
  • 15. php_embed (rubygems.org) https://rubygems.org/gems/php_embed
  • 16. require ‘php_embed’ php_embed sample code PhpEmbed.eval <<EOS function hello($rv) { $pv = phpversion(); return “PHP {$pv} in Ruby {$rv}!”; } EOS retval = PhpEmbed.call(:hello, RUBY_VERSION) p retval # PHP 5.4.10 in Ruby 1.9.3!
  • 17. PhpEmbed::Value Class • This class holds a PHP variable • Convert Ruby variables into PHP variables (new) • Convert PHP variables into Ruby variables (to_X) • PHPnized comparison rule
  • 18. p_ary = PhpEmbed::Value.new([1, 2, 3]) PhpEmbed::Value sample code p p_ary # Array p p_ary.to_a # [1, 2, 3] p p_ary.to_a[0].class # PhpEmbed::Value --------------------------------------------------------- p_zero = PhpEmbed::Value.new(0) p_false = PhpEmbed::Value.new(false) p pzero == p_false # true
  • 19. func = PhpEmbed::Value.evalsample PhpEmbed::Value << EOS code function ($ary) { return count($ary); } EOS p func.class # PhpEmbed::Value p func.callable? # true p func.call(1..100); # 100
  • 22. PHP Architecture PHP Script Extensions Web Server or Zend SAPI OS Engine
  • 23. PHP SAPIs aolserver / apache / apache2filter / apache2handler / apache_hooks / caudium / cgi / cli / continuity / embed / fpm / isapi / litespeed / milter / nsapi / phttpd / pi3web / roxen / thttpd / tux / webjames under sapi directory in php-5.4.10 source code
  • 24. PHP SAPIs aolserver / apache / apache2filter / php_embed uses embed SAPI . But embed SAPI has not apache2handler /web server interface to apache_hooks / caudium / cgi / cli / continuity / embed / fpm / isapi / litespeed / milter / nsapi / phttpd / pi3web / roxen / thttpd / tux / webjames under sapi directory in php-5.4.10 source code
  • 25. PHP Installer • gem install php_embed – require “libphp5” – yum install php-embedded php-devel – Or compile php yourself • gem install php_embed -- --compile-php – compile minimal php (in gem directory) – require gcc / tar / make
  • 26.
  • 27. php-extension ruby Runnable ruby script in PHP (>=5.4) php_embed gem library Runnable php script in Ruby(>= 1.9)
  • 29. Difference between PHP and Ruby in extensions
  • 30. Overview of PHP/Ruby extension Extension (C Function) PHP PHP retrun args value Ruby Ruby • Written by C language mostly • Method(Function) in Ruby/PHP calls C Function
  • 31. Overview of PHP/Ruby extension Extension (C Function) PHP PHP zval zval VALUE VALUE Ruby Ruby zval VALUE internal representation of internal representation of variable in PHP variable in Ruby
  • 32. zval zval VSVALUE VALUE type info pointer (*RVALUE) + reference count RBasic / RObject / RClass / + value RFloat / RString / RArray / RRegexp / RHash … and others lval (integer) dval (floating point) or value str (string) – false / true / nil / symbol ht (hash table) – same integer – some float (>= 2.0?) obj (object) Simple Complex
  • 33. Garbage Collection zval VALUE reference counting mark and sweep + circular reference (conservative) collector difficulty handling easy handling
  • 34. zend_eval_string (PHP) define: ZEND_API int zend_eval_string( char *str, zval *retval_ptr, char *string_name TSRMLS_DC); example: char *code = “$value=1”, *name=“value”; zval ret; zend_eval_string(code, &ret, name TSRMLS_CC);
  • 35. rb_eval_string (Ruby) define: VALUE rb_eval_string(const char *str); example: char *code = “value=1”; VALUE ret; ret = rb_eval_string(code);
  • 36. Build extensions PHP Ruby $ phpize $ ruby extconf.rb $ configure $ make $ make $ make install $ make install m4 macros Ruby script autoconf mkmf library
  • 38. GNU Global (htags) http://www.gnu.org/software/global/
  • 40. References Ruby: RHG (Rubyソースコード完全解説) http://i.loveruby.net/ja/rhg/ PHP : php.net PHP Extension Writing (PHP Quebec 2009) http://talks.somabo.de/200903_montreal_php_extension_writing.pdf Notice: they are old a little
  • 42. Conclusion 処理系/拡張 いじるの めっさ楽しい!
  • 43. Thank you! 2013/01/13 Tokyo Ruby Kaigi 10 A Bridge Between PHP and Ruby @do_aki 英語間違えてたらこっそり教えて><