首頁 >後端開發 >php教程 >php中佇列原理以及寫入檔案的圖文程式碼詳解

php中佇列原理以及寫入檔案的圖文程式碼詳解

黄舟
黄舟原創
2017-11-02 09:21:371430瀏覽

本文實例敘述了PHP佇列原理及基於佇列的寫入檔案案例。分享給大家供大家參考,具體如下:

隊列是一種線性表,按照先進先出的原則進行的:

#入隊:

出隊:

PHP實作佇列:第一個元素作為隊頭,最後一個元素作為隊尾

<?php
/**
 * 队列就是这么简单
 *
 * @link
 */
$array = array(&#39;PHP&#39;, &#39;JAVA&#39;);
array_push($array, &#39;PYTHON&#39;); //入队列
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 = &#39;3.txt&#39;;//这个地方是讲队列文件读出的内容写入文件,test中代替的是mysql数据库操作
$file3 = fopen($file_name3,&#39;a&#39;);
while(true)
{
  $c = FALSE;
  $file_name = &#39;1.txt&#39;;//队列文件
  $file = fopen($file_name,&#39;r&#39;);
  if(!feof($f))
  {
    //获得第一条数据
    $a = fgets($file);
    if(!empty($a))
    {
      $c = TRUE;
      fwrite($file3,$a);//这里可以改为数据库操作
    }
  }
  fclose($file);
  if($c)
  {
    //将文件的第一条数据删除
    exec(&#39;sed -i \&#39;1d\&#39; /var/www/csv_sql/1.txt&#39;);
  }
  sleep(1);
  if(time()>=strtotime(&#39;20160416150000&#39;))
  {
    exit;
  }
}
fclose($file3);

讀隊列程序其實就是一個死循環程序,如不設定關閉點,則一直循環讀取檔案

寫入佇列程式比較簡單,就是寫檔

<?php
set_time_limit(0);
$file_name2 = &#39;2.txt&#39;;//test中用来比对队列程序是否正常的
$file2 = fopen($file_name2,&#39;a&#39;);
for($i=1;$i<11;$i++)
{
  $file_name = &#39;1.txt&#39;;//队列文件
  $file = fopen($file_name,&#39;a&#39;);//fopen的mode属性必须是a或a+
  $str = $i.&#39;--&#39;.rand(100001,999999);
  fwrite($file,$str."\n");
  fwrite($file2,$str."\n");
  sleep(1);
  fclose($file);
}
fclose($file2);

以上是php中佇列原理以及寫入檔案的圖文程式碼詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn