`
saiyaren
  • 浏览: 228241 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hiphop 2.1 开发问题总结 原创-胡志广

 
阅读更多

1.  Hhvm2.1 生成扩展文件方式

Hhvm2.1 的结构化变化比较大,idl的目录放到了$HPHP_HOME/hphp/system/idl下,并且他的格式已经换成了xxx.idl.json

生成*.h*.cpp的模式为:

php$HPHP_HOME/hphp/system/idl/idl.php cpp xxx.idl.json $HPHP_HOME/hphp/runtime/ext/ext_xxx.h$HPHP_HOME/hphp/runtime/ext/ext_xxx.cpp

参数的意思:

(1)    模式,cpp ,也有其他的如inc,test 

(2)    Idl文件,如hello.idl.json

(3)    输出头文件的位置,$HPHP_HOME/hphp/runtime/ext/ext_hello.h

(4)    输出实现的位置,如$HPHP_HOME/hphp/runtime/ext/ext_hello.cpp

 

例:

有一个新的扩展名字为hello.idl.json

php $HPHP_HOME/hphp/system/idl/idl.phpcpp hello.idl.json $HPHP_HOME/hphp/runtime/ext/ext_hello.h$HPHP_HOME/hphp/runtime/ext/ext_hello.cpp

 

2.  error: 'c_TestClass' was notdeclared in this scope

/export/dev_hphp2.0/hiphop-php_hzg/hphp/runtime/ext_hhvm/ext_hhvm_infotabs.cpp:At global scope:

/export/dev_hphp2.0/hiphop-php_hzg/hphp/runtime/ext_hhvm/ext_hhvm_infotabs.cpp:6118:49:error: 'c_TestClass' was not declared in this scope

/export/dev_hphp2.0/hiphop-php_hzg/hphp/runtime/ext_hhvm/ext_hhvm_infotabs.cpp:6118:125:error: 'c_TestClass' has not been declared

报了上面的错误是因为在ext.h中没有加入新的扩展的头文件,我们只需要把新的扩展的头文件加入进去即可:

#include"hphp/runtime/ext/ext_testclass.h"

 

 

在实现类中需要实现构造函数:

c_TestClass::c_TestClass(Class*cls):ExtObjectData(cls){

 

}

c_TestClass::~c_TestClass(){

 

}

 

当报下面的错误时:

1)这个是参数的问题

/export/dev_hphp2.0/hiphop-php_hzg/hphp/runtime/ext/ext_testclass.cpp:7:57:error: default argument given for parameter 1 of'HPHP::c_TestClass::c_TestClass(HPHP::Class*)'

2)这个是由于c_TestClass(Class* cls):ExtObjectData(cb)变量不一致造成的,比如前面是cls我后面定义的是cb

/export/dev_hphp2.0/hiphop-php_hzg/hphp/runtime/ext/ext_testclass.cpp:7:52:error: 'cb' was not declared in this scope

 

正常的实现是:

c_TestClass::c_TestClass(Class*cls):ExtObjectData(cls){

 

 

 

3.  undefined reference to`HPHP::c_ICE::~c_ICE()'错误解决

../../bin/libext_hhvm.a(ext_ice.cpp.ext_hhvm.cpp.o):(.rodata._ZTVN4HPHP5c_ICEE[vtablefor HPHP::c_ICE]+0x10): undefined reference to `HPHP::c_ICE::~c_ICE()'

../../bin/libext_hhvm.a(ext_ice.cpp.ext_hhvm.cpp.o):(.rodata._ZTVN4HPHP5c_ICEE[vtablefor HPHP::c_ICE]+0x18): undefined reference to `HPHP::c_ICE::~c_ICE()'

