• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
A bridge between php and ruby
 

A bridge between php and ruby

on

  • 5,509 views

2013/01/13 Tokyo Ruby Kaigi 10

2013/01/13 Tokyo Ruby Kaigi 10

Statistics

Views

Total Views
5,509
Views on SlideShare
4,513
Embed Views
996

Actions

Likes
2
Downloads
0
Comments
0

3 Embeds 996

http://d.hatena.ne.jp 992
https://twitter.com 3
http://feeds.feedburner.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    A bridge between php and ruby A bridge between php and ruby Presentation Transcript

    • PHP とRuby の架け橋 2013/01/13 Tokyo Ruby Kaigi 10 do_aki
    • @do_akihttp://do-aki.net/
    • About 2 extensions php-extension rubyRunnable 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.soruby_eval(<<<EOS def hello “Ruby #{RUBY_VERSION} in PHP! " endEOS);echo ruby_eval(hello()); # Ruby 1.9.3 in PHP!
    • Web Application?
    • <?php sinatra on ext-ruby// php.ini : extension=ruby.soruby_require(‘sinatra’);ruby_eval(<<<EOS get ‘/’ ‘Hello sinatra in PHP!’ endEOS);
    • sinatra on ext-ruby<?php (not work)// php.ini : extension=ruby.soruby_require(‘sinatra’);ruby_eval(<<<EOS get ‘/’ ‘Hello sinatra in PHP!’ endEOS);
    • 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<?phpruby_eval(<<<EOS require sinatra/base‘ class App < Sinatra::Base get / do Hello Sinatra in PHP! end endEOS);
    • 突然の死(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
    • <?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);
    • php_embed (rubygems.org) https://rubygems.org/gems/php_embed
    • 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!
    • 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 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
    • 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
    • Web Application?
    • sorry……
    • PHP Architecture PHP Script Extensions WebServer or Zend SAPI OS Engine
    • 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
    • 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
    • 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 rubyRunnable 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 valueRuby 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 VALUERuby Ruby zval VALUE internal representation of internal representation of variable in PHP variable in Ruby
    • 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
    • Garbage Collectionzval 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 extensionsPHP Ruby $ phpize $ ruby extconf.rb $ configure $ make $ make $ make install $ make installm4 macros Ruby scriptautoconf mkmf library
    • Code Reading
    • GNU Global (htags) http://www.gnu.org/software/global/
    • cgdbhttp://cgdb.github.com/
    • 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
    • Commit log
    • Conclusion 処理系/拡張 いじるのめっさ楽しい!
    • Thank you! 2013/01/13 Tokyo Ruby Kaigi 10 A Bridge Between PHP and Ruby @do_aki英語間違えてたらこっそり教えて><