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