../../bin/libext_hhvm.a(ext_ice.cpp.ext_hhvm.cpp.o):(.rodata._ZTVN4HPHP7c_ProxyE[vtablefor HPHP::c_Proxy]+0x10): undefined reference to `HPHP::c_Proxy::~c_Proxy()'

../../bin/libext_hhvm.a(ext_ice.cpp.ext_hhvm.cpp.o):(.rodata._ZTVN4HPHP7c_ProxyE[vtablefor HPHP::c_Proxy]+0x18): undefined reference to `HPHP::c_Proxy::~c_Proxy()'

../../bin/libext_hhvm.a(ext_ice.cpp.ext_hhvm.cpp.o):(.rodata._ZTVN4HPHP14c_IcePHP_classE[vtablefor HPHP::c_IcePHP_class]+0x10): undefined reference to`HPHP::c_IcePHP_class::~c_IcePHP_class()'

../../bin/libext_hhvm.a(ext_ice.cpp.ext_hhvm.cpp.o):(.rodata._ZTVN4HPHP14c_IcePHP_classE[vtablefor HPHP::c_IcePHP_class]+0x18): undefined reference to`HPHP::c_IcePHP_class::~c_IcePHP_class()'

../../bin/libext_hhvm.a(ext_ice.cpp.ext_hhvm.cpp.o):(.rodata._ZTVN4HPHP10c_TypeInfoE[vtablefor HPHP::c_TypeInfo]+0x10): undefined reference to`HPHP::c_TypeInfo::~c_TypeInfo()'

../../bin/libext_hhvm.a(ext_ice.cpp.ext_hhvm.cpp.o):(.rodata._ZTVN4HPHP10c_TypeInfoE[vtablefor HPHP::c_TypeInfo]+0x18): undefined reference to`HPHP::c_TypeInfo::~c_TypeInfo()'

 

当报这个错误的时候,是由于新添加的扩展没有对类进行实现,添加实现即可:

 

在实现类中需要实现构造函数:

c_TestClass::c_TestClass(Class*cls):ExtObjectData(cls){

 

}

c_TestClass::~c_TestClass(){

 

}

 

4.  Idl.json定义

argsvalue不能是””和非字符串;

而且必须是定义非空的只能小于等于2个;

定义String空:null_string;

定义VariantStringMap 空:null_variant;

定义Object空:null_object;

其他的参照hphp/runtime/base/types.h

 

 

5.  Hhvm创建线程失败解决

pthread_attr_t attr;

如果设置attr.stacksize=1.1M,则创建成功;

如果设置:

attr.stacksize=2B,则创建失败;

这是为什么呢?

这是由于1M是一个临界值,创建线程时需要是1M+nkb,也就是需要大于1M才可以;

如果我们需要突破这个限制,那么改如下代码:

由于src/util/ringbuffer.cpp 中设置了线程栈的大小:

static const int kMaxRBBytes = 1 << 20; // 1MB

这里改成小于1M即可;

static const int kMaxRBBytes = 1 << 19; // 512KB

 

这个改成512KB后,就可以支持attr.stacksize=512K+nkb了,但是小于512KB,还是会失败;

所以如果我们要设置线程栈小于1M时,这里我们可以自己控制,比如我们设置了100K,那么相对kMaxRBBytes变量就要设置为小于100K的临界值即可;

 

该问题是百度张慕华解决的,我这里借鉴;

 

解决方式见:

 

https://github.com/facebook/hiphop-php/issues/1015

 

 

6.   魔术函数递归调用问题解决(2.1)

提问地址:

https://github.com/facebook/hiphop-php/issues/1177#issuecomment-26334876

解决地址:

https://github.com/silvermine/hiphop-php/commit/0b59973c71ebfed5bb90976f8b6467f835170d60

 

php代码:

<?php
class CComponent{
    private $_e;
    private $_m;
    public function __get($name){
        $getter='get'.$name;
        if(method_exists($this,$getter))
            return $this->$getter();
        else{
            echo("enter CComponent 2\n");
            exit("===================\n");
        }
    }
    }
 
class CModel extends CComponent{
    private $_components=array();
    private $_componentConfig=array();
 
    public function __get($name){
        $tt = false;
        if($tt)
            return "bb";
        else
            return parent::__get($name);
    }  
 
}
 
