在我們項目中經(jīng)常會遇到需要定時器的功能來解決一些定時任務(wù),比如統(tǒng)計訂單,定時消息,通知等等,但是PHP沒有給我們提供類型定時器的功能,總不能用Linux帶的cron來實現(xiàn)把,那么用什么方式可以簡單實現(xiàn)呢?
1.Laravel或Lumen的提供的定時器功能
這個方法僅僅在Linux下有效
ssh root@you_server_ip
crontab –e
* * * * * php /path-to-your-project/artisan schedule:run >> /dev/null 2>&1
<?php
/*
*author:mjshu
*time 2016/3/29 下午4:20
*All rights reserved
*/
namespace App\Console;
use Illuminate\Support\Facades\DB;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
/**
* 應(yīng)用提供的Artisan命令
*
* @var array
*/
protected $commands = [
//
];
/**
* 定義應(yīng)用的命令調(diào)度
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
* @translator laravelacademy.org
*/
protected function schedule(Schedule $schedule)
{
/** 每分鐘檢查一次CDN狀態(tài) */
$schedule->call('App\Http\Controllers\Admin\Work\CdnController@WorkCdn')->everyMinute();
/**
* 每日更新cdn
*/
$schedule->call('App\Http\Controllers\Admin\QiNiu\QiNiuController@fileUpdateUrl')->hourly();
/**
* 檢查Redis的默認(rèn)方案與自學(xué)習(xí)方案時候存在
*/
$schedule->call('App\Http\Controllers\Admin\Work\SchemeController@schemeWork')->everyMinute();
/**
* 檢查渠道在redis是否正常
*/
$schedule->call('App\Http\Controllers\Admin\Work\DitchController@exists')->everyMinute();
/**
* 每日將redis數(shù)據(jù)寫入DB
*/
$schedule->call('App\Http\Controllers\Admin\Work\DataDbLogController@redis6')->dailyAt('23:55');
$schedule->call('App\Http\Controllers\Admin\Work\DataDbLogController@brandTotal')->dailyAt('23:55');
$schedule->call('App\Http\Controllers\Admin\Work\DataDbLogController@versionTotal')->dailyAt('23:55');
}
}
}
2.WorkerMan提供的定時器功能
優(yōu)點,任務(wù)常駐內(nèi)存
$worker = new BusinessWorker();
$worker->eventHandler = 'App\Http\Controllers\WebSocket\WebSocketController';
$worker->name = 'BusinessWorker';
$worker->count = 3; //每個進(jìn)程都可以單獨的運行定時器 定時器進(jìn)程從0到2
$worker->registerAddress = '127.0.0.1:1238';
<?php
/*
*author:mjshu
*time 2017/9/29 下午4:20
*All rights reserved
*/
namespace App\Http\Controllers\WebSocket;
use App\Http\Controllers\Chat\ChatController;
use App\Http\Controllers\Controller;
use App\Http\Controllers\Group\GroupController;
use App\Http\Controllers\User\UserController;
use GatewayWorker\Lib\Gateway;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Redis;
use Workerman\Lib\Timer;
class WebSocketController extends Controller
{
public static function onWorkerStart($worker){
//定時任務(wù),參數(shù)1,秒數(shù) 參數(shù)2,執(zhí)行的任務(wù)
Timer::add(10,function(){
echo 123;
});
}
如果我們需要第一個進(jìn)程執(zhí)行A任務(wù) 第二個進(jìn)程執(zhí)行B任務(wù)那么可以這樣寫
public static function onWorkerStart($worker){
if($worker->id === 0){
Timer::add(10,function(){
echo 123;
});
}
if($worker->id === 1){
Timer::add(10,function(){
echo 223;
});
}
}
執(zhí)行任務(wù)如下

WechatIMG393.jpeg
當(dāng)然如果你需要在Linux運行推薦使用supervisor進(jìn)行進(jìn)程的守護(hù)