我是c分机的新手,所以如果你觉得我的问题很难回答,请原谅。我正在尝试将php-memcached对象传递给我的自定义php-扩展。有人能帮助我如何检索和使用我的扩展代码中的对象吗?
将在php中创建php-memcached对象,然后将其传递给我的扩展的bleow方法。
我的方法是这样的
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“的操作来使用该结构。
发布于 2016-02-11 13:43:59
正式上你不能。
memcached_st存储在对象中。可以使用"o"修饰符从用户中检索该对象。当php-memcached导出类条目时,还可以请求特定的对象。
#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复制描述它的结构并使用它。请注意,我从原始元素中删除了一些元素。参见内联注释。
#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。
https://stackoverflow.com/questions/35335757
复制相似问题