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
);
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
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
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