PHP實現隊列的原理


關於的隊列的介紹,我這里就不多講了,隨便百度一下都很多

用過laravel框架的童鞋都知道其自帶隊列功能,之前我很費解,PHP只是一個腳本,有超時機制

為什么能不停的去執行隊列呢?

帶着這個問題,在網上找了一下相關的介紹,這里我沒有研究透laravel的隊列,而且用這么高大上的實例來給大家講,我估計自己都雲里霧里

所以我就其原理說明一下

 

我們新建一個文件queue

<?php
while(true){
  echo 1;
  sleep(1);    
}

然后中 命令行里面 執行 php queue

你會發現每秒鍾輸出一個1;等了很久,咦,很神奇,為什么php沒有超時呢?

對,就是不會超時,Why?

答:實際上PHP執行腳本是不會超時的,我們在網頁中看到的諸如504等超時,是由Apache,Nginx,PHP配置文件設置的超時時間決定的,因為PHP命令行執行文件沒有使用PHP配置文件,所以默認是不超時的。

 

ps -ef|grep php

會發現有一個 php queue進程


 

php超時的疑惑我們解決了

再來看一下隊列的原理

新建一個文件 artisan

<?php
$redis = new Redis();
$redis->connect('127.0.0.1',6379);
while(1){
        $res = $redis->lpop('listname');
        if($res){echo $res."\r\n";}
        sleep(1);
}

然后php artisan 執行隊列

 

我們來新建一個窗口,進入redis客戶端輸入以下命令【不會redis的可以在我的博客中找相關資料】

lpush listname a b c d e f g

會發現php artisan這個隊列會不斷的把redis里我剛剛push進去的值打出來

其實laravel的隊列就是這個原理,只不過,它不僅支持redis作為載體,還可以使用其他更多的數據庫


 

有人就要問了,我這php artisan啟動了,如果我把窗口關了不就沒用了嗎,

不不不,Linux 還是可以在后台運行的

只要在命令后面加個 &

php artisan &

就可以啦

這些是PHP隊列的基本原理,當然我們還可以去執行對象的隊列及更復雜的情況,更多的請研究Laravel吧,由於筆者水平有限,不對的地方還望指正;謝謝


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM