1、安裝gearmanphp
下載gearman源碼包json
1
|
https:
//launchpad.net/gearmand/+download
|
如: gearmand-1.1.12.tar.gz數組
下載php的gearman擴展包php7
1
|
http:
//pecl.php.net/package/gearman
|
如: gearman-1.1.2.tgz異步
安裝gearman函數
1
2
3
4
5
|
> 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擴展目前尚未出來)post
1
2
3
4
5
6
|
> 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測試
1
|
> vi /data/php56/lib/php.ini
|
添加以下兩項ui
1
2
|
extension_dir=/data/php56/lib/php/extensions/no-debug-zts-20131226/
extension=gearman.so
|
查看擴展spa
1
|
> /data/php56/bin/php -m
|
2、簡單的使用gearman
gearman中請求的處理過程通常涉及三種角色:client->job->worker
其中client是請求的發起者
job是請求的調度者,用於把客戶的請求分發到不一樣的worker上進行工做
worker是請求的處理者
好比這裏咱們要處理client向job發送一個請求,來計算兩個數之和,job負責調度worker來具體實現計算兩數之和。
首先咱們編寫client.php
1
2
3
4
5
6
7
8
9
10
11
12
|
<?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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<?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服務
1
2
|
>
mkdir
-p /usr/local/
var
/log
> gearmand -d
|
運行worker文件
1
|
> /data/php56/bin/php /data/worker.php
|
再運行client文件
1
|
> /data/php56/bin/php /data/client.php
|
結果以下:
3、gearman異步的處理任務
這裏咱們client向job發送一個發送郵件的請求,不等待請求完成,繼續向下執行。
client.php代碼以下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
<?php
//建立一個客戶端
$client
=
new
GearmanClient();
//添加一個job服務
$client
->addServer(
'127.0.0.1'
, 4730);
//doBackground異步,返回提交任務的句柄
$ret
=
$client
->doBackground(
'sendEmail'
, json_encode(
array
(
'email'
=>
'test@qq.com'
,
'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代碼以下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<?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());
|
結果以下:
4、gearman並行的執行多個任務
咱們如何並行的計算兩個數的累加和? 經過addTask添加多個任務到隊列,而後進行並行計算。
client.php代碼以下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<?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代碼以下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<?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個計算任務幾乎是同時返回結果。
結果以下: