首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将php-memcached对象传递给扩展方法

将php-memcached对象传递给扩展方法
EN

Stack Overflow用户
提问于 2016-02-11 09:48:01
回答 1查看 71关注 0票数 0

我是c分机的新手,所以如果你觉得我的问题很难回答,请原谅。我正在尝试将php-memcached对象传递给我的自定义php-扩展。有人能帮助我如何检索和使用我的扩展代码中的对象吗?

将在php中创建php-memcached对象,然后将其传递给我的扩展的bleow方法。

我的方法是这样的

代码语言:javascript
复制
PHP_METHOD(Test_Ext, test_memcache) 
{
    zval *obj, *memc_link = NULL;
    memcached_st *memc;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &memc_link) == FAILURE) {
    return;
}
obj = getThis();

    //How can I use the memc_link to get the memcached_st obj ???    

}

我已经尝试谷歌,但有非常少的帮助在网上为同样的。我还查找了php-memcached源代码,没有找到导出的struct,我可以通过执行包含"php_memcached.h“的操作来使用该结构。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-11 13:43:59

正式上你不能。

memcached_st存储在对象中。可以使用"o"修饰符从用户中检索该对象。当php-memcached导出类条目时,还可以请求特定的对象。

代码语言:javascript
复制
#include "memcached/php_memcached.h"

/*...*/
zval *memcached_object;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &memcached_object, php_memc_get_ce()) == FAILURE) {
    return;
}
/* ... */

然后,您可以确保memcached_object包含一个memcached PHP对象。但你不知道这个物体是什么样子。不幸的是,这些信息没有被导出。C级API也不是。

如果您喜欢冒险,喜欢玩别人的私事,那么您可以将对象结构复制到代码中,并使用它。但请注意:当memcached维护人员决定以任何方式更改其实现时,这可能会严重破坏.你的编译器也帮不了你。

因此,我们从memcached.c复制描述它的结构并使用它。请注意,我从原始元素中删除了一些元素。参见内联注释。

代码语言:javascript
复制
#include "memcached/php_memcached.h"

typedef struct {
    zend_object zo;

    struct memc_obj {
        memcached_st *memc;
        zend_bool compression;

#ifdef DISABLED_0
        /* Commenting these out as we don't have access to the
           enum declarations. We should not copy or create any of
           these objects as we won't know the size, but we will know
           the offset of the members above, which should be enough.
           Also we don't know if HAVE_MEMCACHED_SASL is defined so we
           know nothing about store_retry_count's offset.
        */

        enum memcached_serializer serializer;
        enum memcached_compression_type compression_type;
#if HAVE_MEMCACHED_SASL
        zend_bool has_sasl_data;
#endif
        long store_retry_count;
#endif
    } *obj;

    zend_bool is_persistent;
    zend_bool is_pristine;
    int rescode;
    int memc_errno;
} fake_php_memc_t;

PHP_FUNCTION(myfunc)
{
    zval *memcached_object;
    fake_php_memc_t *fakeobj;
    memcached_st *memc;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &memcached_object, php_memc_get_ce()) == FAILURE) {
        return;
    }

    fakeobj = (php_memc_t *) zend_object_store_get_object(object TSRMLS_CC);
    memc = fakeobj->obj->memc;
    /* .... */
}

注意:我还没有测试这个,可能会有排字等。

提醒:如前所述,要小心,这就建立了关于另一个扩展到您的洞察力的假设!

更好的做法是要求php-memcached维护人员导出一个带有您需要的特性的API。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35335757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档