PHP之定時器

在我們項目中經(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ù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容