A bridge between php and ruby

7,219 views

Published on

2013/01/13 Tokyo Ruby Kaigi 10

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
7,219
On SlideShare
0
From Embeds
0
Number of Embeds
1,062
Actions
Shares
0
Downloads
3
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

A bridge between php and ruby

  1. 1. PHP とRuby の架け橋 2013/01/13 Tokyo Ruby Kaigi 10 do_aki
  2. 2. @do_akihttp://do-aki.net/
  3. 3. About 2 extensions php-extension rubyRunnable ruby script in PHP (>=5.4) php_embed gem library Runnable php script in Ruby(>= 1.9)
  4. 4. https://github.com/do-aki/php-ext-ruby
  5. 5. php-ext-ruby sample code<?php// php.ini : extension=ruby.soruby_eval(<<<EOS def hello “Ruby #{RUBY_VERSION} in PHP! " endEOS);echo ruby_eval(hello()); # Ruby 1.9.3 in PHP!
  6. 6. Web Application?
  7. 7. <?php sinatra on ext-ruby// php.ini : extension=ruby.soruby_require(‘sinatra’);ruby_eval(<<<EOS get ‘/’ ‘Hello sinatra in PHP!’ endEOS);
  8. 8. sinatra on ext-ruby<?php (not work)// php.ini : extension=ruby.soruby_require(‘sinatra’);ruby_eval(<<<EOS get ‘/’ ‘Hello sinatra in PHP!’ endEOS);
  9. 9. 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”)) ?
  10. 10. sinatra on ext-ruby again<?phpruby_eval(<<<EOS require sinatra/base‘ class App < Sinatra::Base get / do Hello Sinatra in PHP! end endEOS);
  11. 11. 突然の死(Segmentation fault)
  12. 12. 次回作にご期待ください• 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
  13. 13. <?phpruby_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] endEOC);
  14. 14. php_embed (rubygems.org) https://rubygems.org/gems/php_embed
  15. 15. require ‘php_embed’ php_embed sample codePhpEmbed.eval <<EOS function hello($rv) { $pv = phpversion(); return “PHP {$pv} in Ruby {$rv}!”; }EOSretval = PhpEmbed.call(:hello, RUBY_VERSION)p retval # PHP 5.4.10 in Ruby 1.9.3!
  16. 16. 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
  17. 17. p_ary = PhpEmbed::Value.new([1, 2, 3]) PhpEmbed::Value sample codep p_ary # Arrayp 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
  18. 18. func = PhpEmbed::Value.evalsample PhpEmbed::Value << EOS code function ($ary) { return count($ary); }EOSp func.class # PhpEmbed::Valuep func.callable? # truep func.call(1..100); # 100
  19. 19. Web Application?
  20. 20. sorry……
  21. 21. PHP Architecture PHP Script Extensions WebServer or Zend SAPI OS Engine
  22. 22. PHP SAPIsaolserver / 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
  23. 23. PHP SAPIsaolserver / apache / apache2filter / php_embed uses embed SAPI . But embed SAPI has notapache2handler /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
  24. 24. 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
  25. 25. php-extension rubyRunnable ruby script in PHP (>=5.4) php_embed gem library Runnable php script in Ruby(>= 1.9)
  26. 26. Just for Fun
  27. 27. Difference between PHP and Ruby in extensions
  28. 28. Overview of PHP/Ruby extension Extension (C Function)PHP PHP retrun args valueRuby Ruby • Written by C language mostly • Method(Function) in Ruby/PHP calls C Function
  29. 29. Overview of PHP/Ruby extension Extension (C Function)PHP PHP zval zval VALUE VALUERuby Ruby zval VALUE internal representation of internal representation of variable in PHP variable in Ruby
  30. 30. zval zval VSVALUE VALUEtype 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
  31. 31. Garbage Collectionzval VALUE reference counting mark and sweep + circular reference (conservative) collector difficulty handling easy handling
  32. 32. 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);
  33. 33. rb_eval_string (Ruby)define: VALUE rb_eval_string(const char *str);example: char *code = “value=1”; VALUE ret; ret = rb_eval_string(code);
  34. 34. Build extensionsPHP Ruby $ phpize $ ruby extconf.rb $ configure $ make $ make $ make install $ make installm4 macros Ruby scriptautoconf mkmf library
  35. 35. Code Reading
  36. 36. GNU Global (htags) http://www.gnu.org/software/global/
  37. 37. cgdbhttp://cgdb.github.com/
  38. 38. ReferencesRuby: 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
  39. 39. Commit log
  40. 40. Conclusion 処理系/拡張 いじるのめっさ楽しい!
  41. 41. Thank you! 2013/01/13 Tokyo Ruby Kaigi 10 A Bridge Between PHP and Ruby @do_aki英語間違えてたらこっそり教えて><

×