文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>PHP与Clucene的接口开发

PHP与Clucene的接口开发

时间:2010-12-12  来源:moyuhappy

clucene以前在空闲时,研究过PHP的扩展模块开发,苦于没有找到一个比较好的调试方法,因此只做了少量的基本工作,感觉zend公司开发的PHP扩展模块有点过于复杂,调试真是让人头痛的事,若哪位有比跟踪调试的好方法,请留言。 zend PHP的扩展模块开发帮助方面的,google等能找到,这里把曾经做过的接口部分给出来大家看看
clucene可能有不稳定的部分,在写接口前最好先测试,至于哪里有问题,当时忘做笔记了,暂时忘了

//StandardIctclas
enum {STANDARD_ANALYZER};
static zend_object_handlers index_searcher_object_handlers;
static zend_object_handlers hits_object_handlers;
zend_class_entry *index_searcher_class_entry;
zend_class_entry *hits_class_entry;

zend_module_entry clucene_module_entry = {
 STANDARD_MODULE_HEADER,
 "clucene",
 NULL,
 PHP_MINIT(clucene),   
 NULL,                 
 PHP_RINIT(clucene),              
 NULL,                 
 PHP_MINFO(clucene),
 PHP_CLUCENE_MODULE_VERSION,
 STANDARD_MODULE_PROPERTIES
};
  static void index_searcher_object_dtor(void *object, zend_object_handle handle TSRMLS_DC)
{
 index_searcher_object *intern = (index_searcher_object*) object;
 
 zend_hash_destroy(intern->std.properties);
 FREE_HASHTABLE(intern->std.properties);
 
 
 if (intern->searcher != NULL) {
  intern->searcher->close();
  delete intern->searcher;
 }
 if (intern->field != NULL) {
  delete [] intern->field;
 }
 efree(object);
}

static zend_object_value index_searcher_object_new(zend_class_entry *class_type TSRMLS_DC)
{
 zend_object_value retval;
 index_searcher_object *intern;
 zval *tmp;
 
 intern = (index_searcher_object*) emalloc(sizeof(index_searcher_object));
 memset(intern, 0, sizeof(index_searcher_object));
 intern->searcher = NULL;
 intern->field    = NULL;
 intern->std.ce   = class_type;
 ALLOC_HASHTABLE(intern->std.properties);
 zend_hash_init(intern->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
 zend_hash_copy(intern->std.properties,
       &class_type->default_properties,
       (copy_ctor_func_t) zval_add_ref,
       (void *) &tmp, sizeof(zval *));
 retval.handle = zend_objects_store_put(intern,
             index_searcher_object_dtor,
             NULL,
             NULL TSRMLS_CC);
 retval.handlers = &index_searcher_object_handlers;
 return retval;
}

static void hits_object_dtor(void *object, zend_object_handle handle TSRMLS_DC)
{
 hits_object *intern = (hits_object*) object;
 
 zend_hash_destroy(intern->std.properties);
 FREE_HASHTABLE(intern->std.properties);
 
 
 if (intern->hits != NULL) {
  delete intern->hits;
 }
 efree(object);
}

static zend_object_value hits_object_new(zend_class_entry *class_type TSRMLS_DC)
{
 zend_object_value retval;
 hits_object *intern;
 zval *tmp;
 
 intern = (hits_object*) emalloc(sizeof(hits_object));
 memset(intern, 0, sizeof(hits_object));
 intern->hits   = NULL;
 intern->std.ce = class_type;
 ALLOC_HASHTABLE(intern->std.properties);
 zend_hash_init(intern->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
 zend_hash_copy(intern->std.properties,
       &class_type->default_properties,
       (copy_ctor_func_t) zval_add_ref,
       (void *) &tmp, sizeof(zval *));
 retval.handle = zend_objects_store_put(intern,
             hits_object_dtor,
             NULL,
             NULL TSRMLS_CC);
 retval.handlers = &hits_object_handlers;
 return retval;
}
static zend_object_value hits_object_create(zend_class_entry *class_type, Hits *hits TSRMLS_DC)
{
 zend_object_value retval;
 hits_object *intern;
 zval *tmp;
 
 intern = (hits_object*) emalloc(sizeof(hits_object));
 memset(intern, 0, sizeof(hits_object));
 intern->hits = hits;
 intern->std.ce = class_type;
 ALLOC_HASHTABLE(intern->std.properties);
 zend_hash_init(intern->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
 zend_hash_copy(intern->std.properties,
       &class_type->default_properties,
       (copy_ctor_func_t) zval_add_ref,
       (void *) &tmp, sizeof(zval *));
 retval.handle = zend_objects_store_put(intern,
             hits_object_dtor,
             NULL,
             NULL TSRMLS_CC);
 retval.handlers = &hits_object_handlers;
 return retval;
}
#ifdef COMPILE_DL_CLUCENE
extern "C" {
ZEND_GET_MODULE(clucene)
}
#endif

PHP_METHOD(IndexSearcher, __construct);
PHP_METHOD(IndexSearcher, search);
PHP_METHOD(IndexSearcher, close);
static zend_function_entry index_searcher_functions[] = {
 PHP_ME(IndexSearcher, __construct,    NULL, ZEND_ACC_PUBLIC)
 PHP_ME(IndexSearcher, search,         NULL, ZEND_ACC_PUBLIC)
 PHP_ME(IndexSearcher, close,          NULL, ZEND_ACC_PUBLIC)
 {NULL, NULL, NULL}
};

PHP_METHOD(Hits, __construct);
PHP_METHOD(Hits, length);
PHP_METHOD(Hits, get);
PHP_METHOD(Hits, id);
PHP_METHOD(Hits, score);

static zend_function_entry hits_functions[] = {
 PHP_ME(Hits, __construct, NULL, ZEND_ACC_PRIVATE)
 PHP_ME(Hits, length,      NULL, ZEND_ACC_PUBLIC)
 PHP_ME(Hits, get,         NULL, ZEND_ACC_PUBLIC)
 PHP_ME(Hits, id,          NULL, ZEND_ACC_PUBLIC)
 PHP_ME(Hits, score,       NULL, ZEND_ACC_PUBLIC)
 {NULL, NULL, NULL}
};

PHP_METHOD(IndexSearcher, __construct)
{
 index_searcher_object *intern;
 char *path;
 long path_len;
 zval *fields,**z_item;
 const wchar_t **fields_ary;
 int i,count;
 
 php_set_error_handling(EH_THROW, zend_exception_get_default()
         TSRMLS_CC);
 
 
 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sa", &path,
         &path_len,&fields) == FAILURE) {
  php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
  return;
 }
 //for(i=0;i<)
  count = zend_hash_num_elements(Z_ARRVAL_P(fields));
 fields_ary =_CL_NEWARRAY(const wchar_t*,count+1);
 
 zend_hash_internal_pointer_reset(Z_ARRVAL_P(fields));
  for (i = 0; i < count; i ++) {
      char* key;
      ulong idx;
      // 获取当前数据
      zend_hash_get_current_data(Z_ARRVAL_P(fields), (void**) &z_item);
      convert_to_string_ex(z_item);
      fields_ary[i] = Misc::_charToWide(Z_STRVAL_PP(z_item));
  
      // 将数组中的内部指针向前移动一位
      zend_hash_move_forward(Z_ARRVAL_P(fields));
  }
 fields_ary[count]=NULL;
 intern = (index_searcher_object*) zend_object_store_get_object(getThis() TSRMLS_CC);
 php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);  try {
  intern->searcher = new IndexSearcher(path);
 } catch (CLuceneError& error) {
  zend_throw_exception(zend_exception_get_default(), error.what(), 0 TSRMLS_CC);
  return;
 }
 intern->field = fields_ary;
}
 
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载