亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

如何使用PHP Embed SAPI實現Opcodes查看器

2020-03-22 18:34:33
字體:
來源:轉載
供稿:網友
PHP提供了一個Embed SAPI,也就是說,PHP容許你在C/C++語言中調用PHP/ZE提供的函數。本文就通過基于Embed SAPI實現一個PHP的opcodes查看器。
首先,下載PHP源碼以供編譯, 我現在使用的是PHP5.3 alpha2
進入源碼目錄:./configure --enable-embed --with-config-file-scan-dir=/etc/php.d --with-mysql --with-config-file-path=/etc/
./make
./make install最后,記得要將生成的libphp5.so復制到運行時庫的目錄,我直接拷貝到了/lib/, 否則會在運行你自己的embed程序的時候報錯:./embed: error while loading shared libraries: libphp5.so: cannot open shared object file: No such file or directory如果你對PHP的SAPI還不熟悉的話,我建議你看看我的這篇文章:深入理解Zend SAPIs(Zend SAPI Internals)
這個時候,你就可以在你的C代碼中,嵌入PHP腳本解析器了, 我的例子:#include "sapi/embed/php_embed.h"int main(int argc, char * argv[]){ PHP_EMBED_START_BLOCK(argc,argv); char * script = " print 'Hello World!';"; zend_eval_string(script, NULL, "Simple Hello World App" TSRMLS_CC); PHP_EMBED_END_BLOCK(); return 0;}然后就是要指明include path了,一個簡單的MakefileCC = gccCFLAGS = -I/usr/local/include/php/ / -I/usr/local/include/php/main / -I/usr/local/include/php/Zend / -I/usr/local/include/php/TSRM / -Wall -gLDFLAGS = -lstdc++ -L/usr/local/lib -lphp5 $(CC) -o embed embed.cpp $(CFLAGS) $(LDFLAGS)編譯成功以后, 運行,我們可以看到, stdout輸出 Hello World!基于這個,我們就可以很容易的實現一個類似于vld的Opcodes dumper:
首先我們定義opcode的轉換函數(全部的opcodes可以查看Zend/zend_vm_opcodes.h);char *opname(zend_uchar opcode){ switch(opcode) { case ZEND_NOP: return "ZEND_NOP"; break; case ZEND_ADD: return "ZEND_ADD"; break; case ZEND_SUB: return "ZEND_SUB"; break; case ZEND_MUL: return "ZEND_MUL"; break; case ZEND_DIV: return "ZEND_DIV"; break; case ZEND_MOD: return "ZEND_MOD"; break; case ZEND_SL: return "ZEND_SL"; break; case ZEND_SR: return "ZEND_SR"; break; case ZEND_CONCAT: return "ZEND_CONCAT"; break; case ZEND_BW_OR: return "ZEND_BW_OR"; break; case ZEND_BW_AND: return "ZEND_BW_AND"; break; case ZEND_BW_XOR: return "ZEND_BW_XOR"; break; case ZEND_BW_NOT: return "ZEND_BW_NOT"; break; /*...省略 ....*/ default : return "UNKNOW"; break;然后定義zval和znode的輸出函數: char *format_zval(zval *z) html' target='_blank'>static char buffer[BUFFER_LEN]; int len; switch(z- type) { case IS_NULL: return "NULL"; case IS_LONG: case IS_BOOL: snprintf(buffer, BUFFER_LEN, "%d", z- value.lval); return buffer; case IS_DOUBLE: snprintf(buffer, BUFFER_LEN, "%f", z- value.dval); return buffer; case IS_STRING: snprintf(buffer, BUFFER_LEN, "/"%s/"", z- value.str.val); return buffer; case IS_ARRAY: case IS_OBJECT: case IS_RESOURCE: case IS_CONSTANT: case IS_CONSTANT_ARRAY: return ""; default: return "unknown";char * format_znode(znode *n){ static char buffer[BUFFER_LEN]; switch (n- op_type) { case IS_CONST: return format_zval( u.constant); break; case IS_VAR: snprintf(buffer, BUFFER_LEN, "$%d", n- u.var/sizeof(temp_variable)); return buffer; break; case IS_TMP_VAR: snprintf(buffer, BUFFER_LEN, "~%d", n- u.var/sizeof(temp_variable)); return buffer; break; default: return ""; break;}然后定義op_array的輸出函數:void dump_op(zend_op *op, int num){ printf("%5d %5d %30s %040s %040s %040s/n", num, op- lineno, opname(op- opcode), format_znode( op1), format_znode( op2), format_znode( result)) ;void dump_op_array(zend_op_array *op_array){ if(op_array) { int i; printf("%5s %5s %30s %040s %040s %040s/n", "opnum", "line", "opcode", "op1", "op2", "result"); for(i = 0; i op_array- last; i++) { dump_op(&op_array- opcodes[i], i);最后,就是程序的主函數了:int main(int argc, char **argv){ zend_op_array *op_array; zend_file_handle file_handle; if(argc != 2) { printf("usage: op_dumper script /n"); return 1; PHP_EMBED_START_BLOCK(argc,argv); printf("Script: %s/n", argv[1]); file_handle.filename = argv[1]; file_handle.free_filename = 0; file_handle.type = ZEND_HANDLE_FILENAME; file_handle.opened_path = NULL; op_array = zend_compile_file(&file_handle, ZEND_INCLUDE TSRMLS_CC); if(!op_array) { printf("Error parsing script: %s/n", file_handle.filename); return 1; dump_op_array(op_array); PHP_EMBED_END_BLOCK(); return 0;編譯,運行測試腳本(sample.php):深入理解PHP原理之Opcodes):Script: sample.php
opnum line opcode op1 op2 result
0 2 ZEND_ECHO "laruence"
1 4 ZEND_RETURN 1呵呵,怎么樣,是不是很好玩呢?PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲高清一二三区| 热99精品只有里视频精品| 国产精品一区二区三区在线播放| 国产一区二区三区在线视频| 国产午夜精品理论片a级探花| 中文字幕精品国产| 日韩精品亚洲视频| 午夜精品久久久久久久99黑人| 色av吧综合网| 国产日韩中文在线| 成人激情在线播放| 亚洲欧美国产日韩中文字幕| 欧美日韩午夜视频在线观看| 中文字幕精品一区二区精品| 欧美性xxxxx极品娇小| 精品一区二区三区三区| 成人免费网站在线观看| 欧美激情aaaa| 国产精品一区电影| 国色天香2019中文字幕在线观看| 久久69精品久久久久久国产越南| 亚洲午夜久久久影院| 97视频在线观看免费| 国产欧美精品在线播放| 不卡av在线网站| 久久国产精品99国产精| 亚洲欧美在线一区二区| 欧美另类极品videosbestfree| 亚洲2020天天堂在线观看| 欧美日韩成人在线视频| 欧美日韩裸体免费视频| 两个人的视频www国产精品| 全色精品综合影院| 国产亚洲一区精品| 国产精品偷伦视频免费观看国产| 久久综合伊人77777蜜臀| 98精品在线视频| 成人福利在线视频| 久久久久久久久久久网站| 成人天堂噜噜噜| 性夜试看影院91社区| 国产精品久久99久久| 国产97色在线| 久久久亚洲欧洲日产国码aⅴ| 日韩电影中文 亚洲精品乱码| 国产精品电影网站| 亚洲三级黄色在线观看| 另类少妇人与禽zozz0性伦| 黄色91在线观看| 欧美精品激情在线| 国产精品美女久久久久久免费| 另类美女黄大片| 国产欧亚日韩视频| 91在线精品视频| 亚洲影院色在线观看免费| 精品国产自在精品国产浪潮| 欧美肥臀大乳一区二区免费视频| 亚洲精品国产精品久久清纯直播| 日韩高清中文字幕| 欧美性受xxxx黑人猛交| 亚洲国产女人aaa毛片在线| 国产欧美日韩中文| 亚洲乱码国产乱码精品精| 欧美在线一区二区视频| 亚洲性生活视频在线观看| 5252色成人免费视频| 日韩精品中文字| 日韩美女在线播放| 亚洲va欧美va国产综合剧情| 综合欧美国产视频二区| 精品视频在线导航| 欧美日韩在线观看视频小说| 日韩暖暖在线视频| 亚洲欧美另类中文字幕| 亚洲性视频网站| 欧美另类极品videosbest最新版本| 欧美理论电影在线观看| 色婷婷av一区二区三区在线观看| 精品视频一区在线视频| 久久99精品久久久久久青青91| 国产免费一区视频观看免费| 91久久在线播放| 国产日本欧美一区二区三区在线| 日韩美女视频中文字幕| 欧美激情精品久久久久久变态| 欧美在线一区二区三区四| 国产精品久久久久久久av电影| 国产精品久久久久一区二区| 久久久精品影院| 91最新国产视频| 午夜剧场成人观在线视频免费观看| 日韩精品免费综合视频在线播放| 日韩av不卡电影| 欧美日韩亚洲一区二| 国产这里只有精品| 日本午夜人人精品| 亚洲欧美一区二区三区四区| 毛片精品免费在线观看| 成人免费视频网| 精品福利视频导航| 国产精品福利片| www.日韩av.com| 成人国产精品久久久| 国产在线视频2019最新视频| 欧美黄色三级网站| 亚洲精品v天堂中文字幕| 国产美女精品免费电影| 国产成人精彩在线视频九色| 欧美成人全部免费| 亚洲国产日韩一区| 精品久久国产精品| 日韩经典中文字幕在线观看| 中文字幕精品www乱入免费视频| 亚洲最大av网| 亚洲国产天堂久久综合网| 最近2019免费中文字幕视频三| 中文字幕日韩视频| 国产aaa精品| 最近中文字幕2019免费| 国产精品普通话| 欧美亚洲第一页| 亚洲国产精品人久久电影| 午夜精品久久久久久99热软件| 欧美在线欧美在线| 欧美午夜片欧美片在线观看| 亚洲大尺度美女在线| 欧美一级视频免费在线观看| 精品国产999| 丝袜美腿精品国产二区| 色噜噜亚洲精品中文字幕| 国产女精品视频网站免费| 欧美日韩性生活视频| 精品美女久久久久久免费| 91精品视频专区| 国产精品高潮在线| 国产精品视频一区二区三区四| 欧美日韩国产综合视频在线观看中文| 欧美在线中文字幕| 欧美性资源免费| 国自产精品手机在线观看视频| 国产一区二区香蕉| 亚洲精品日产aⅴ| 日韩亚洲精品视频| 国产精品xxxxx| 日韩成人激情视频| 日韩av影片在线观看| 欧美最猛性xxxx| 欧美裸体视频网站| 亚洲精品国产成人| 26uuu另类亚洲欧美日本老年| 亚洲国产精品成人va在线观看| 欧美激情精品久久久久久变态| 欧美日韩另类字幕中文| 国产日本欧美一区二区三区| 亚洲欧美激情精品一区二区| 51久久精品夜色国产麻豆| 国产精品视频yy9099| 亚洲午夜久久久久久久| 亚洲性生活视频| 色哟哟入口国产精品| 亚洲欧洲美洲在线综合| 亚洲精品国产综合区久久久久久久| 青青草99啪国产免费| xxav国产精品美女主播|