久久久久在线观看_又色又爽又黄的免费视频播放_一区中文字幕_日韩电影在线播放

今日焦點(diǎn) 焦點(diǎn)資訊 營銷之道 企業(yè)報(bào)道 淘寶運(yùn)營 網(wǎng)站建設(shè) 軟件開發(fā) 400電話
  當(dāng)前位置: 首頁 » 資訊 » 軟件開發(fā) » 正文

php-resque使用說明

放大字體  縮小字體 發(fā)布日期:2018-02-24  來源:企業(yè)800網(wǎng)  作者:新格網(wǎng)  瀏覽次數(shù):912  【去百度看看】
核心提示:項(xiàng)目中經(jīng)常會(huì)有后臺(tái)運(yùn)行任務(wù)的需求,比如發(fā)送郵件時(shí),因?yàn)橐B接郵件服務(wù)器,往往需要5-10秒甚至更長時(shí)間,如果能先給用戶一個(gè)成功的提示信息,然后在后臺(tái)慢慢處理發(fā)送郵件的操作,顯然會(huì)有更好的用戶體驗(yàn)。
項(xiàng)目中經(jīng)常會(huì)有后臺(tái)運(yùn)行任務(wù)的需求,比如發(fā)送郵件時(shí),因?yàn)橐B接郵件服務(wù)器,往往需要5-10秒甚至更長時(shí)間,如果能先給用戶一個(gè)成功的提示信息,然后在后臺(tái)慢慢處理發(fā)送郵件的操作,顯然會(huì)有更好的用戶體驗(yàn)。

為了實(shí)現(xiàn)類似的需求,Web項(xiàng)目中一般的實(shí)現(xiàn)方法是使用消息隊(duì)列(Message Queue),比如MemcacheQ,RabbitMQ等等,都是很著名的產(chǎn)品。

消息隊(duì)列說白了就是一個(gè)最簡單的先進(jìn)先出隊(duì)列,隊(duì)列的一個(gè)成員就是一段文本。正是因?yàn)橄㈥?duì)列實(shí)在太簡單了,當(dāng)拿著消息隊(duì)列時(shí),反而有點(diǎn)無從下手的感覺,因?yàn)檫@僅僅一個(gè)發(fā)送郵件的任務(wù),就會(huì)引申出很多問題:

  1. 消息隊(duì)列只能存儲(chǔ)字符串類型的數(shù)據(jù),如何將一個(gè)發(fā)送郵件這樣的“任務(wù)”,轉(zhuǎn)換為消息隊(duì)列中的一個(gè)“消息”?

  2. 消息隊(duì)列只負(fù)責(zé)數(shù)據(jù)的存放與進(jìn)出,本身不能執(zhí)行任何程序,那么我們要如何從消息隊(duì)列中一個(gè)一個(gè)取出數(shù)據(jù),再將這些數(shù)據(jù)轉(zhuǎn)化回任務(wù)并執(zhí)行。

  3. 我們無法預(yù)知消息隊(duì)列何時(shí)會(huì)有數(shù)據(jù)產(chǎn)生,所以我們的任務(wù)執(zhí)行程序還需要具備監(jiān)控消息隊(duì)列的能力,也就是一個(gè)常駐后臺(tái)的守護(hù)進(jìn)程。

  4. 一般的Web應(yīng)用PHP都以cgi方式運(yùn)行,無法常駐內(nèi)存。我們知道php還有cli模式,那么守護(hù)進(jìn)程是否能以php cli來實(shí)現(xiàn),效率如何?

  5. 當(dāng)守護(hù)進(jìn)程運(yùn)行時(shí),Web應(yīng)用能否與后臺(tái)守護(hù)進(jìn)程交互,實(shí)現(xiàn)開啟/殺死進(jìn)程的功能以及獲得進(jìn)程的運(yùn)行狀態(tài)?


Resque是這樣解決這些問題的:

后臺(tái)任務(wù)的角色劃分

其實(shí)從上面的問題已經(jīng)可以看出,只靠一個(gè)消息隊(duì)列是無法解決所有問題的,需要新的角色介入。在Resque中,一個(gè)后臺(tái)任務(wù)被抽象為由三種角色共同完成:

  • Job | 任務(wù) : 一個(gè)Job就是一個(gè)需要在后臺(tái)完成的任務(wù),比如本文舉例的發(fā)送郵件,就可以抽象為一個(gè)Job。在Resque中一個(gè)Job就是一個(gè)Class。

  • Queue | 隊(duì)列 : 也就是上文的消息隊(duì)列,在Resque中,隊(duì)列則是由Redis實(shí)現(xiàn)的。Resque還提供了一個(gè)簡單的隊(duì)列管理器,可以實(shí)現(xiàn)將Job插入/取出隊(duì)列等功能。

  • Worker | 執(zhí)行者 : 負(fù)責(zé)從隊(duì)列中取出Job并執(zhí)行,可以以守護(hù)進(jìn)程的方式運(yùn)行在后臺(tái)。

那么基于這個(gè)劃分,一個(gè)后臺(tái)任務(wù)在Resque下的基本流程是這樣的:

  1. 將一個(gè)后臺(tái)任務(wù)編寫為一個(gè)獨(dú)立的Class,這個(gè)Class就是一個(gè)Job。

  2. 在需要使用后臺(tái)程序的地方,系統(tǒng)將Job Class的名稱以及所需參數(shù)放入隊(duì)列。

  3. 以命令行方式開啟一個(gè)Worker,并通過參數(shù)指定Worker所需要處理的隊(duì)列。

  4. Worker作為守護(hù)進(jìn)程運(yùn)行,并且定時(shí)檢查隊(duì)列。

  5. 當(dāng)隊(duì)列中有Job時(shí),Worker取出Job并運(yùn)行,即實(shí)例化Job Class并執(zhí)行Class中的方法。

至此就可以完整的運(yùn)行完一個(gè)后臺(tái)任務(wù)。

在Resque中,還有一個(gè)很重要的設(shè)計(jì):一個(gè)Worker,可以處理一個(gè)隊(duì)列,也可以處理很多個(gè)隊(duì)列,并且可以通過增加Worker的進(jìn)程/線程數(shù)來加快隊(duì)列的執(zhí)行速度。

php-resque的安裝

需要提前說明的是,由于涉及到進(jìn)程的開辟與管理,php-resque使用了php的PCNTL函數(shù),所以只能在Linux下運(yùn)行,并且需要php編譯PCNTL函數(shù)。如果希望用Windows做同樣的工作,那么可以去找找Resque的其他語言版本,php在Windows下非常不適合做后臺(tái)任務(wù)。

以Ubuntu12.04LTS為例,Ubuntu用apt安裝的php已經(jīng)默認(rèn)編譯了PCNTL函數(shù),無需任何配置,以下指令均為root帳號計(jì)算機(jī)培訓(xùn)班

安裝Redis

apt-get install redis-server

安裝Composer

apt-get install curl
cd /usr/local/bin
curl -s http://getcomposer.org/installer | php
chmod a+x composer.phar
alias composer='/usr/local/bin/composer.phar'

使用Composer安裝php-resque

假設(shè)web目錄在/opt/htdocs

apt-get install git git-core
cd /opt/htdocs
git clone git://github.com/chrisboulton/php-resque.git
cd php-resque
composer install

php-resque的使用

編寫一個(gè)Worker

其實(shí)php-resque已經(jīng)給出了簡單的例子, demo/job.php文件就是一個(gè)最簡單的Job:

class PHP_Job
{
    public function perform()
    {
        sleep(120);
        fwrite(STDOUT, 'Hello!');
    }
}

這個(gè)Job就是在120秒后向STDOUT輸出字符Hello!

在Resque的設(shè)計(jì)中,一個(gè)Job必須存在一個(gè)perform方法,Worker則會(huì)自動(dòng)運(yùn)行這個(gè)方法。

將Job插入隊(duì)列

php-resque也給出了最簡單的插入隊(duì)列實(shí)現(xiàn) demo/queue.php:

if(empty($argv[1])) {
    die('Specify the name of a job to add. e.g, php queue.php PHP_Job');
}

require __DIR__ . '/init.php';
date_default_timezone_set('GMT');
Resque::setBackend('127.0.0.1:6379');

$args = array(
    'time' => time(),
    'array' => array(
        'test' => 'test',
    ),
);

$jobId = Resque::enqueue('default', $argv[1], $args, true);
echo "Queued job ".$jobId."\n\n";

在這個(gè)例子中,queue.php需要以cli方式運(yùn)行,將cli接收到的第一個(gè)參數(shù)作為Job名稱,插入名為'default'的隊(duì)列,同時(shí)向屏幕輸出剛才插入隊(duì)列的Job Id。在終端輸入:

php demo/queue.php PHP_Job

結(jié)果可以看到屏幕上輸出:

Queued job b1f01038e5e833d24b46271a0e31f6d6

即Job已經(jīng)添加成功。注意這里的Job名稱與我們編寫的Job Class名稱保持一致:PHP_Job

查看Job運(yùn)行情況

php-resque同樣提供了查看Job運(yùn)行狀態(tài)的例子,直接運(yùn)行:

php demo/check_status.php b1f01038e5e833d24b46271a0e31f6d6

可以看到輸出為:

Tracking status of b1f01038e5e833d24b46271a0e31f6d6. Press [break] to stop. 
Status of b1f01038e5e833d24b46271a0e31f6d6 is: 1

我們剛才創(chuàng)建的Job狀態(tài)為1。在Resque中,一個(gè)Job有以下4種狀態(tài):

  • Resque_Job_Status::STATUS_WAITING = 1; (等待)

  • Resque_Job_Status::STATUS_RUNNING = 2; (正在執(zhí)行)

  • Resque_Job_Status::STATUS_FAILED = 3; (失敗)

  • Resque_Job_Status::STATUS_COMPLETE = 4; (結(jié)束)

