-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathgearman.php.xml
204 lines (177 loc) · 4.83 KB
/
gearman.php.xml
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V5.0//EN"
"/usr/share/xml/docbook/schema/dtd/5.0/docbook.dtd" [
<!ENTITY article.author.xml SYSTEM "../common/article.author.xml">
<!ENTITY book.info.legalnotice.xml SYSTEM "../common/book.info.legalnotice.xml">
<!ENTITY book.info.abstract.xml SYSTEM "../common/book.info.abstract.xml">
]>
<article xml:base="http://netkiller.github.io/journal/"
xmlns="http://docbook.org/ns/docbook" xml:lang="zh-cn">
<articleinfo>
<title>Gearman + PHP 实现分布式对象调用</title>
<subtitle>http://netkiller.github.io/journal/gearman.php.html</subtitle>
&article.author.xml;
<pubdate>$Date$</pubdate>
<releaseinfo>$Id$</releaseinfo>
&book.info.legalnotice.xml;
<abstract>
<para>在群里看到有网友问,IDC的服务器是否需要开启防火墙,我意识到应该写一篇关于IDC安全的文章。 </para>
</abstract>
&book.info.abstract.xml;
<keywordset>
<keyword>Gearman</keyword>
<keyword></keyword>
<keyword></keyword>
</keywordset>
</articleinfo>
<section>
<title>Gearman Job Server</title>
<para>文本格式回复</para>
<screen>
yum install gearmand
</screen>
</section>
<section>
<title>Gearman PHP扩展</title>
<para>PHP扩展安装</para>
<screen>
<![CDATA[
#!/bin/bash
yum install libgearman-devel -y
pecl install gearman
cat >> /srv/php/etc/conf.d/gearman.ini <<EOF
extension=gearman.so
EOF
]]>
</screen>
<para>确认模块是否安装,同时检查gearman扩展的版本。</para>
<screen>
# php -m | grep gearman
gearman
# php -r 'printf("%s\r\n",gearman_version());'
1.1.8
</screen>
<para>测试脚本 server.php</para>
<screen>
<![CDATA[
<?php
$worker= new GearmanWorker();
$worker->addServer();
$worker->addFunction("reverse", "my_reverse_function");
while ($worker->work());
function my_reverse_function($job)
{
return strrev($job->workload());
}
?>
]]>
</screen>
<para>测试脚本 client.php</para>
<screen>
<![CDATA[
<?php
$client= new GearmanClient();
$client->addServer();
print $client->doNormal("reverse", "Hello World!");
?>
]]>
</screen>
<para>我用'o' 表示与上次备份中有差异的部分。</para>
</section>
<section>
<title>参数传递与返回值</title>
<para>Gearman 向functon 传递参数只能通过$job->workload(), 而 $job->workload() 只能传递字符串。</para>
<para>如果托传递多个参数,需要将参数序列化后传递</para>
<para>返回值也一样,一个字符串可以直接返回,如果返回数字类型是不允许的,需要序列化处理</para>
<example>
<title>多参数传递与返回值实例</title>
<para>Server</para>
<screen>
<![CDATA[
<?php
require 'Doctrine/Common/ClassLoader.php';
use Doctrine\Common\ClassLoader;
use Doctrine\DBAL\DriverManager;
use Doctrine\DBAL\Configuration;
$classLoader = new ClassLoader('Doctrine', '/www/DoctrineDBAL-2.3.4/');
$classLoader->register();
$config = new Configuration();
$connectionParams = array(
'dbname' => 'example',
'user' => 'www',
'password' => 'password',
'host' => '192.168.2.1',
'driver' => 'pdo_mysql',
);
$conn = DriverManager::getConnection($connectionParams, $config);
$host = '127.0.0.1';
$port = 4730;
echo "Starting\n";
# Create our worker object.
$gmworker= new GearmanWorker();
# Add default server (localhost).
$gmworker->addServer($host, $port);
# Register function "reverse" with the server. Change the worker function to
# "reverse_fn_fast" for a faster worker with no output.
$gmworker->addFunction("members", "members");
print "Waiting for job...\n";
while($gmworker->work())
{
if ($gmworker->returnCode() != GEARMAN_SUCCESS)
{
echo "return_code: " . $gmworker->returnCode() . "\n";
break;
}
}
function members($job)
{
global $conn;
$param = unserialize($job->workload());
print_r($param);
$sql = "SELECT username FROM members limit ".$param['limit'].",".$param['offset'];
$stmt = $conn->query($sql);
while ($row = $stmt->fetch()) {
//printf("%s\r\n", );
$result[] = $row['username'];
}
return serialize($result);
}
]]>
</screen>
<para>Client</para>
<screen>
<![CDATA[
<?php
# create our client object
$gmclient= new GearmanClient();
# add the default server (localhost)
$gmclient->addServer();
# run reverse client in the background
$job_handle = $gmclient->doNormal("members",serialize(array('limit'=>5,'offset'=>10)));
if ($gmclient->returnCode() == GEARMAN_SUCCESS)
{
print_r(unserialize($job_handle));
}
]]>
</screen>
<para>运行结果</para>
<screen>
$ php client.php
Array
(
[0] => 257000005
[1] => 257000006
[2] => 257000009
[3] => 257000010
[4] => 257000011
[5] => 257000012
[6] => 257000013
[7] => 257000014
[8] => 257000015
[9] => 257000016
)
</screen>
</example>
<para></para>
</section>
</article>