检查 Aerospike 数据库中是否存在密钥
Check for key exists in the Aerospike database
你能解释一下为什么 Aerospike::exists
方法抛出 致命错误:
代码:
$aerospike = new Aerospike(
[
'hosts' => [
['addr' => '127.0.0.1', 'port' => 3000]
],
'shm' => [],
],
false,
[]
);
$bins = ['value' => 99];
$akey = $aerospike->initKey('test', 'cache', 'test-data');
$putStatus = $aerospike->put(
$akey,
$bins,
0,
[Aerospike::OPT_POLICY_KEY => Aerospike::POLICY_KEY_SEND]
);
var_dump($putStatus); // Aerospike::OK here
$deleteStatus = $aerospike->remove($akey);
var_dump($deleteStatus); // Aerospike::OK here
$existsStatus = $aerospike->exists($akey, $metadata); // Fatal error
环境:
- Ubuntu 16.04.1
- PHP 7.0.13
- Arospike PHP 古 3.4.13
- Aerospike Docker 图片(服务器):
aerospike:3.10.1
测试:
$ php aerospike.php
/tmp/aerospike.php:24:
int(0)
/tmp/aerospike.php:27:
int(0)
PHP Fatal error: Aerospike::exists(): exists/getMetadata:
unable to fetch the record in /tmp/aerospike.php on line 29
PHP Stack trace:
PHP 1. {main}() /tmp/aerospike.php:0
PHP 2. Aerospike->exists() /tmp/aerospike.php:29
我在 src/aerospike/aerospike_record_operations.c
中找到:
if (AEROSPIKE_OK != (status = aerospike_record_operations_exists(as_object_p, &as_key_for_put_record, error_p, metadata_p, options_p TSRMLS_CC)))
{
DEBUG_PHP_EXT_ERROR("exists/getMetadata: unable to fetch the record");
goto exit;
}
并在 src/aerospike/aerospike_common.h
中:
#define DEBUG_PHP_EXT_ERROR(args...) DEBUG_PHP_EXT_COMPARE_LEVEL(AS_LOG_LEVEL_ERROR, E_ERROR, args)
#define DEBUG_PHP_EXT_COMPARE_LEVEL(log_level, php_log_level, args...) \
do { \
if (!(((as_log_level) PHP_EXT_AS_LOG_LEVEL_OFF) == php_log_level_set)) \
if (php_log_level_set >= log_level) { \
php_error_docref(NULL TSRMLS_CC, php_log_level, args); \
aerospike_helper_log_callback((log_level | 0x08), __func__ TSRMLS_CC, \
__FILE__, __LINE__, ##args); \
} \
} while(0)
我检查了 the documentation,但没有发现如何解决这个问题的提示。
谢谢
已通过使用以下标志编译 php 客户端来修复:
CFLAGS="-std=gnu99 -g -D__AEROSPIKE_PHP_CLIENT_LOG_LEVEL__=PHP_EXT_AS_LOG_LEVEL_OFF"
你能解释一下为什么 Aerospike::exists
方法抛出 致命错误:
代码:
$aerospike = new Aerospike(
[
'hosts' => [
['addr' => '127.0.0.1', 'port' => 3000]
],
'shm' => [],
],
false,
[]
);
$bins = ['value' => 99];
$akey = $aerospike->initKey('test', 'cache', 'test-data');
$putStatus = $aerospike->put(
$akey,
$bins,
0,
[Aerospike::OPT_POLICY_KEY => Aerospike::POLICY_KEY_SEND]
);
var_dump($putStatus); // Aerospike::OK here
$deleteStatus = $aerospike->remove($akey);
var_dump($deleteStatus); // Aerospike::OK here
$existsStatus = $aerospike->exists($akey, $metadata); // Fatal error
环境:
- Ubuntu 16.04.1
- PHP 7.0.13
- Arospike PHP 古 3.4.13
- Aerospike Docker 图片(服务器):
aerospike:3.10.1
测试:
$ php aerospike.php
/tmp/aerospike.php:24:
int(0)
/tmp/aerospike.php:27:
int(0)
PHP Fatal error: Aerospike::exists(): exists/getMetadata:
unable to fetch the record in /tmp/aerospike.php on line 29
PHP Stack trace:
PHP 1. {main}() /tmp/aerospike.php:0
PHP 2. Aerospike->exists() /tmp/aerospike.php:29
我在 src/aerospike/aerospike_record_operations.c
中找到:
if (AEROSPIKE_OK != (status = aerospike_record_operations_exists(as_object_p, &as_key_for_put_record, error_p, metadata_p, options_p TSRMLS_CC)))
{
DEBUG_PHP_EXT_ERROR("exists/getMetadata: unable to fetch the record");
goto exit;
}
并在 src/aerospike/aerospike_common.h
中:
#define DEBUG_PHP_EXT_ERROR(args...) DEBUG_PHP_EXT_COMPARE_LEVEL(AS_LOG_LEVEL_ERROR, E_ERROR, args)
#define DEBUG_PHP_EXT_COMPARE_LEVEL(log_level, php_log_level, args...) \
do { \
if (!(((as_log_level) PHP_EXT_AS_LOG_LEVEL_OFF) == php_log_level_set)) \
if (php_log_level_set >= log_level) { \
php_error_docref(NULL TSRMLS_CC, php_log_level, args); \
aerospike_helper_log_callback((log_level | 0x08), __func__ TSRMLS_CC, \
__FILE__, __LINE__, ##args); \
} \
} while(0)
我检查了 the documentation,但没有发现如何解决这个问题的提示。
谢谢
已通过使用以下标志编译 php 客户端来修复:
CFLAGS="-std=gnu99 -g -D__AEROSPIKE_PHP_CLIENT_LOG_LEVEL__=PHP_EXT_AS_LOG_LEVEL_OFF"