久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx

Laravel如何讓程序在后臺(tái)執(zhí)行超長(zhǎng)時(shí)間

這篇文章主要介紹Laravel如何讓程序在后臺(tái)執(zhí)行超長(zhǎng)時(shí)間,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

成都創(chuàng)新互聯(lián)公司網(wǎng)站建設(shè)公司提供網(wǎng)站設(shè)計(jì)和自適應(yīng)建站服務(wù)。團(tuán)隊(duì)由有經(jīng)驗(yàn)的網(wǎng)頁(yè)設(shè)計(jì)師、程序員和市場(chǎng)專家組成,能夠提供從H5網(wǎng)站設(shè)計(jì),網(wǎng)站制作,廣告投放,模板建站到小程序設(shè)計(jì)等全方位服務(wù)。 以客戶為中心,致力于為客戶提供創(chuàng)新、高效的解決方案,幫助您打造成功的企業(yè)網(wǎng)站。

解決的問(wèn)題:

● 耗時(shí)較長(zhǎng)

● 各端無(wú)法調(diào)取相關(guān)任務(wù)進(jìn)度進(jìn)行反饋

● 自定義任務(wù)過(guò)后反饋結(jié)果

● 請(qǐng)教下,Laravel 如何讓程序在后臺(tái)執(zhí)行超長(zhǎng)時(shí)間的代碼?

流程簡(jiǎn)述

● 使用異步隊(duì)列執(zhí)行相關(guān)任務(wù)

● 使用助手方法進(jìn)行任務(wù) / 進(jìn)度創(chuàng)建

● 通過(guò)暴露接口反饋相關(guān)進(jìn)度

助手類源碼如下

<?php
// +----------------------------------------------------------------------
// | Do what we can do
// +----------------------------------------------------------------------
// | Date  : 2019/9/11 - 9:25 AM
// +----------------------------------------------------------------------
// | Author: seebyyu <seebyyu@gmail.com> :)
// +----------------------------------------------------------------------
namespace App\Lib\Support;
trait MissionFrom
{
    /**
     * 標(biāo)記前綴 模塊名稱#業(yè)務(wù)模塊#板塊標(biāo)記
     *
     * @var string
     */
    public $prefix = 'school:task:default';
    /**
     * 任務(wù)詳情
     * @var array
     */
    public $original = [];
    /**
     * redis 鏈接
     *
     * The Redis factory implementation.
     *
     * @var \Illuminate\Redis\Connections\Connection
     */
    protected $redis;
    /**
     * 任務(wù)存在有效期
     *
     * @var int
     */
    protected $seconds = 600;
    /**
     * 創(chuàng)建任務(wù)
     *
     * @param string $sheet
     * @param int $len 總長(zhǎng)度
     * @return string
     */
    public function createTask($sheet = '', $len = 100)
    {
        $sheet = $sheet ?: $this->sheet();
        $detail = [
            //  開(kāi)始時(shí)間
            'begin' => time(),
            //  標(biāo)記號(hào)
            'sheet' => $sheet,
            //  總長(zhǎng)度
            'total_len' => $len,
            //  當(dāng)前長(zhǎng)度
            'schedule' => 0
        ];
        //  主體信息
        $this->connect()->setex($this->prefix. ':'. $sheet, $this->seconds, serialize($detail));
        //  初始化任務(wù)進(jìn)度
        $this->connect()->setex($this->prefix. ':schedule:'. $sheet, $this->seconds, 1);
        return $sheet;
    }
    /**
     * 設(shè)置任務(wù)內(nèi)容
     *
     * @param $sheet
     * @param $value
     * @return MissionFrom
     */
    public function setTaskContent($sheet, $value)
    {
        if( $this->connect()->exists($this->prefix. ':'. $sheet)){
            $this->connect()->setex($this->prefix. ':content:'. $sheet, $this->seconds, serialize($value));
        }
        return $this;
    }
    /**
     * 獲取任務(wù)內(nèi)容
     *
     * @param $sheet
     * @return MissionFrom
     */
    public function getTaskContent($sheet)
    {
        return empty($data = $this->connect()->get($this->prefix. ':content:'. $sheet)) ? null : unserialize($data);
    }
    /**
     * 設(shè)置任務(wù)前綴
     *
     * @param string $prefix
     * @return $this
     */
    public function setPrefix($prefix = '')
    {
        $this->prefix = 'school:task:'. ($prefix ?: 'default');
        return $this;
    }
    /**
     * 任務(wù)詳情
     *
     * @param string $sheet
     * @return array
     */
    public function taskDetail($sheet = '')
    {
        $detail = $this->connect()->get($key = ($this->prefix. ':'. $sheet));
        if( !empty($detail)){
            $this->original = array_merge( unserialize($detail), [
                'schedule' => (int)$this->getSchedule($sheet),
                'content' => $this->getTaskContent($sheet)
            ]);
        }
        return (array) $this->original;
    }
    /**
     * 進(jìn)度遞增
     *
     * @param string $sheet
     * @return int
     */
    public function increments($sheet = '')
    {
        $inc = 0;
        if( !empty($detail = $this->taskDetail($sheet)) &&
            $detail['schedule'] < $detail['total_len']){
            $inc = $this->connect()->incr($this->prefix. ':schedule:'. $sheet);
        }
        return $detail['schedule'] ?? $inc;
    }
    /**
     * 獲取任務(wù)進(jìn)度
     *
     * @param string $sheet
     * @return string
     */
    public function getSchedule($sheet = '')
    {
        return $this->connect()->exists($key = ($this->prefix. ':schedule:'. $sheet)) ? $this->connect()->get($key) : 0;
    }
    /**
     * 生成任務(wù)單號(hào)
     */
    private static function sheet()
    {
        return md5(\Hash::make(date('YmdHis')));
    }
    /**
     * 所有任務(wù)進(jìn)度
     *
     * @return array
     */
    public function taskAll()
    {
        $task_group_list = [];
        //  分組
        foreach( (array)$this->connect()->keys('school:task:*') as $task) {
            if( count($task_item = explode(':', $task)) == 4){
                list($model, $model_name, $business, $key) = $task_item;
                $task_group_list[$business][] = $this->setPrefix($business)->taskDetail($key);
            }
        }
        return $task_group_list;
    }
    /**
     * @return \Illuminate\Foundation\Application|mixed
     */
    public function connect()
    {
        return app('redis.connection');
    }
}

