设为首页 收藏本站
查看: 450|回复: 0

[经验分享] 在 windows 下 用C++ 开发 PHP 扩展

[复制链接]

尚未签到

发表于 2015-8-28 10:39:15 | 显示全部楼层 |阅读模式
我翻遍了Google, 也没用找到一篇真正能运行的C++ 下面 开发 PHP 扩展的文章。于是,我又翻遍了pecl,看看有没有例子。
发现还是没有。唯一能看到的几个是:Linux 下面 开发 C++ 扩展的文章,一试,发现时 php 5.0 beta 时候的文章了,都已经
过时了。无奈只能自己摸索。
  后来,在没有思路的时候,我觉得先编译PHP 开发包。结果,费了九牛二虎之力终于把 PHP 5.2 和  5.3 都在 visual stdio 下面编译
成功了。我编译了一个release 版本, 一个 debug 版本。release 版本 其实在 PHP 安装目录的 dev 下面有,如果不要debug 版本的,
可以直接用内置release,不需要编译 PHP 的开发包了。
  编译了PHP 之后,开始有些明白PHP 扩展 是怎么回事了。其实就是一个动态链接库。
  我通过 内置的 ext_skel_win32.php 生成一个扩展工程。当然,要做点改动,这个工程比较旧了,是对vc 6.0 的。
在 配置属性 ==》 c/c++ ==> 预处理定义  加一个 : _USE_32BIT_TIME_T 。这是 因为 vs 2005 用的是 64位的时间,
而zend 引擎默认是 32 位。
在很多手册里面,都说要加  extern "c" {} 在头文件里面,实际上,根本就没有必要了,如果你只是些 5.2 以上的扩展的话。已经内部加好了。
这样,就能编译扩展了。记住,是release 版本的,如果要编译debug 版本的,那么就重新编译吧PHP吧。
  下面我说说 如何转换 C++ 的类,到 PHP。
比如 我有个 Dog 类,有个方法叫做 bark() 有个属性叫做 name(主意写法有很多种,我只是介绍一种)
  
zend_object_handlers dog_object_handlers;
zend_class_entry *dog_ce;
struct dog_object {
    zend_object std; // PHP 标准类
    Dog *dog; // dog 类
};
// 释放内存
void dog_free_storage(void *object TSRMLS_DC)
{
    dog_object *obj = (dog_object *)object;
    delete obj->dog;
    zend_hash_destroy(obj->std.properties);
    FREE_HASHTABLE(obj->std.properties);
    efree(obj);
}
//  创建内置PHP 类,其实类就是一个 zend hash
zend_object_value dog_create_handler(zend_class_entry *type TSRMLS_DC)
{
    zval *tmp;
    zend_object_value retval;
    dog_object *obj = (dog_object *)emalloc(sizeof(dog_object));
    memset(obj, 0, sizeof(dog_object));
    obj->std.ce = type;
    ALLOC_HASHTABLE(obj->std.properties);
    zend_hash_init(obj->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
    zend_hash_copy(obj->std.properties, &type->default_properties,
        (copy_ctor_func_t)zval_add_ref, (void *)&tmp, sizeof(zval *));
    retval.handle = zend_objects_store_put(obj, NULL,
        dog_free_storage, NULL TSRMLS_CC);
    retval.handlers = &dog_object_handlers;
    return retval;
}
PHP_METHOD(Dog, __construct)
{
    string name;
    Dog *dog = NULL;
    zval *object = getThis();
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name) == FAILURE) {
        RETURN_NULL();
    }
    dog = new Dog(name);
    dog_object *obj = (dog_object *)zend_object_store_get_object(object TSRMLS_CC);
    obj->dog = dog;
}

PHP_METHOD(Dog, bark)
{
    Dog *dog;
    dog_object *obj = (dog_object *)zend_object_store_get_object(
        getThis() TSRMLS_CC);
    dog = obj->dog;
    if (dog != NULL) {
        dog->bark();
    }
}
function_entry dog_methods[] = {
    PHP_ME(Dog,  __construct,     NULL, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
    PHP_ME(Dog,  bake,           NULL, ZEND_ACC_PUBLIC)
    {NULL, NULL, NULL}
};

PHP_MINIT_FUNCTION(cplusplusdog)
{
    zend_class_entry ce;
    INIT_CLASS_ENTRY(ce, "Dog", dog_methods);
    dog_ce = zend_register_internal_class(&ce TSRMLS_CC);
    dog_ce->create_object = dog_create_handler;
    memcpy(&dog_object_handlers,
        zend_get_std_object_handlers(), sizeof(zend_object_handlers));
    dog_object_handlers.clone_obj = NULL;
    return SUCCESS;
}
好了,不罗嗦了,可以说,zend 2.2 已经非常的支持 C++ 写扩展了。c++的开发效率对我这样的菜鸟来说要比c快
很多。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-105429-1-1.html 上篇帖子: phpmyadmin 提示“无法加载 mcrypt (外链,英语) 扩展,请检查您的 PHP 配置” 下篇帖子: 用于php二进制操作和socket二进制通讯的phpbuffer v0.1开源发布
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表