PHP 队列
什么是隊列,是先進先出的線性表,在具體應用中通常用鏈表或者數組來實現,隊列只允許在后端進行插入操作,在前端進行刪除操作。
什么情況下會用了隊列呢,并發請求又要保證事務的完整性的時候就會用到隊列,當然不排除使用其它更好的方法,知道的不仿說說看。
隊列還可以用于減輕數據庫服務器壓力,我們可以將不是即時數據放入到隊列中,在數據庫空閑的時候或者間隔一段時間后執行。比如訪問計數器,沒有必要即時的執行訪問增加的Sql,在沒有使用隊列的時候sql語句是這樣的,假設有5個人訪問:
- update table1 set count=count+1 where id=1?
- update table1 set count=count+1 where id=1?
- update table1 set count=count+1 where id=1?
- update table1 set count=count+1 where id=1?
- update table1 set count=count+1 where id=1?
而使用隊列這后就可以這樣:
- update table1 set count=count+5 where id=1?
減少sql請求次數,從而達到減輕服務器壓力的效果, 當然訪問量不是很大網站根本沒有這個必要。
下面一個隊列類:
- /**
- * 隊列
- *
- * @author jaclon
- *
- */?
- class Queue?
- {?
- private $_queue = array();?
- protected $cache = null;?
- protected $queuecachename;?
- ?
- /**
- * 構造方法
- * @param string $queuename 隊列名稱
- */?
- function __construct($queuename)?
- {?
- ?
- $this->cache =& Cache::instance();?
- $this->queuecachename = 'queue_' . $queuename;?
- ?
- $result = $this->cache->get($this->queuecachename);?
- if (is_array($result)) {?
- $this->_queue = $result;?
- }?
- }?
- ?
- /**
- * 將一個單元單元放入隊列末尾
- * @param mixed $value
- */?
- function enQueue($value)?
- {?
- $this->_queue[] = $value;?
- $this->cache->set($this->queuecachename, $this->_queue);?
- ?
- return $this;?
- }?
- ?
- /**
- * 將隊列開頭的一個或多個單元移出
- * @param int $num
- */?
- function sliceQueue($num = 1)?
- {?
- if (count($this->_queue) < $num) {?
- $num = count($this->_queue);?
- }?
- $output = array_splice($this->_queue, 0, $num);?
- $this->cache->set($this->queuecachename, $this->_queue);?
- ?
- return $output;?
- }?
- ?
- /**
- * 將隊列開頭的單元移出隊列
- */?
- function deQueue()?
- {?
- $entry = array_shift($this->_queue);?
- $this->cache->set($this->queuecachename, $this->_queue);?
- ?
- return $entry;?
- }?
- ?
- /**
- * 返回隊列長度
- */?
- function size()?
- {?
- return count($this->_queue);?
- }?
- ?
- /**
- * 返回隊列中的第一個單元
- */?
- function peek()?
- {?
- return $this->_queue[0];?
- }?
- ?
- /**
- * 返回隊列中的一個或多個單元
- * @param int $num
- */?
- function peeks($num)?
- {?
- if (count($this->_queue) < $num) {?
- $num = count($this->_queue);?
- }?
- return array_slice($this->_queue, 0, $num);?
- }?
- ?
- /**
- * 消毀隊列
- */?
- function destroy()?
- {?
- $this->cache->remove($this->queuecachename);?
- }?
- }?
轉自:http://blog.163.com/lgh_2002/blog/static/44017526201172511139202/
總結
- 上一篇: 一直说眼型的,求问这个是什么眼型,欢迎大
- 下一篇: 求一个工作压力大的个性签名!