class CActiveRecord extends CModel{
    private $_attributes=array();
    public $tag = array(
        "name1" => "value1",
        "name2" => "value2",
        "name3" => "value3",
        "name4" => "value4",
        "name5" => "value5",
    );
 
    public function __construct(){
        $this->_attributes = $this->tag;
    }
 
    public function __get($name){
        if(isset($this->_attributes[$name])){
            echo "enter CActiveRecord 1\n";
            return $this->_attributes[$name];
        }
        else{
            echo "enter CActiveRecord 2\n";
            return parent::__get($name);
        }
    }  
}
 
class A extends CActiveRecord{
    public $b;
    public $attribute;
        public function gettakeFunc(){
        echo "enter takFunc\n";
                return $this->attributes;
        }
 
}
 
$a = new A();
var_dump($a->takeFunc);
?>

 

 

zend vm run result:

enter CActiveRecord 2

enter takFunc

 enter CActiveRecord 2

 enter CComponent 2

 ===================

hhvm run result :

enter CActiveRecord 2

enter takFunc

 HipHop Notice: Undefined property: A::$attributes in    /export/data/www/test/test_ext/classes/test_class_obj_bug.php on line 61

 NULL

 

我们发现这里调用的时候hhvm出现了Undefined property错误,这是由于魔术函数递归操作造成的;

我们在hphp/runtime/base/object-data.cpp

在这个文件中找到MAGIC_PROP_BODY宏,然后删除掉:

AttributeClearer a((attr), this);

改行语句即可;

最终代码为:

#define MAGIC_PROP_BODY(name, attr) \
  const Func* meth = m_cls->lookupMethod(name); \
  assert(meth); \
  invokeUserMethod(retval, meth, CREATE_VECTOR1(CStrRef(key))); \

 

由于进行递归操作时,每次执行AttributeClearer清除了先前的property内容,所以就无法找到;

虽然提问时,scannell告诉我了解决方式,但是我看主线版仍然没有修复该BUG,我将继续跟踪,如果使用该功能的,可以按照上述解决方式解决;

 

 

1
1
分享到:
评论

