本文實(shí)例講述了PHP隊(duì)列原理及基于隊(duì)列的寫文件案例。分享給大家供大家參考,具體如下:
隊(duì)列是一種線性表,按照先進(jìn)先出的原則進(jìn)行的:
入隊(duì):
出隊(duì):
PHP實(shí)現(xiàn)隊(duì)列:第一個(gè)元素作為隊(duì)頭,最后一個(gè)元素作為隊(duì)尾
?php /** * 隊(duì)列就是這么簡單 * * @link */ $array = array('PHP', 'JAVA'); array_push($array, 'PYTHON'); //入隊(duì)列 array_shift($array); //出隊(duì)列
什么是雙端隊(duì)列(或雙向隊(duì)列)Deque,全名double-ended queue?
即元素可以在隊(duì)列的任意一段入隊(duì)或出隊(duì),如果我們把這些方法叫做insertLeft()和insertRight(),以及removeLeft()和removeRight()。如果嚴(yán)格禁止調(diào)用insertLeft()和removeLeft()方法(或禁用右段的操作),雙端隊(duì)列功能就和棧一樣。禁止調(diào)用insertLeft()和removeRight()(或相反的另一對(duì)方法),它的功能就和隊(duì)列一樣了。雙端隊(duì)列與?;蜿?duì)列相比,是一種多用途的數(shù)據(jù)結(jié)構(gòu)。
PHP實(shí)現(xiàn)雙端隊(duì)列
?php class Deque { public $queue = array(); /**(尾部)入隊(duì) **/ public function addLast($value) { return array_push($this->queue,$value); } /**(尾部)出隊(duì)**/ public function removeLast() { return array_pop($this->queue); } /**(頭部)入隊(duì)**/ public function addFirst($value) { return array_unshift($this->queue,$value); } /**(頭部)出隊(duì)**/ public function removeFirst() { return array_shift($this->queue); } /**清空隊(duì)列**/ public function makeEmpty() { unset($this->queue); } /**獲取列頭**/ public function getFirst() { return reset($this->queue); } /** 獲取列尾 **/ public function getLast() { return end($this->queue); } /** 獲取長度 **/ public function getLength() { return count($this->queue); } }
隊(duì)列的用途:
隊(duì)列可以很好地異步處理數(shù)據(jù)傳送和存儲(chǔ),當(dāng)你頻繁地向數(shù)據(jù)庫中插入數(shù)據(jù)、頻繁地向搜索引擎提交數(shù)據(jù),就可采取隊(duì)列來異步插入。另外,還可以將較慢的處理邏輯、有并發(fā)數(shù)量限制的處理邏輯,通過消息隊(duì)列放在后臺(tái)處理,例如FLV視頻轉(zhuǎn)換、發(fā)送手機(jī)短信、發(fā)送電子郵件等。
項(xiàng)目案例
這里有個(gè)項(xiàng)目,因?yàn)榉?wù)器權(quán)限問題,沒辦法安裝安裝隊(duì)列程序,而且并發(fā)300+,服務(wù)商的數(shù)據(jù)庫最大連接數(shù)是300,為了解決這個(gè)問題所以編寫了一個(gè)簡單的隊(duì)列程序,代碼如下
讀隊(duì)列代碼:
?php set_time_limit(0); $file_name3 = '3.txt';//這個(gè)地方是講隊(duì)列文件讀出的內(nèi)容寫入文件,test中代替的是mysql數(shù)據(jù)庫操作 $file3 = fopen($file_name3,'a'); while(true) { $c = FALSE; $file_name = '1.txt';//隊(duì)列文件 $file = fopen($file_name,'r'); if(!feof($f)) { //獲得第一條數(shù)據(jù) $a = fgets($file); if(!empty($a)) { $c = TRUE; fwrite($file3,$a);//這里可以改為數(shù)據(jù)庫操作 } } fclose($file); if($c) { //將文件的第一條數(shù)據(jù)刪除 exec('sed -i \'1d' /var/www/csv_sql/1.txt'); } sleep(1); if(time()>=strtotime('20160416150000')) { exit; } } fclose($file3);
讀隊(duì)列程序其實(shí)就是一個(gè)死循環(huán)程序,如不設(shè)置關(guān)閉點(diǎn),則一直循環(huán)讀取文件
寫入隊(duì)列程序比較簡單,就是寫文件
?php set_time_limit(0); $file_name2 = '2.txt';//test中用來比對(duì)隊(duì)列程序是否正常的 $file2 = fopen($file_name2,'a'); for($i=1;$i11;$i++) { $file_name = '1.txt';//隊(duì)列文件 $file = fopen($file_name,'a');//fopen的mode屬性必須是a或a+ $str = $i.'--'.rand(100001,999999); fwrite($file,$str."\n"); fwrite($file2,$str."\n"); sleep(1); fclose($file); } fclose($file2);
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《PHP數(shù)據(jù)結(jié)構(gòu)與算法教程》、《PHP基本語法入門教程》、《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
標(biāo)簽:南寧 樂山 定西 六安 海南 迪慶 十堰 佛山
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PHP隊(duì)列原理及基于隊(duì)列的寫文件案例》,本文關(guān)鍵詞 PHP,隊(duì)列,原理,及,基于,的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。