問題來源:
場景一:因為有時候我們雖然寫好了定時任務蜕企,但是我們卻沒有權限去服務器上執(zhí)行暗挑。
場景二:我們的測試人員要測某一個流程困乒,這個流程需要手動執(zhí)行開發(fā)寫的定時任務蝗肪,開發(fā)說你去服務器上執(zhí)行哪個哪個定時任務就行了袜爪,估計測試會跟你急眼的,他哪里知道你的定時任務放在哪里了薛闪,又該怎么去執(zhí)行辛馆,這時候就需要我們將我們所有的跟測試相關的定時任務都顯示到頁面上,然后讓測試選擇執(zhí)行哪個腳本就可以了豁延。是不是很方便昙篙,廢話少說,看實現(xiàn)诱咏。-
首先在路由文件中加上以下代碼苔可,
#定時任務相關,上線后刪除 if (env('APP_ENV') != 'live') { require (__DIR__ . '/Routes/console.php'); }
-
app/Http/Routes/console.php 下加入如下代碼:
Route::group(['prefix' => 'console'], function () { //取出我們需要的所有定時任務的列表 Route::get('/', function () { $list = Artisan::all();/*將所有的定時任務取出來,如果沒有可能是需要裝一下_ide_helper.php拓展包*/ $tmpArr = []; foreach ($list as $key => $val) { $isMatched = preg_match('/(user|Fund|command|market|emp):\w+/', $key, $matches);/*將我們需要的定時任務取出來*/ if (!$isMatched) { continue; } //將定時任務名稱與描述關聯(lián)成數(shù)組 $tmpArr[$key] = $val->getDescription(); } dd($tmpArr);//顯示定時任務的列表 }); //運行我們的要運行的定時任務命令 Route::get('/{name}/{param?}', function ($name = null, $param = null) { $list = Artisan::all(); //判斷輸入的命令是否在命令列表中 if (!array_key_exists($name, $list)) { dd('沒有此命令'); } //定時任務執(zhí)行的時長設置袋狞,要不瀏覽器中容易超時 set_time_limit(300); //執(zhí)行定時任務 $str = "cd " . base_path() . " && php artisan $name $param"; exec($str,$output, $return_var); dd(implode("\r\n",$output)); });
-
演示一下:
首先在瀏覽器中調用 http://test/console/輸出定時任務列表: array:3 [▼ "command:ChangeTime" => "修改時間" "command:UpdateStaus" => "修改狀態(tài)" "command: SendMessage" => "發(fā)消息" ]
運行我們需要運行的定時任務:
http://test/console/command:ChangeTime
出現(xiàn)了""
說明我們的定時任務跑成功了