摘要:能看出來,是最高級(jí)的,一般推薦使用這個(gè)來處理隊(duì)列監(jiān)聽。注使用,當(dāng)更新代碼的時(shí)候,需要停止,然后重新啟動(dòng),這樣才能把修改的代碼應(yīng)用上。
CLI
參考:http://laravel-china.org/docs/5.1/artisan
cli處理業(yè)務(wù),把業(yè)務(wù)封裝成一個(gè)命令,用php artisan來調(diào)用
自定義的命令放在App/Console/Commands下
創(chuàng)建方式
php artisan make:console 命令名 —command=調(diào)用時(shí)名字
php artisan make:console SendEmails --command=emails:send
會(huì)在App/Console/Commands下生成SendEmails文件
命令生成以后,需要填寫該類的signature和description屬性,signature用來指定調(diào)用時(shí)的名字,desc是描述,這兩個(gè)屬性在調(diào)用list顯示命令的時(shí)候會(huì)被用到。
handle方法在命令執(zhí)行時(shí)被調(diào)用,可以將所有命令邏輯都放在這個(gè)方法里面,我們可以在命令控制器的構(gòu)造函數(shù)中注入任何依賴.
最后需要把命令注入到app/Console/Kernel.php文件中,否則這個(gè)命令artisan是找不到的
protected $commands = [ "AppConsoleCommandsAnalyzeLog" ];
ip = $ip; } public function handle() { echo $this->ip->getName(); } }
調(diào)用:php artisan AnalyzeLog事件
事件的原理就是 觀察者模式 的實(shí)現(xiàn);
新建一個(gè)事件類(被觀察者)
可以建立多個(gè)監(jiān)聽類(觀察者)
然后標(biāo)記觀察者和被觀察者的關(guān)系,當(dāng)被觀察者變化時(shí),通知觀察者
(在appprovicderseventServiceProviders中標(biāo)記事件類下的監(jiān)聽類)
建立事件類
php artisan make:event DelMsgEvent
會(huì)在appenents目錄下創(chuàng)建
data(); }
建立監(jiān)聽者
在applisteners目錄下創(chuàng)建
建立事件和監(jiān)聽者的關(guān)系
在appprovidersEventServiceProviders.php中的protected $listen = [ //事件 "AppEventsSomeEvent" => [ //事件的監(jiān)聽者 "AppListenersEventListener", "AppListenersSomeEventListener", ], ];在控制器中觸發(fā)事件
//Event事件的支持,Event::fire所在的類 use IlluminateSupportFacadesEvent; //要用到的事件 use AppEventsSomeEvent; public function getShow() { $find = array( "uid" => 55, "msg.women" => false //搜索,根據(jù)msg字段中的women字段 ); $list = $this->collec->find($find); foreach($list as $document) //是個(gè)對(duì)象,需要迭代遍歷 { var_dump($document); } //觸發(fā)事件 Event::fire(new SomeEvent($list)); }隊(duì)列隊(duì)列任務(wù)可以放到redis中,redis的配置是config/databases.php里的
會(huì)把任務(wù)放到redis中的queues:default隊(duì)列中
把失敗的任務(wù)放到queues:default:reserved有序集合中
創(chuàng)建一個(gè)隊(duì)列任務(wù)php artisan make:job SendReminderEmail運(yùn)行成功后會(huì)在app/Jobs目錄下生成一個(gè)SendReminderEmail.php
class SendReminderEmail extends Job implements ShouldQueue { use InteractsWithQueue, SerializesModels; public $name; //調(diào)用隊(duì)列時(shí),初始化的參數(shù) public function __construct($name) { $this->name = $name; } //隊(duì)列默認(rèn)執(zhí)行此方法 public function handle() { Log::info("this is queue send to ".$this->name); } //隊(duì)列任務(wù)失敗執(zhí)行此方法 public function failed() { Log::error("fail send to ".$this->name); } }插入隊(duì)列任務(wù),可以使用控制器中的DispatchesJobs trait(該trait在控制器基類Controller.php中引入)提供的dispatch方法手動(dòng)分發(fā)任務(wù)
當(dāng)然也可以在控制器之外的其它地方使用dispatch分發(fā)任務(wù),當(dāng)然在此之前需要在該類中使用use DispatchesJobs。public function getShow() { //生成一個(gè)隊(duì)列任務(wù),并傳入?yún)?shù) $this->dispatch(new SendReminderEmail(time())); }處理任務(wù)
Laravel為此提供了三種Artisan命令:
queue:work 默認(rèn)只執(zhí)行一次隊(duì)列請(qǐng)求, 當(dāng)請(qǐng)求執(zhí)行完成后就終止;
queue:listen 監(jiān)聽隊(duì)列請(qǐng)求,只要運(yùn)行著,就能一直接受請(qǐng)求,除非手動(dòng)終止;
queue:work --daemon 同 listen 一樣, 只要運(yùn)行著,就能一直接受請(qǐng)求,不一樣的地方是在這個(gè)運(yùn)行模式下,當(dāng)新的請(qǐng)求到來的時(shí)候,不重新加載整個(gè)框架,而是直接 fire 動(dòng)作。能看出來, queue:work --daemon 是最高級(jí)的,一般推薦使用這個(gè)來處理隊(duì)列監(jiān)聽。
注:使用 queue:work --daemon ,當(dāng)更新代碼的時(shí)候,需要停止,然后重新啟動(dòng),這樣才能把修改的代碼應(yīng)用上。
上述操作將隊(duì)列推送到默認(rèn)隊(duì)列,即配置文件中的default,當(dāng)然你還可以將任務(wù)推送到指定隊(duì)列:
public function sendReminderEmail(Request $request,$id){ $user = AppUser::findOrFail($id); $job = (new SendReminderEmail($user))->onQueue("emails"); $this->dispatch($job); }因?yàn)槟J(rèn)監(jiān)聽的 default 隊(duì)列,所以需要指定監(jiān)聽隊(duì)列
php artisan queue:listen --queue=syncOrder除此之外,Laravel還支持延遲任務(wù)執(zhí)行時(shí)間,這里我們指定延遲1分鐘執(zhí)行任務(wù):
public function sendReminderEmail(Request $request,$id){ $user = User::findOrFail($id); $job = (new SendReminderEmail($user))->delay(60); $this->dispatch($job); }日志目前,Log門面支持八種日志級(jí)別(使用RFC 5424標(biāo)準(zhǔn)):
Log::emergency($error); //緊急狀況,比如系統(tǒng)掛掉 Log::alert($error); //需要立即采取行動(dòng)的問題,比如數(shù)據(jù)庫異常等,這種狀況應(yīng)該通過短信提醒 Log::critical($error); //嚴(yán)重問題,比如:應(yīng)用組件無效,意料之外的異常 Log::error($error); //運(yùn)行時(shí)錯(cuò)誤,不需要立即處理但需要被記錄和監(jiān)控 Log::warning($error); //警告但不是錯(cuò)誤,比如使用了被廢棄的API Log::notice($error); //普通但值得注意的事件 Log::info($error); //感興趣的事件,比如登錄、退出 Log::debug($error); //詳細(xì)的調(diào)試信息下面我們就來分別演示下這幾種日志級(jí)別的日志記錄,我們將在TestController的log方法中進(jìn)行測(cè)試:
public function log(){ Log::emergency("系統(tǒng)掛掉了"); Log::alert("數(shù)據(jù)庫訪問異常"); Log::critical("系統(tǒng)出現(xiàn)未知錯(cuò)誤"); Log::error("指定變量不存在"); Log::warning("該方法已經(jīng)被廢棄"); Log::notice("用戶在異地登錄"); Log::info("用戶xxx登錄成功"); Log::debug("調(diào)試信息"); }Contracts, ServiceContainer, ServiceProvider, Facades關(guān)系Contracts 合同,契約,也就是接口,定義一些規(guī)則,每個(gè)實(shí)現(xiàn)此接口的都要實(shí)現(xiàn)里面的方法
ServiceContainer 實(shí)現(xiàn)Contracts,具體的邏輯實(shí)現(xiàn)
ServiceProvider ServiceContainer的服務(wù)提供者,返回ServiceContainer的實(shí)例化,供其他地方使用,可以把它加入到app/config的provider中,會(huì)被自動(dòng)注冊(cè)到容器中
Facades 簡化ServiceProvider的調(diào)用方式,而且可以靜態(tài)調(diào)用ServiceContainer中的方法
實(shí)現(xiàn)
Contracts接口可以寫或不寫,這里就不定義了
定義一個(gè)ServiceContainer,實(shí)現(xiàn)具體的功能namespace AppHelper; class MyFoo { public function add($a, $b) { return $a+$b; } }定義一個(gè)ServiceProvider供其他地方使用ServiceContain
app->bind("myfoo", function(){ return new MyFoo(); }); } }在app/config.php中的providers數(shù)組中加入ServiceProvider,讓系統(tǒng)自動(dòng)注冊(cè)
AppProvidersMyFooServiceProvider::class,這時(shí)候就可以使用了,假設(shè)在控制器中使用
public function two($id=null) { //從系統(tǒng)容器中獲取實(shí)例化對(duì)象 $myfoo = App::make("myfoo"); echo $myfoo->add(1,2); }這樣太麻煩,還需要用make來獲取對(duì)象,為了簡便,就可以使用門面功能,定義門面MyFooFacade
namespace AppFacades; use IlluminateSupportFacadesFacade; class MyFooFacade extends Facade { protected static function getFacadeAccessor() { //這里返回的是ServiceProvider中注冊(cè)時(shí),定義的字符串 return "myfoo"; } }在控制器里就可以直接調(diào)用了
use AppFacadesMyFooFacade; public function two($id=null) { //從系統(tǒng)容器中獲取實(shí)例化對(duì)象 $myfoo = App::make("myfoo"); echo $myfoo->add(1,2); //使用門面 echo MyFooFacade::add(4,5); }總的來說,自定義了一個(gè)類,為了方便在其他別處使用,便可以使用服務(wù)提供者和門面
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/30312.html
摘要:很多程序員使用創(chuàng)建他們的應(yīng)用程序。是一個(gè)免費(fèi)開源的應(yīng)用程序框架。是的模板語言,對(duì)藝術(shù)家友好,這個(gè)程序員的命令行工具可以在中工作使用插件和幫助器我們可以進(jìn)一步擴(kuò)展對(duì)應(yīng)用的支持。 很多PHP程序員使用 [laravel] 創(chuàng)建他們的應(yīng)用程序。[laravel] 是一個(gè)免費(fèi)開源的PHP web應(yīng)用程序框架。它基于多個(gè)Symfony 組件,提供了一個(gè)開發(fā)框架,包括authentication,...
摘要:開發(fā)人員可以通過命令行工具生成和管理項(xiàng)目環(huán)境。附帶了一個(gè)名為的優(yōu)秀的命令行工具它提供了一些開發(fā)過程中有用的命令用,可以用來生成框架代碼和數(shù)據(jù)庫管理。這就是的目錄結(jié)構(gòu)發(fā)揮作用的地方。 Laravel被稱為全棧式框架,因?yàn)樗軌蛱幚韽木W(wǎng)絡(luò)服務(wù)到數(shù)據(jù)庫管理、HTML生成的一切事情,垂直集成的web開發(fā)環(huán)境給開發(fā)者提供了更好的體驗(yàn)。 開發(fā)人員可以通過命令行工具,生成和管理Laravel項(xiàng)目環(huán)...
摘要:有些人將其稱為容器編排平臺(tái),而并非唯一的此類平臺(tái)。但是在中,您可以快速擴(kuò)展出多個(gè)實(shí)例你看看使用擴(kuò)展你的網(wǎng)站是何其便捷。當(dāng)你指向群集的地址和節(jié)點(diǎn)的端口號(hào)時(shí),你就已經(jīng)可見瀏覽器中正在運(yùn)行的程序了。 showImg(https://segmentfault.com/img/remote/1460000017838786?w=1120&h=757); Laravel 是開發(fā) PHP 應(yīng)用程序的...
摘要:更多擴(kuò)展包中有豐富的擴(kuò)展包來幫你完成幾乎任何你想實(shí)現(xiàn)的功能。我們不能把所有的擴(kuò)展包都整理出來,然而,這里還是列出了一些很有用的。總之,你幾乎總是能夠找到一個(gè)擴(kuò)展包可以解決你當(dāng)前的問題。 Laravel 是一個(gè)非常流行且簡單易用的PHP框架,它提供了很多基礎(chǔ)的工具(如 RESTful 路由、內(nèi)置的ORM、模版等)使你能夠快速的創(chuàng)建應(yīng)用。這意味著你可以花費(fèi)更少的時(shí)間來建立應(yīng)用程序的模版,給...
摘要:不過除了使用加密,還可以使用原文鏈接使用來調(diào)試應(yīng)用程序的數(shù)據(jù)以及使用一些總結(jié)參考資料參考資料使用來調(diào)試你的參考資料框架填充中文數(shù)據(jù)測(cè)試數(shù)據(jù) 使用Tinker來調(diào)試Laravel應(yīng)用程序的數(shù)據(jù)以及使用Tinker一些總結(jié) [toc] 今天我們將討論如何使用Laravel的一些鮮為人知的功能來快速讀取Laravel應(yīng)用程序中的數(shù)據(jù)。我們可以使用Laravel的手工內(nèi)置php artisan...
摘要:通過安裝器首先,通過安裝安裝器確保在系統(tǒng)路徑中中對(duì)應(yīng)路徑是,對(duì)應(yīng)路徑是,其中表示當(dāng)前用戶家目錄,否則不能在命令行任意路徑下調(diào)用命令。安裝完成后,通過簡單的命令即可在當(dāng)前目錄下創(chuàng)建一個(gè)新的應(yīng)用,例如,將會(huì)創(chuàng)建一個(gè)名為的新應(yīng)用,且包含所有依賴。 配置laravel-admin 官方的教程還是沒問題的,但也遇到了一點(diǎn)點(diǎn)小小坑,再次做個(gè)記錄吧 安裝 LaravelLaravel 使用 Comp...
閱讀 2821·2021-10-26 09:48
閱讀 1692·2021-09-22 15:22
閱讀 4071·2021-09-22 15:05
閱讀 627·2021-09-06 15:02
閱讀 2618·2019-08-30 15:52
閱讀 2121·2019-08-29 18:38
閱讀 2769·2019-08-28 18:05
閱讀 2339·2019-08-26 13:55