調(diào)用過(guò)程如下

<?php
namespace App\Jobs;
use App\Lib\Support\MissionFrom;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
/**
 * Excel 導(dǎo)入
 *
 * Class importExcel
 * @package App\Jobs
 */
class importExcel implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, MissionFrom;
    /**
     * 任務(wù)運(yùn)行的超時(shí)時(shí)間。
     *
     * @var int
     */
    public $timeout = 300;
    /**
     * @var string
     */
    public $sheet;
    /**
     * importExcel constructor.
     * @param $sheet
     */
    public function __construct($sheet = '')
    {
        $this->sheet = $sheet;
    }
    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        //  自定義業(yè)務(wù)前綴
        $prefix = 'export_students';
        //  創(chuàng)建任務(wù)進(jìn)度
        $this->sheet = $this->setPrefix($prefix)->createTask($this->sheet, 20);
        //  開(kāi)始執(zhí)行任務(wù)
        echo '任務(wù)開(kāi)始:'. $this->sheet. "\n";
        for ($i = 1; $i <= 20; $i++){
            //  延時(shí)模擬長(zhǎng)時(shí)間任務(wù)
            sleep(rand(1, 2));
            //  進(jìn)度 +1
            echo '任務(wù)進(jìn)度:'. ($this->setPrefix($prefix)->increments($this->sheet)). "\n";
        }
        //  追加結(jié)果 任何類型
        $this->setPrefix($prefix)->setTaskContent($this->sheet, [
            'url' => 'http://www.baidu.com'
        ]);
    }
}

控制器部分

