遍歷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/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章