本文實例敘述了PHP佇列原理及基於佇列的寫入檔案案例。分享給大家供大家參考,具體如下:
隊列是一種線性表,按照先進先出的原則進行的:
#入隊:
出隊:
PHP實作佇列:第一個元素作為隊頭,最後一個元素作為隊尾
<?php /** * 队列就是这么简单 * * @link */ $array = array('PHP', 'JAVA'); array_push($array, 'PYTHON'); //入队列 array_shift($array); //出队列
什麼是雙端佇列(或雙向佇列)Deque,全名double -ended queue?
即元素可以在隊列的任一段入隊或出隊,如果我們把這些方法叫做insertLeft()和insertRight(),以及removeLeft()和removeRight()。如果嚴格禁止呼叫insertLeft()和removeLeft()方法(或停用右段的操作),雙端佇列功能就和棧一樣。禁止呼叫insertLeft()和removeRight()(或相反的另一對方法),它的功能就跟佇列一樣了。雙端佇列與堆疊或佇列相比,是一種多用途的資料結構。
PHP實作雙端佇列
<?php class Deque { public $queue = array(); /**(尾部)入队 **/ public function addLast($value) { return array_push($this->queue,$value); } /**(尾部)出队**/ public function removeLast() { return array_pop($this->queue); } /**(头部)入队**/ public function addFirst($value) { return array_unshift($this->queue,$value); } /**(头部)出队**/ public function removeFirst() { return array_shift($this->queue); } /**清空队列**/ 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); } }
佇列的用途:
佇列可以很好地非同步處理資料傳送和存儲,當你頻繁地向資料庫中插入資料、頻繁地向搜尋引擎提交數據,就可採取佇列來非同步插入。另外,還可以將較慢的處理邏輯、有並發數量限制的處理邏輯,透過訊息佇列放在後台處理,例如FLV視訊轉換、傳送手機簡訊、傳送電子郵件等。
項目案例
這裡有個項目,因為伺服器權限問題,沒辦法安裝安裝佇列程序,而且並發300+,服務商的資料庫最大連接數是300,為了解決這個問題所以編寫了一個簡單的隊列程序,代碼如下
讀隊列代碼:
<?php set_time_limit(0); $file_name3 = '3.txt';//这个地方是讲队列文件读出的内容写入文件,test中代替的是mysql数据库操作 $file3 = fopen($file_name3,'a'); while(true) { $c = FALSE; $file_name = '1.txt';//队列文件 $file = fopen($file_name,'r'); if(!feof($f)) { //获得第一条数据 $a = fgets($file); if(!empty($a)) { $c = TRUE; fwrite($file3,$a);//这里可以改为数据库操作 } } fclose($file); if($c) { //将文件的第一条数据删除 exec('sed -i \'1d\' /var/www/csv_sql/1.txt'); } sleep(1); if(time()>=strtotime('20160416150000')) { exit; } } fclose($file3);
讀隊列程序其實就是一個死循環程序,如不設定關閉點,則一直循環讀取檔案
寫入佇列程式比較簡單,就是寫檔
<?php set_time_limit(0); $file_name2 = '2.txt';//test中用来比对队列程序是否正常的 $file2 = fopen($file_name2,'a'); for($i=1;$i<11;$i++) { $file_name = '1.txt';//队列文件 $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);
以上是php中佇列原理以及寫入檔案的圖文程式碼詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!