遍历memcache中已缓存的key及 php缓存控制

遍历memcache的可以需要有一下几个步骤:

1、通过使用memcache 内置方法Memcache::getExtendedStats,首先获得items信息。

最后得到的解决类似与

  
  
1 $memcache = new Memcache(); 2 3 $all_items = $memcache->getExtendedStats('items'); 4 5 var_export( $all_items);

复制代码
  
  
1 array ( 2 '192.168.0.110:11211' => 3 array ( 4 'items' => 5 array ( 6 1 => 7 array ( 8 'number' => '1', 9 'age' => '1851', 10 ), 11 2 => 12 array ( 13 'number' => '1', 14 'age' => '1851', 15 ), 16 3 => 17 array ( 18 'number' => '2', 19 'age' => '1864', 20 ), 21 7 => 22 array ( 23 'number' => '1', 24 'age' => '1851', 25 ), 26 9 => 27 array ( 28 'number' => '1', 29 'age' => '1', 30 ), 31 12 => 32 array ( 33 'number' => '2', 34 'age' => '1851', 35 ), 36 13 => 37 array ( 38 'number' => '1', 39 'age' => '1851', 40 ), 41 14 => 42 array ( 43 'number' => '1', 44 'age' => '1851', 45 ), 46 15 => 47 array ( 48 'number' => '1', 49 'age' => '1851', 50 ), 51 16 => 52 array ( 53 'number' => '1', 54 'age' => '1850', 55 ), 56 18 => 57 array ( 58 'number' => '2', 59 'age' => '1851', 60 ), 61 19 => 62 array ( 63 'number' => '1', 64 'age' => '1851', 65 ), 66 20 => 67 array ( 68 'number' => '1', 69 'age' => '1851', 70 ), 71 ), 72 ), 73 )
复制代码

$all_items中的key“192.168.0.110:11211” 就是memcache的host和port。

2、已$all_items做为数据源,再次调用Memcache::getExtendedStats,我们需要的数据就在返回的结果里面

我们假设memcache所有的host信息为$options = array('192.168.0.110:11211',);



复制代码
  
  
1 foreach ( $options as $option) { 2 if ( isset( $all_items[ $option]['items'])) { 3 $items = $all_items[ $option]['items']; 4 5 foreach ( $items as $number => $item) { 6 $str = $memcache->getExtendedStats('cachedump', $number, 0); 7 $line = $str[ $option]; 8 if ( is_array( $line) && count( $line) > 0) { 9 foreach ( $line as $key => $value) { 10 $keys[] = $key; 11 } 12 } 13 } 14 } 15 }
复制代码

上面的$keys数组就是我们需要的数据了。

下面贴出来完整的代码



复制代码
  
  
1 function list_key() { 2 $memcache = new Memcache(); 3 $all_items = $memcache->getExtendedStats('items'); 4 $keys = array(); 5 foreach ( $this->_options as $options) { 6 foreach ( $options as $option) { 8    if ( isset( $all_items[ $option]['items'])) { 9 $items = $all_items[ $option]['items']; 10 foreach ( $items as $number => $item) { 11 $str = $memcache->getExtendedStats('cachedump', $number, 0); 12 $line = $str[ $option]; 13    if ( is_array( $line) && count( $line) > 0){
                foreach ( $line as $key => $value) {
$keys[] = $key; 14    } 15   } 16 } 17 } 18 } 19 } 20 21 return array_unique( $keys); 22 23 }

php缓存控制

今天同事说需要在浏览器及时打印出现在正在执行任务的信息,但又不能一口气的把所有的信息全部echo出来。因为程序需要执行2-3个小时才能结束。

这个功能其实也很好做。使用php自带的ob系列函数就可以了。

我实现的代码如下:

复制代码
       
       
1 // 先填充好buffer,防止需要及时输出的东西被放到了buffer中去 start 2 ob_start(); 3 $buffer_size = ini_get('output_buffering'); // 获得缓冲区大小 4 5 for( $i=0; $i<(int) $buffer_size; $i++){ 6 echo ' '; 7 } 8 ob_flush(); 9 flush(); 10 // 先填充好buffer,防止需要及时输出的东西被放到了buffer中去 end 11 12 //下面为需要及时输出的内容 13 for( $i=1; $i<=10; $i++){ 14 echo $i,'<Br />'; 15 ob_flush(); 16 flush(); 17 sleep(1); 18 }
复制代码

每秒打印1个字符。共打印十个数字。

这个效果在ff、ie8下都很好。但是在ie6下,第一次执行的时候确实等了10多秒一下在打印出来的。再次刷次页面的时候才和ff、ie8的效果一直。

我想这个情况是因为ie6浏览器自带缓冲区导致的问题。可是又不知道怎么解决。于是在www上搜索了一下。原来真的是这样的。网上有位哥们说

“IE的某些版本只有在字符串缓冲到256字节的时候才会将缓冲内容输出到浏览器上”。

于是我修改了上面的代码为:

复制代码
       
       
1 // 先填充好buffer,防止需要及时输出的东西被放到了buffer中去 start 2 ob_start(); 3 4 function isIE6(){ 5 $agent = $_SERVER['HTTP_USER_AGENT']; 6 return ( stripos( $agent, 'MSIE 6.0') !== false); 7 } 8 9 $buffer_size = ini_get('output_buffering'); // 获得缓冲区大小 10 11 //如果是IE6 需要加上256,因为在某些ie6版本下 ie6浏览器自己有256的缓冲区 12 if (isIE6()) { 13 $buffer_size = (int) $buffer_size + 256; 14 } 15 16 for( $i=0; $i<(int) $buffer_size; $i++){ 17 echo ' '; 18 } 19 ob_flush(); 20 flush(); 21 // 先填充好buffer,防止需要及时输出的东西被放到了buffer中去 end 22 23 //下面为需要及时输出的内容 24 for( $i=0; $i<10; $i++){ 25 echo $i,'<Br />'; 26 ob_flush(); 27 flush(); 28 sleep(1); 29 }
复制代码

执行下。ok!!

谨此为记。

参考:http://www.iefans.net/ie-php-huanchong-kongzhi/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值