Inicio
Explorar
Enviar búsqueda
Cargar
Iniciar sesión
Registrarse
Publicidad
Check these out next
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
Yoshio Hanawa
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
hecomi
JIT のコードを読んでみた
y-uti
signal の話 或いは Zend Signals とは何か
do_aki
PHPとシグナル、その裏側
do_aki
PECL operator で演算子オーバーロード
y-uti
PHPの今とこれから2014
Rui Hirokawa
PECL を数えてみた
y-uti
1
de
32
Top clipped slide
Php in ruby
1 de Sep de 2012
•
0 recomendaciones
4 recomendaciones
×
Sé el primero en que te guste
ver más
•
2,819 vistas
vistas
×
Total de vistas
0
En Slideshare
0
De embebidos
0
Número de embebidos
0
Descargar ahora
Descargar para leer sin conexión
Denunciar
Tecnología
do_aki
Seguir
Publicidad
Publicidad
Publicidad
Recomendados
php-src の歩き方
do_aki
2.3K vistas
•
30 diapositivas
PHP と SAPI と ZendEngine3 と
do_aki
15.9K vistas
•
95 diapositivas
php7's ast
do_aki
9.1K vistas
•
27 diapositivas
PHP AST 徹底解説
do_aki
25.5K vistas
•
77 diapositivas
php and sapi and zendengine2 and...
do_aki
5.8K vistas
•
28 diapositivas
PHP AST 徹底解説(補遺)
do_aki
4.9K vistas
•
43 diapositivas
Más contenido relacionado
Presentaciones para ti
(20)
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
Yoshio Hanawa
•
14.4K vistas
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
hecomi
•
10.9K vistas
JIT のコードを読んでみた
y-uti
•
10K vistas
signal の話 或いは Zend Signals とは何か
do_aki
•
5.9K vistas
PHPとシグナル、その裏側
do_aki
•
9.4K vistas
PECL operator で演算子オーバーロード
y-uti
•
1.3K vistas
PHPの今とこれから2014
Rui Hirokawa
•
21.3K vistas
PECL を数えてみた
y-uti
•
4K vistas
HHVM Hack
Masaaki Yonebayashi
•
5K vistas
Hack/HHVM 入門
y-uti
•
8.4K vistas
about Thrift
Naoya Ito
•
2.3K vistas
Task Spooler を試した
y-uti
•
3K vistas
PHP の GC の話
y-uti
•
18.2K vistas
実"戦"CakePHP Plugin
Kenichirou Oyama
•
4.6K vistas
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Shintarou Okada
•
13K vistas
BoostAsioで可読性を求めるのは間違っているだろうか
Yuki Miyatake
•
14.1K vistas
CodeIgniter入門
Sho A
•
13.1K vistas
emc++ chapter32
Tatsuki SHIMIZU
•
1.1K vistas
Windows で拡張モジュールをビルドしてみた
y-uti
•
2.6K vistas
Good Parts of PHP and the UNIX Philosophy
Yuya Takeyama
•
3.8K vistas
Destacado
(6)
20111206 GLT vol.40
kashew_nuts
•
1.7K vistas
ゆるLTのススメ+α
joker1007
•
2.8K vistas
闇RubyKaigi
suga masao
•
2.1K vistas
JoJoに学ぶプログラマが知るべきたった一つのこと
Daisuke Kasuya
•
1.9K vistas
Over The Rainbow
Jun OHWADA
•
1.9K vistas
moon and strategy
toshihiro ichitani
•
6.7K vistas
Publicidad
Similar a Php in ruby
(20)
WTM53 phpフレームワーク いまさらcodeigniter
Masanori Oobayashi
•
3.9K vistas
Modern PHP Programming @ PFI Seminar
Sotaro Karasawa
•
7.1K vistas
PHPでマルチスレッド
karky7
•
228 vistas
モダンmod_perl入門 #yapcasia
鉄次 尾形
•
8.1K vistas
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
inaz2
•
6.8K vistas
10分でわかるFuelPHP @ 2011/12
kenjis
•
4.2K vistas
Thrift
guestf259ae
•
1.4K vistas
Javaで簡単にgpgpu aparapi
Ken'ichi Sakiyama
•
10.1K vistas
Web技術勉強会23回目
龍一 田中
•
775 vistas
T69 c++cli ネイティブライブラリラッピング入門
伸男 伊藤
•
5.2K vistas
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
kenjis
•
26.5K vistas
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
kenjis
•
3.9K vistas
メタメタプログラミングRuby
emasaka
•
990 vistas
ホームディレクトリに埋もれた便利なコードをさがせ!
Yohei Fushii
•
27.6K vistas
FuelPHP Osu Nagoya vol.1
Fumito Mizuno
•
3K vistas
C#勉強会
hakugakucafe
•
1.6K vistas
はじめてのCodeIgniter
Yuya Matsushima
•
6.4K vistas
PHP & Queue
sasezaki
•
5.7K vistas
Python physicalcomputing
Noboru Irieda
•
1.5K vistas
VerilatorとSystemC
Mr. Vengineer
•
1.1K vistas
Más de do_aki
(20)
Tritonn から Elasticsearch への移行話
do_aki
•
1.2K vistas
再考:列挙型
do_aki
•
2.8K vistas
Writing php extensions in golang
do_aki
•
9.4K vistas
N対1 レプリケーション + Optimizer Hint
do_aki
•
1.9K vistas
20150212 プレゼンテーションzen
do_aki
•
3.5K vistas
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
do_aki
•
1.5K vistas
20141017 introduce razor
do_aki
•
1.5K vistas
20141011 mastering mysqlnd
do_aki
•
11.3K vistas
php in ruby
do_aki
•
1.1K vistas
PHP から Groonga を使うにはこんなコードになるよ!
do_aki
•
4.1K vistas
N:1 Replication meets MHA
do_aki
•
11.8K vistas
Php radomize
do_aki
•
6.5K vistas
セキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editor
do_aki
•
4.9K vistas
マスタN対スレーブ1レプリケーションの作り方 ~あれから~
do_aki
•
5.7K vistas
Immortal
do_aki
•
3.1K vistas
Excel is image viewer
do_aki
•
2.7K vistas
A bridge between php and ruby
do_aki
•
6.8K vistas
Ruby and comparison_and...php
do_aki
•
1.9K vistas
Sore php
do_aki
•
2.4K vistas
Ruby enumerable source code reading
do_aki
•
1.5K vistas
Publicidad
Último
(20)
ChatGPT触ってみた
infinite_loop
•
64 vistas
JSAI2023_企画セッション(仕掛学)資料
Matsushita Laboratory
•
45 vistas
【DL輪読会】マルチモーダル 基盤モデル
Deep Learning JP
•
60 vistas
統計学の攻略_正規分布ファミリーの全体像.pdf
akipii Oga
•
318 vistas
Wandb LLM Webinar May 30 2023 (配布用).pdf
Yuya Yamamoto
•
141 vistas
mi-5. ディープラーニング
kunihikokaneko1
•
4 vistas
統計学の攻略_統計的仮説検定の9パターン.pdf
akipii Oga
•
314 vistas
社内ソフトスキルを考える
infinite_loop
•
91 vistas
【DL輪読会】Poisoning Language Models During Instruction Tuning Instruction Tuning...
Deep Learning JP
•
159 vistas
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
NTT DATA Technology & Innovation
•
204 vistas
GraalVMでのFlight Recorderを使ったパフォーマンス解析(JJUG CCC 2023 Spring)
NTT DATA Technology & Innovation
•
12 vistas
AIEXPO_CDLE名古屋紹介
KotaMiyano
•
4 vistas
mi-3. データサイエンス・AIの演習
kunihikokaneko1
•
4 vistas
GitHub最新情報キャッチアップ 2023年6月
Kazumi IWANAGA
•
7 vistas
mi-1. 人工知能の概要
kunihikokaneko1
•
5 vistas
【DL輪読会】HyperDiffusion: Generating Implicit Neural Fields withWeight-Space Dif...
Deep Learning JP
•
19 vistas
JSONEncoderで詰まった話
とん とんぼ
•
144 vistas
20230602_enebular_meetup_kitazaki_v1.pdf
Ayachika Kitazaki
•
40 vistas
3Dプリンタって いいね
infinite_loop
•
64 vistas
コードレビュー改善のためにJenkinsとIntelliJ IDEAのプラグインを自作してみた話
Rakuten Group, Inc.
•
40 vistas
Php in ruby
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?
Publicidad