2016-02-11 2 views
0

Я новичок в расширении c, поэтому, пожалуйста, извините, если вы найдете мой вопрос хромым. Я пытаюсь передать объект php-memcached в свое собственное php-расширение. Может ли кто-нибудь помочь мне в том, как я могу получить и использовать объект в своем расширительном коде.Передача объекта php-memcached в метод расширения

Объект php-memcached будет создан в php, а затем передан методу 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 и не нашел экспортированную структуру, которую я мог бы использовать, добавив «php_memcached.h»

ответ

1

Официально вы не можете.

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. Но вы не знаете, как выглядит этот объект. К сожалению, эта информация не экспортируется. Также не является API уровня.

Если вам нравится рисковать и как играть с чужими вещами, вы тем не менее можете скопировать структуру объекта в свой код и работать с этим. Но будьте осторожны: это может сильно нарушиться, когда разработчики memcached решили каким-либо образом изменить их реализацию ... и ваш компилятор не сможет вам помочь.

Итак, мы копируем структуру, описывающую ее, от php_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 с необходимыми функциями.

+0

Я пробовал, и он работает, однако, как вы правильно сказали, не будет хорошей идеей, чтобы структура была переопределена в моем коде. проверит с командой php-memcached, если они смогут экспортировать структуру в файл заголовка. Я просто не хочу дублировать усилия по созданию экземпляра memcache и добавлению к нему серверов, что может быть избыточным в PHP-коде. Спасибо, что помогли, вы ответили, что у меня много сомнений. –