因?yàn)闆]有Worker運(yùn)行,所以剛才創(chuàng)建的Job還是等待狀態(tài)。

運(yùn)行Worker

這次我們直接編寫demo/resque.php:

<?php
date_default_timezone_set('GMT');
require 'job.php';
require '../bin/resque';

可以看到一個(gè)Worker至少需要兩部分:

  1. 可以直接包含Job類文件,也可以使用php的自動(dòng)加載機(jī)制,指定好Job Class所在路徑并能實(shí)現(xiàn)自動(dòng)加載

  2. 包含Resque的默認(rèn)Worker: bin/resque

在終端中運(yùn)行:

QUEUE=default php demo/resque.php

前面的QUEUE部分是設(shè)置環(huán)境變量,我們指定當(dāng)前的Worker只負(fù)責(zé)處理default隊(duì)列。也可以使用

QUEUE=* php demo/resque.php

來處理所有隊(duì)列。

運(yùn)行后輸出為

#!/usr/bin/env php
*** Starting worker

用ps指令檢查一下:

ps aux | grep resque

可以看到有一個(gè)php的守護(hù)進(jìn)程已經(jīng)在運(yùn)行了

1000      4607  0.0  0.1  74816 11612 pts/3    S+   14:52   0:00 php demo/resque.php

再使用之前的檢查Job指令

php demo/check_status.php b1f01038e5e833d24b46271a0e31f6d6

2分鐘后可以看到

Status of b1f01038e5e833d24b46271a0e31f6d6 is: 4

任務(wù)已經(jīng)運(yùn)行完畢,同時(shí)屏幕上應(yīng)該可以看到輸出的Hello!

至此我們已經(jīng)成功的完成了一個(gè)最簡單的Resque實(shí)例的全部演示,更復(fù)雜的情況以及遺留的問題會(huì)在下一次的日志中說明。

相關(guān)推薦:

利用redis和php-resque實(shí)現(xiàn)后臺(tái)任務(wù) redis 下載 redis 集群 redis可視化工具

php網(wǎng)站設(shè)計(jì) php-resque的設(shè)計(jì)和使用

php-resque消息隊(duì)列的執(zhí)行情況

以上就是php-resque使用說明的詳細(xì)內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!

 
關(guān)鍵詞: php-resque,使用說明,php
長春  短信群發(fā)  吉林省  紅視窗  中國  長春市  玉米  長春網(wǎng)站建設(shè)  網(wǎng)站  振華  設(shè)備  吉林  設(shè)計(jì)  廣州  撲克  聯(lián)合聲明  敘利亞  美國  內(nèi)蒙古  化武  新聞中心  指示  記者會(huì)  美國白宮  化學(xué)武器  塞內(nèi)加爾  長春上門維修電腦  白宮  中國政府  圓桌  小雨  滿洲里  中消協(xié)  敘政府  日本  非洲  經(jīng)濟(jì)  消費(fèi)者  消費(fèi)者權(quán)益  強(qiáng)臺(tái)風(fēng)  北京市  臺(tái)風(fēng)  中非  國家元首  毒品  中非合作論壇  大阪  突擊步槍  海外網(wǎng)  網(wǎng)站建設(shè)  重慶市  步槍  長春上門做系統(tǒng)  俄羅斯  長春上門修電腦  售前咨詢技巧  中國電影  制造  長春電腦上門維修  政治  北斗導(dǎo)航  龍頭企業(yè)  產(chǎn)業(yè)園  中國芯  黨委書記  黨委  軍民  位置服務(wù)  長春北大青鳥  中國智能建筑節(jié)  中國移動(dòng)  侯建國,質(zhì)量,中國特色社會(huì)主義  AJAX  PHP  XML  f-35  特朗普  中國軍網(wǎng)  特朗普,貿(mào)易戰(zhàn),美國  政府  微博  RSS  美國人  銀河  發(fā)言人  今日頭條  發(fā)布會(huì)  州長  運(yùn)載火箭  彈道導(dǎo)彈  一帶一路  塞申斯  長春國貿(mào)  國際  小米  尼克松  中國市場  孫儷  短視頻  小學(xué)生 
 
[ 資訊搜索 ]  [ 加入收藏 ]  [ 告訴好友 ]  [ 打印本文 ]  [ 違規(guī)舉報(bào) ]  [ 關(guān)閉窗口 ]

 
0條 [查看全部]  相關(guān)評論

 
網(wǎng)站首頁 | 關(guān)于我們 | 聯(lián)系方式 | 使用協(xié)議 | 版權(quán)隱私 | 網(wǎng)站地圖 | 排名推廣 | 廣告服務(wù) | 積分換禮 | 網(wǎng)站留言 | RSS訂閱 | 皖I(lǐng)CP備2021004516號-14
企業(yè)800網(wǎng) · 提供技術(shù)支持