....
    /**
     * 學(xué)校pc端后臺(tái)任務(wù)進(jìn)度列表
     *
     * @return array
     */
    public function duties()
    {
        if( empty($key = request('key'))){
            $key = md5(\Hash::make(date('YmdHis')));
            //  創(chuàng)建任務(wù)
            $this->dispatch(new importExcel($key));
            return $key;
        }else{
            //  查詢單條任務(wù)信息
            //  $this->setPrefix('export_students')->taskDetail($key);
            return success(['data' => array_merge([
                //  導(dǎo)出每餐記錄列表
                'meal_records' => [],
                //  每日記錄列表
                'daily_records' => [],
                //  其他記錄列表
                'other_records' => [],
                //  照片庫(kù)
                'photo_gallery' => [],
                //  采購(gòu)計(jì)劃
                'purchasing_plan' => [],
                //  憑證記錄
                'voucher_records' => [],
                //  食材庫(kù)
                'ingredient_records' => [],
                //  導(dǎo)入學(xué)生
                'import_students' => [],
                //  導(dǎo)出學(xué)生
                'export_students' => []
            ], $this->taskAll())]);
        }
    }
    ....

達(dá)到的效果

Laravel如何讓程序在后臺(tái)執(zhí)行超長(zhǎng)時(shí)間

注意事項(xiàng)

QUEUE_DRIVER=sync 變更為 redis

開(kāi)發(fā)階段強(qiáng)烈建議把 horizon 這玩意兒裝上,Laravel 自帶的報(bào)錯(cuò)異常我實(shí)在無(wú)力吐槽,不方便排錯(cuò).

以上是“Laravel如何讓程序在后臺(tái)執(zhí)行超長(zhǎng)時(shí)間”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

