本文實例講述了PHP隊列原理及基于隊列的寫文件案例。分享給大家供大家參考,具體如下:
隊列是一種線性表,按照先進(jìn)先出的原則進(jìn)行的:
入隊:
![](http://img.jbzj.com/file_images/article/201711/2017111111349908.png?2017101111418)
出隊:
![](http://img.jbzj.com/file_images/article/201711/2017111111423358.png?2017101111436)
PHP實現(xiàn)隊列:第一個元素作為隊頭,最后一個元素作為隊尾
?php
/**
* 隊列就是這么簡單
*
* @link
*/
$array = array('PHP', 'JAVA');
array_push($array, 'PYTHON'); //入隊列
array_shift($array); //出隊列
什么是雙端隊列(或雙向隊列)Deque,全名double-ended queue?
即元素可以在隊列的任意一段入隊或出隊,如果我們把這些方法叫做insertLeft()和insertRight(),以及removeLeft()和removeRight()。如果嚴(yán)格禁止調(diào)用insertLeft()和removeLeft()方法(或禁用右段的操作),雙端隊列功能就和棧一樣。禁止調(diào)用insertLeft()和removeRight()(或相反的另一對方法),它的功能就和隊列一樣了。雙端隊列與?;蜿犃邢啾?,是一種多用途的數(shù)據(jù)結(jié)構(gòu)。
PHP實現(xiàn)雙端隊列
?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);
}
}
隊列的用途:
隊列可以很好地異步處理數(shù)據(jù)傳送和存儲,當(dāng)你頻繁地向數(shù)據(jù)庫中插入數(shù)據(jù)、頻繁地向搜索引擎提交數(shù)據(jù),就可采取隊列來異步插入。另外,還可以將較慢的處理邏輯、有并發(fā)數(shù)量限制的處理邏輯,通過消息隊列放在后臺處理,例如FLV視頻轉(zhuǎn)換、發(fā)送手機(jī)短信、發(fā)送電子郵件等。
項目案例
這里有個項目,因為服務(wù)器權(quán)限問題,沒辦法安裝安裝隊列程序,而且并發(fā)300+,服務(wù)商的數(shù)據(jù)庫最大連接數(shù)是300,為了解決這個問題所以編寫了一個簡單的隊列程序,代碼如下
讀隊列代碼:
?php
set_time_limit(0);
$file_name3 = '3.txt';//這個地方是講隊列文件讀出的內(nèi)容寫入文件,test中代替的是mysql數(shù)據(jù)庫操作
$file3 = fopen($file_name3,'a');
while(true)
{
$c = FALSE;
$file_name = '1.txt';//隊列文件
$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);
讀隊列程序其實就是一個死循環(huán)程序,如不設(shè)置關(guān)閉點,則一直循環(huán)讀取文件
寫入隊列程序比較簡單,就是寫文件
?php
set_time_limit(0);
$file_name2 = '2.txt';//test中用來比對隊列程序是否正常的
$file2 = fopen($file_name2,'a');
for($i=1;$i11;$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);
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《PHP數(shù)據(jù)結(jié)構(gòu)與算法教程》、《PHP基本語法入門教程》、《php面向?qū)ο蟪绦蛟O(shè)計入門教程》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》
希望本文所述對大家PHP程序設(shè)計有所幫助。
您可能感興趣的文章:- PHP隊列用法實例
- PHP+memcache實現(xiàn)消息隊列案例分享
- PHP的Laravel框架中使用消息隊列queue及異步隊列的方法
- php Memcache 中實現(xiàn)消息隊列
- PHP使用數(shù)組實現(xiàn)隊列
- PHP消息隊列用法實例分析
- php實現(xiàn)的雙向隊列類實例
- 隊列在編程中的實際應(yīng)用(php)
- phpredis提高消息隊列的實時性方法(推薦)
- PHP基于Redis消息隊列實現(xiàn)發(fā)布微博的方法
- PHP實現(xiàn)的memcache環(huán)形隊列類實例