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定义

args的value不能是””和非字符串;

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

定义String空:null_string;

定义Variant,StringMap 空: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";elsereturn 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,我将继续跟踪,如果使用该功能的,可以按照上述解决方式解决;

hiphop 2.1 开发问题总结 原创-胡志广相关推荐

  1. java web 开发问题总结 1 原创-胡志广

    1.      Linux ssh 多机配置无法连接的问题解决方法 折腾了半天操作步骤一直没有问题,但是就是用ssh连接另一台机器时还是需要输入密码 后来上网查找了一下,该问题是由于$home路径的权 ...

  2. java web 开发问题总结 5 原创-胡志广

    181 myEclipse插件菜单 add hibernate capabilities 不可用的解决办法" 用myEclipse搭建hibernate框架后,有时搞乱了某些东西后,又想重新 ...

  3. linux 总结 原创-胡志广

    1.   ps  监视进程 ps aux USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND root   ...

  4. Android应用开发最强原创知识体系(更新至2019.11.21)

    Android应用开发最强原创知识体系 标签: 知识体系 为了方便大家的阅读以及自己的知识体系的建立,特意来写出这个引导文章.以前我是遇到什么写什么,想到什么写什么,从2016年开始我将围绕这个知识体 ...

  5. Cell Reports:任栓成/高东/胡志安/唐玲团队合作揭示压力性失眠发生的神经机制

    良好的觉醒与睡眠是幸福生活和高效工作的前提.然而,随着现代社会生活节奏的加快,觉醒睡眠障碍,特别是失眠,已成为不容忽视的健康问题.据中国睡眠研究会发布的<2022中国国民健康睡眠白皮书>显 ...

  6. 钉钉总裁叶军与智办事CEO胡志强就企业绩效数字化进行了深度对谈

    近日,智办事CEO胡志强与钉钉总裁叶军(不穷)进行了一次重要的会面,双方对于企业绩效数字化进行了深度对谈. 作为钉钉的生态优质合作伙伴,智办事绩效一直致力于为用户提供更加优质.高效的绩效管理体验,帮助 ...

  7. 原创 人物志|山东省临沭县 - 一位身残志坚的奋斗青年 - 吴忠军

    原创 人物志|山东省临沭县 - 一位身残志坚的奋斗青年 - 吴忠军 02972018-04-29 16:15:27 人物志|山东省临沭县 - 一位身残志坚的奋斗青年 - 吴忠军 齐鲁晚报 2018年0 ...

  8. 超越现有指标57.3%,邢波教授、胡志挺教授团队提出统一NLG评价框架

    长期以来,评价机器生成的文本比较困难.近日,CMU邢波(Eric Xing)教授和UCSD胡志挺(Zhiting Hu)教授的团队提出用一种运算符,统一各类生成任务的评价方式,为未来各种新任务.新要求 ...

  9. 腾讯后台开发面试总结,原创,吐血推荐!!

    前段时间专心面过腾讯,经过了N轮的技术面,结果还是挂了,但没挂在技术面,比较欣慰,回来之后写一点总结,以供有梦想进入腾讯做后台服务器开发的同学参考,本文章为胡成精心总结,胡成原创,copy和转载请通知 ...

最新文章

  1. 用SVN下载编译Spring3.2.4源码导入eclipse
  2. linux c 命令行参数处理函数 getopt()和getopt_long()
  3. QTableView表格视图的列宽设置
  4. webpack中设置jquery为全局对象
  5. maven provided
  6. 内核堆栈 用户堆栈_堆栈痕迹从何而来?
  7. 关于宿主机没有Vmware虚拟网卡的问题分析与解决
  8. 【软件质量】软件设计要考虑性能
  9. 并行计算教程简介 Introduction to Parallel Computing Tutorial
  10. POJ NOI MATH-7653 地球人口承载力估计
  11. SQL中inner join、outer join和cross join的区别
  12. 网络协议及socket
  13. 高校校园网建设方案【含网络拓扑图+拓扑结构图+配置命令】(详细版)
  14. JavaWeb学习总结详解
  15. 后端-科室信息管理接口
  16. MVX-Net论文解读
  17. 基于锁相环的直流电机控制系统simulink仿真
  18. 不用 Spring Security 可否?试试这个小而美的安全框架
  19. 智能网联汽车成兵家必争之地,恒驰智能网联汽车亮点何在?
  20. 关于我吹爆的buyvm机器的一次测评详情

热门文章

  1. 服务器芯片市场国产,飞腾发布国产腾云 S2500服务器芯片 2020中国服务器行业市场全景调研...
  2. 抖音运营技巧都有哪些?如何让爆粉?
  3. MyBatis遇到:There is no getter for property named ‘Xxx‘ in ‘class xxx.xxx.Xxx‘问题
  4. Kotlin - 改良观察者模式
  5. 【个人亲测】2018最流行的浏览器排行榜前10
  6. android默认smb用户名和密码错误,win7系统下连接SMB提示用户名密码错误的解决方法...
  7. python str转bool方法
  8. 手机拍会议照片技巧_在家工作时进行视频会议的12个技巧
  9. 流数据分析之地理围栏应用
  10. vue接口多个参数多个组件互动导致数据渲染混乱bug