Chinaunix首页 | 论坛 | 博客
  • 博客访问: 87754
  • 博文数量: 16
  • 博客积分: 356
  • 博客等级: 一等列兵
  • 技术积分: 190
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-13 21:09
文章分类

全部博文(16)

文章存档

2012年(16)

我的朋友

分类: Python/Ruby

2012-06-24 15:19:19

Pre啰嗦:
自从上次关于read/write的文章夭折之后,写blog就一直没提起什么兴趣。
不过,这几天胡乱的看了很多文章,觉得还是需要沉淀,不然,很容易就忘记了,而这个端午三天假期,那真的就是混过去了。

memcached的php客户端支持get/set, getMulti/setMulti.(memcache不支持)

1. get/set可以在直接用字符串或者整型来进行取值。
public  Memcached::get ( string $key [,  $cache_cb [, float &$cas_token ]] )
如下图:

点击(此处)折叠或打开

  1. $value1 = $m->get(2311574923); // ok
  2. $value2 = $m->get('2311574923'); // ok

但是,在getMulti的时候,一个value为int的数组,就无法正确取值。

点击(此处)折叠或打开

  1. $tmp_array1 =array(2487890804,2201041500); // error
  2. $tmp_array2 =array('2487890804','2201041500'); // ok
此为伏笔。
2.实际的操作中,用了一个比较麻烦的方法,用了一个数组将请求的id作为key存储,value是想对应的值。然后,通过array_keys()取出key来进行getMulti。
但是,在这里,php的弱类型麻烦就出来了,

点击(此处)折叠或打开

  1. $str_array = array();
  2. $str_array[] = '1';
  3. $str_array[] = '2';
  4. $int_array = array();
  5. $int_array[] = 1;
  6. $int_array[] = 2;

  7. $kvarray = array();
  8. $kvarray["1"] = 'a';
  9. $kvarray["2"] = 'b';
  10. print_r($kvarray);
  11. $key = array_keys($kvarray);
  12. print_r($key);
  13. print_r(gettype($key[0]));
  14. if( $key === $int_array ){
  15.     print "keys trans to int";
  16. }
  17. else if($key === $str_array){
  18.     print "keys trans to str";
  19. }
结果是keys trans to int。虽然是用str做key存进去的,但取出来时都变成int类型了。然而,getMulti没有进行转换,所以取不到。同理,我相信setMulti也是这样。

补充,@bmflss给了这样一个更清楚的例子(理论上一般key是整型的,所以PHP应该首先试图转换为整形 如果成功 就作为整型 否则保留)

点击(此处)折叠或打开

  1. $arr = Array('1'=>5,'01'=>5,'2'=>5,'1a1'=>5,'b'=>5);
  2. $keys = array_keys($arr);
  3. var_dump($keys);

阅读(1847) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~