相关推荐

    hiphop无穷动

    hiphop无穷动

    Hip Hop Beats and Instrumentals Online-crx插件

    每个人都喜欢Hip Hop音乐和Hip Hop Beats,现在Trap成为都市音乐界的一种趋势。 这就是为什么如果您是一名艺术家,则必须获得最好的嘻哈节拍和器乐。 不管他们是R&B,Smooth,Trap还是New School ...他们都必须听...

    Hiphop-Step历史及名称由来.doc

    House舞蹈的兴起是由于HipHop Club中出现的问题,如打架事件,这使得人们转向更加安全、纯粹享受音乐和舞蹈的环境,即House Club。在纽约,Sound Factory Bar的星期三之夜成为了House舞者聚集的热门之地。 Old ...

    Raslani Hip Hop

    "Raslani Hip Hop"可能是指一种特定的字体风格,它结合了Hip Hop文化的元素,旨在为文本内容增添独特的个性和动态感。这种字体可能广泛应用于音乐制作、广告设计、游戏界面、社交媒体帖子以及各种创意项目中,以吸引...

    Hiphop-API:用于实时应用程序的 Hiphop API

    总之,Hiphop API是一个为实时应用程序提供强大支持的JavaScript工具包,它通过简洁的API和开源的方式,为开发者带来高效的实时应用开发体验。通过深入了解和实践,开发者可以充分利用Hiphop API的优势,创建出更加...

    HIP与NOW缺陷的解析 -- 适普(中国)-HIP与NOW缺陷的解析.rar

    "HIP与NOW缺陷"是两个常见的问题,尤其是在半导体制造和集成电路(IC)设计中。本文将深入探讨这两个缺陷的本质、成因以及如何进行预防和解决。 首先,HIP,全称为Heat Induced Pinholing,翻译为热诱导针孔缺陷。...

    Lil Pump高清壁纸嘻哈音乐主题「Lil Pump HD Wallpapers Hip Hop Music Theme」-crx插件

    享受您最喜爱的Hip Hop艺术家的高清图像 - Lil Pump。每个新标签都会获得不同的壁纸。 如果您喜欢嘻哈音乐,那么您肯定对Lil Pump有所了解。 我们添加了您最喜欢的艺术家的高清背景。 此外,借助我们的Twitter小部件...

    Sa-HipHop App-crx插件

    Sa-HipHop,最新的南非音乐Mp3下载还包括SA Hip Hop,非洲之家,深层之屋,Gqom,科威特,部落,Masandi和Ampiano。 Sa-HipHop:南非的灵魂音乐在Sa-HipHop的此处下载,我们随时为您提供最好,最精彩的Sa Hip Hop和...

    简单hiphop街舞教学视频.doc

    简单hiphop街舞教学视频.doc

    Weeknd高清壁纸嘻哈RnB主题「The Weeknd HD Wallpapers Hip Hop RnB Theme」-crx插件

    安装此扩展程序并享受您最喜爱的RnB和Hip Hop艺术家的高清背景 - The Weeknd。 您喜欢RnB和嘻哈音乐吗? 您喜欢The Weeknd吗? 如果您这样做,那么此扩展名仅适合您。 每个新标签页都会为您显示不同的高清背景或The ...

    HipHopPHPFacebook出品的PHP虚拟机运行时和JIT

    《HipHop PHP:Facebook的PHP虚拟机与JIT技术解析》 HipHop PHP,是由Facebook在2010年推出的一款高效能的PHP运行时环境,旨在提高PHP代码的执行效率,尤其是对于大规模Web应用来说,它能显著提升性能。这款工具...

    Hiphop街舞文化历史基础及知识普及.pdf

    嘻哈(Hip Hop)街舞文化起源于20世纪70年代初的美国纽约布朗克斯区,由牙买加移民Kool Herc开创。Kool Herc是最早将大型音响设备带到街头,举办露天派对的人,他的派对因其创新的音乐播放方式——使用唱盘技巧放大...

    billboard-hiphop-chart-api

    其中,广告牌(Billboard)的嘻哈图表(Hip-Hop Chart)更是备受关注,它反映了当下最热门的嘻哈音乐趋势。本篇文章将围绕“广告牌嘻哈图表API”展开,探讨如何利用Python语言与其进行交互,获取并分析实时的嘻哈...

    hiphop装饰暗红色网站模板

    【标题】"hiphop装饰暗红色网站模板"是一款专门针对hiphop文化爱好者或者与音乐、艺术相关的网站设计的模板。这款模板以深红为主要色调,结合hiphop元素,旨在为网站带来独特的视觉冲击力和强烈的艺术氛围。 【描述...

    hiphop:响应式Web编程

    HipHop:响应式Web编程 Hiphop.js是用于编排Web应用程序的 DSL。 "use hiphop" "use hopscript" const hh = require ( "hiphop" ) ; hiphop module prg ( in A , in B , in R , out O ) { do { fork { await ...

    West Coast Hip Hop Beats and Instrumentals-crx插件

    您是否在为下一个项目寻找West Coast,Gangsta,G-Funk或Hip Hop Beats和Instrumental? 这是你的地方! 许多人在节拍和器乐中寻找那种高品质的声音,这些声音使人想起了旧学校和西海岸的嘻哈音乐的开端,但是却没有...

    Hip Hop Wallpapers New Tab Theme-crx插件

    此扩展程序在每个新选项卡中都包括最佳嘻哈音乐人的高清图像! 说唱歌手包括Eminem Lil Wayne Drake等! 此扩展程序在每个新选项卡中都包括最佳嘻哈音乐人的高清图像! 非常适合音乐迷! 说唱歌手包括Fetty Wap,...

Global site tag (gtag.js) - Google Analytics