php使用gearman進行任務分發

來源:互聯網
上載者:User

標籤:send   php版本   email   .gz   業務   任務   cti   發送   發送郵件   

一、安裝gearman

下載gearman源碼包

https://launchpad.net/gearmand/+download

如: gearmand-1.1.12.tar.gz

下載php的gearman擴充包

http://pecl.php.net/package/gearman

如: gearman-1.1.2.tgz

安裝gearman

> yum install boost-devel gperf libevent-devel libuuid-devel> tar xf gearmand-1.1.12.tar.gz> cd gearmand-1.1.12> ./configure> make && make install

安裝gearman的php擴充(建議php版本不要過高,因為php7的gearman擴充目前還沒有出來)

> yum install autoconf> tar xf gearman-1.1.2.tgz> cd gearman-1.1.2> /data/php56/bin/phpize> ./configure --with-php-config=/data/php56/bin/php-config> make && make install

修改php.ini

> vi /data/php56/lib/php.ini

添加如下兩項

extension_dir=/data/php56/lib/php/extensions/no-debug-zts-20131226/extension=gearman.so

查看擴充

> /data/php56/bin/php -m

  

二、簡單的使用gearman

gearman中請求的處理過程一般涉及三種角色:client->job->worker
其中client是請求的發起者
job是請求的調度者,用於把客戶的請求分發到不同的worker上進行工作
worker是請求的處理者

比如這裡我們要處理client向job發送一個請求,來計算兩個數之和,job負責調度worker來具體實現計算兩數之和。

首先我們編寫client.php

<?php//建立一個用戶端$client = new GearmanClient();//添加一個job服務$client->addServer(‘127.0.0.1‘, 4730);//doNormal是同步的,等待worker處理完成返回結果//建議不要使用do()了$ret = $client->doNormal(‘sum‘, serialize(array(10, 10)));if($ret) {    echo ‘計算結果:‘, $ret, "\n";}

再編寫worker.php

<?php//建立一個worker$worker = new GearmanWorker();//添加一個job服務$worker->addServer(‘127.0.0.1‘, 4730);//註冊一個回呼函數,用於業務處理$worker->addFunction(‘sum‘, function($job) {    //workload()擷取用戶端發送來的序列化資料    $data = unserialize($job->workload());    return $data[0] + $data[1];});//死迴圈while(true) {    //等待job提交的任務    $ret = $worker->work();    if ($worker->returnCode() != GEARMAN_SUCCESS) {        break;    }}

我們先啟動gearmand服務

> mkdir -p /usr/local/var/log> gearmand -d

運行worker檔案

> /data/php56/bin/php /data/worker.php

再運行client檔案

> /data/php56/bin/php /data/client.php

結果如下:

 

三、gearman非同步處理任務

這裡我們client向job發送一個發送郵件的請求,不等待請求完成,繼續向下執行。

client.php代碼如下:

<?php//建立一個用戶端$client = new GearmanClient();//添加一個job服務$client->addServer(‘127.0.0.1‘, 4730);//doBackground非同步,返回提交任務的控制代碼$ret = $client->doBackground(‘sendEmail‘, json_encode(array(    ‘email‘ => ‘[email protected]‘,    ‘title‘ => ‘測試非同步‘,    ‘body‘ => ‘非同步執行好牛B的樣子‘,)));//繼續執行下面的代碼echo "我的內心毫無波動,甚至還想笑\n";do {    sleep(1);    //擷取任務控制代碼的狀態    //jobStatus返回的是一個數組    //第一個,表示工作是否已經知道    //第二個,工作是否在運行    //第三和第四,分別對應完成百分比的分子與分母    $status = $client->jobStatus($ret);        echo "完成情況:{$status[2]}/{$status[3]}\n";    if(!$status[1]) {        break;    }} while(true);

worker.php代碼如下:

<?php//建立一個worker$worker = new GearmanWorker();//添加一個job服務$worker->addServer(‘127.0.0.1‘, 4730);//註冊一個回呼函數,用於業務處理$worker->addFunction(‘sendEmail‘, function($job) {    //workload()擷取用戶端發送來的序列化資料    $data = json_decode($job->workload(), true);    //類比發送郵件所用時間    sleep(6);    echo "發送{$data[‘email‘]}郵件成功\n";});//死迴圈//等待job提交的任務while($worker->work());  

結果如下:

 

四、gearman並行的執行多個任務

我們如何並行的計算兩個數的累加和? 通過addTask添加多個任務到隊列,然後進行並行計算。

client.php代碼如下:

<?php//建立一個用戶端$client = new GearmanClient();//添加一個job服務$client->addServer(‘127.0.0.1‘, 4730);//設定任務完成時的回呼函數$client->setCompleteCallback(function($task) {    //擷取由worker返回的資料    echo $task->data(), "\n";});//計算1到500的累加和//添加五個任務到隊列$client->addTask(‘sum‘, json_encode(array(1, 100)));$client->addTask(‘sum‘, json_encode(array(100, 200)));$client->addTask(‘sum‘, json_encode(array(200, 300)));$client->addTask(‘sum‘, json_encode(array(300, 400)));$client->addTask(‘sum‘, json_encode(array(400, 500)));//運行隊列中的任務,do系列不需要runTask()$client->runTasks();

worker.php代碼如下:

<?php//建立一個worker$worker = new GearmanWorker();//添加一個job服務$worker->addServer(‘127.0.0.1‘, 4730);//註冊一個回呼函數,用於業務處理$worker->addFunction(‘sum‘, function($job) {    //workload()擷取用戶端發送來的序列化資料    $data = json_decode($job->workload(), true);    sleep(1);    $sum = 0;    for($ix = $data[0]; $ix < $data[1]; ++$ix) {        $sum += $ix;    }    return $sum;});//死迴圈//等待job提交的任務while($worker->work());

我們開啟5個worker背景工作處理序,當運行用戶端請求時,5個計算任務幾乎是同時返回結果。

結果如下:

php使用gearman進行任務分發

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.