文章名稱:Laravel如何讓程序在后臺(tái)執(zhí)行超長(zhǎng)時(shí)間
文章鏈接:http://www.js-pz168.com/article40/jhhjho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、定制網(wǎng)站、網(wǎng)站維護(hù)、企業(yè)建站、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx
久久综合一区二区| 日本aⅴ免费视频一区二区三区| 天天免费综合色| 福利视频网站一区二区三区| 国产精品一区二区a| 色哟哟国产精品免费观看| 日韩无一区二区| 亚洲精品国产第一综合99久久| 看国产成人h片视频| αv一区二区三区| 伊人久久婷婷色综合98网| 欧美大片拔萝卜| 一区二区三区日韩精品| 国产98色在线|日韩| 蜜桃传媒视频第一区入口在线看| 欧美三级视频在线观看| 国产精品久久久久aaaa樱花| 美女视频第一区二区三区免费观看网站| 97精品国产97久久久久久久久久久久| 日韩jizzz| 亚洲精品一区二区三区蜜桃下载| 亚洲成人免费观看| 99久久精品免费看| 色综合天天性综合| 国产亚洲精品精华液| 日日夜夜精品视频免费| 99精品国产一区二区| 欧美优质美女网站| 中文字幕在线播放不卡一区| 韩国理伦片一区二区三区在线播放| 国产精品国产三级欧美二区| 欧美三级电影在线观看| 国产精品嫩草久久久久| 韩国女主播一区| 日本一区二区在线| 精品国产精品网麻豆系列| 日本美女一区二区三区| 国产亚洲精品自在久久| 69av一区二区三区| 亚洲国产毛片aaaaa无费看| 96av麻豆蜜桃一区二区| 欧美亚洲自拍偷拍| 亚洲精品v日韩精品| 99在线精品一区二区三区| 日本韩国一区二区三区视频| 国产精品久久网站| 成人做爰69片免费看网站| 中文字幕精品一区日韩| 中文字幕亚洲区| 不卡一区在线观看| 欧美三级日韩三级国产三级| 一区二区三区欧美| 91丨九色丨国产| 91精品国产91久久久久久一区二区 | 亚洲国产cao| 91丝袜美腿高跟国产极品老师| 欧美性猛交一区二区三区精品| 亚洲男同性恋视频| 91免费版黄色| 日韩亚洲欧美综合| 六月丁香综合在线视频| 日本在线高清视频一区| 国产欧美日韩亚州综合 | 99精品欧美一区| 欧美巨大另类极品videosbest| 亚洲一二三四久久| 精品欧美一区二区在线观看视频| 欧美成人性战久久| 国产一区二区三区四区在线观看| 亚洲激情电影在线| 亚洲欧美另类久久久精品2019| 91国产在线播放| 欧美一级视频精品观看| 老司机精品视频在线| 亚洲一区二区三区色| 亚洲精品日韩综合观看成人91| 99九九视频| 久久亚洲精品小早川怜子| 国产99久久久精品| 欧美浪妇xxxx高跟鞋交| 日本不卡的三区四区五区| 日韩少妇中文字幕| 亚洲免费在线电影| 精品乱子伦一区二区三区| 国产区在线观看成人精品| 成人免费观看av| 欧美一区二区日韩一区二区| 精品一区二区三区香蕉蜜桃| 色婷婷av一区二区三区gif| 亚洲成人资源网| 日本在线播放不卡| 亚洲一区二区视频| 日本一区二区久久精品| 亚洲免费大片在线观看| 快播日韩欧美| 亚洲日本在线观看| 精品国产一二| 综合久久国产九一剧情麻豆| 国产一区二区免费电影| 国产精品乱码一区二区三区软件| 97久久精品午夜一区二区| 久久久久久麻豆| 97netav| 中文字幕 久热精品 视频在线| 91麻豆精品秘密入口| 国产亚洲精品aa| 国产不卡一区二区三区在线观看| 国产亚洲一区二区三区四区| 99在线视频首页| 国产亚洲精品bt天堂精选| 成人黄色在线免费观看| 国产精品视频观看| 久久综合婷婷综合| 亚洲精品久久久久久国产精华液| 欧美一区2区三区4区公司二百 | 国内精品久久国产| 亚洲色图欧洲色图| 日韩精品一区二区三区色偷偷| 亚洲午夜免费福利视频| 亚洲一区二区在线看| 男女性色大片免费观看一区二区 | 蜜桃视频在线观看一区二区| 欧美亚男人的天堂| 国产精品乡下勾搭老头1| 日韩视频一区二区三区 | 精品国产一区二区三区忘忧草| fc2成人免费人成在线观看播放| 欧美精品一区二区高清在线观看| av一区观看| 亚洲日本va在线观看| 欧美日本亚洲| 日韩成人dvd| 欧美一区二区三区在线视频| jlzzjlzz亚洲女人18| 国产精品色一区二区三区| 蜜桃av色综合| 日韩综合小视频| 欧美二区在线观看| 91年精品国产| 自拍偷拍欧美精品| 亚洲精品在线免费看| 另类小说欧美激情| 日韩免费电影一区| 国产一区二区精品免费| 亚洲成人一区二区在线观看| 欧美午夜精品久久久| av亚洲精华国产精华| 国产精品家庭影院| 亚洲欧洲一区二区福利| 国产一区二区三区四区五区入口 | 91麻豆精品国产91久久久资源速度 | 日韩美女视频在线| 国产一区高清视频| 性做久久久久久免费观看| 欧美三级视频在线| 99r国产精品| 亚洲精选一二三| 在线精品视频一区二区三四| 国产91富婆露脸刺激对白| 国产精品免费视频网站| 亚洲午夜精品久久| 国产精品99久久久久久宅男| 国产日韩欧美不卡| 亚洲一卡二卡三卡| 成人精品高清在线| 有码一区二区三区| 欧美精品国产精品| 国产综合第一页| 日本免费新一区视频| 精品国产污污免费网站入口 | 亚洲综合在线观看视频| 欧美女孩性生活视频| 国产成人精品免费视频大全最热 | 欧美极品少妇xxxxⅹ高跟鞋| 日韩欧美精品一区二区三区经典| 激情成人综合网| 国产精品女上位| 欧美亚洲图片小说| y111111国产精品久久婷婷| 天天综合日日夜夜精品| 精品国产露脸精彩对白| 色噜噜一区二区| 东方欧美亚洲色图在线| 一区二区三区在线观看欧美| 欧美肥胖老妇做爰| 久久婷婷国产综合尤物精品| 精品一区二区三区免费观看| 国产欧美精品一区aⅴ影院 | 亚洲精品一区二区三区在线观看 | 一区二区三区四区在线播放| 欧美精品在线视频| 欧美久久综合性欧美| 国产成人在线观看免费网站| 亚洲色图视频网站| 91精品婷婷国产综合久久竹菊| 久久久一本精品99久久精品| 国产乱人伦精品一区二区在线观看| 最好看的中文字幕久久| 欧美一区二区视频在线观看2022| 欧美日韩精品久久|