Pre啰嗦:
自从上次关于read/write的文章夭折之后,写blog就一直没提起什么兴趣。
不过,这几天胡乱的看了很多文章,觉得还是需要沉淀,不然,很容易就忘记了,而这个端午三天假期,那真的就是混过去了。
memcached的php客户端支持get/set, getMulti/setMulti.(memcache不支持)
1. get/set可以在直接用字符串或者整型来进行取值。
public Memcached::get ( string $key [, $cache_cb [, float &$cas_token ]] )
如下图:
- $value1 = $m->get(2311574923); // ok
- $value2 = $m->get('2311574923'); // ok
但是,在getMulti的时候,一个value为int的数组,就无法正确取值。
- $tmp_array1 =array(2487890804,2201041500); // error
- $tmp_array2 =array('2487890804','2201041500'); // ok
此为伏笔。
2.实际的操作中,用了一个比较麻烦的方法,用了一个数组将请求的id作为key存储,value是想对应的值。然后,通过array_keys()取出key来进行getMulti。
但是,在这里,php的弱类型麻烦就出来了,
- $str_array = array();
- $str_array[] = '1';
- $str_array[] = '2';
- $int_array = array();
- $int_array[] = 1;
- $int_array[] = 2;
- $kvarray = array();
- $kvarray["1"] = 'a';
- $kvarray["2"] = 'b';
- print_r($kvarray);
- $key = array_keys($kvarray);
- print_r($key);
- print_r(gettype($key[0]));
- if( $key === $int_array ){
- print "keys trans to int";
- }
- else if($key === $str_array){
- print "keys trans to str";
- }
结果是keys trans to int。虽然是用str做key存进去的,但取出来时都变成int类型了。然而,getMulti没有进行转换,所以取不到。同理,我相信setMulti也是这样。
补充,@bmflss给了这样一个更清楚的例子(理论上一般key是整型的,所以PHP应该首先试图转换为整形 如果成功 就作为整型 否则保留)
- $arr = Array('1'=>5,'01'=>5,'2'=>5,'1a1'=>5,'b'=>5);
- $keys = array_keys($arr);
- var_dump($keys);
阅读(1872) | 评论(0) | 转发(0) |