xing-gearman-ruby 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,300 @@
1
+ <?php
2
+
3
+ /**
4
+ * Interface for Danga's Gearman job scheduling system
5
+ *
6
+ * PHP version 5.1.0+
7
+ *
8
+ * LICENSE: This source file is subject to the New BSD license that is
9
+ * available through the world-wide-web at the following URI:
10
+ * http://www.opensource.org/licenses/bsd-license.php. If you did not receive
11
+ * a copy of the New BSD License and are unable to obtain it through the web,
12
+ * please send a note to license@php.net so we can mail you a copy immediately.
13
+ *
14
+ * @category Net
15
+ * @package Net_Gearman
16
+ * @author Joe Stump <joe@joestump.net>
17
+ * @copyright 2007-2008 Digg.com, Inc.
18
+ * @license http://www.opensource.org/licenses/bsd-license.php New BSD License
19
+ * @version CVS: $Id$
20
+ * @link http://pear.php.net/package/Net_Gearman
21
+ * @link http://www.danga.com/gearman/
22
+ */
23
+
24
+ /**
25
+ * Task class for creating Net_Gearman tasks
26
+ *
27
+ * @category Net
28
+ * @package Net_Gearman
29
+ * @author Joe Stump <joe@joestump.net>
30
+ * @copyright 2007-2008 Digg.com, Inc.
31
+ * @license http://www.opensource.org/licenses/bsd-license.php New BSD License
32
+ * @link http://www.danga.com/gearman/
33
+ * @see Net_Gearman_Set, Net_Gearman_Client
34
+ */
35
+ class Net_Gearman_Task
36
+ {
37
+ /**
38
+ * The function/job to run
39
+ *
40
+ * @var string $func
41
+ */
42
+ public $func = '';
43
+
44
+ /**
45
+ * Arguments to pass to function/job
46
+ *
47
+ * @var array $arg
48
+ */
49
+ public $arg = array();
50
+
51
+ /**
52
+ * Type of job
53
+ *
54
+ * Which type of job you wish this task to be ran as. Keep in mind that
55
+ * background jobs are "fire and forget" and DO NOT return results to the
56
+ * job server in a manner that you can actually retrieve.
57
+ *
58
+ * @var integer $type
59
+ * @see Net_Gearman_Task::JOB_NORMAL
60
+ * @see Net_Gearman_Task::JOB_BACKGROUND
61
+ * @see Net_Gearman_Task::JOB_HIGH
62
+ */
63
+ public $type = self::JOB_NORMAL;
64
+
65
+ /**
66
+ * Handle returned from job server
67
+ *
68
+ * @var string $handle
69
+ * @see Net_Gearman_Client
70
+ */
71
+ public $handle = '';
72
+
73
+ /**
74
+ * The unique identifier for this job
75
+ *
76
+ * Keep in mind that a unique job is only unique to the job server it is
77
+ * submitted to. Gearman servers don't communicate with each other to
78
+ * ensure a job is unique across all workers.
79
+ *
80
+ * That being said, Gearman does group identical jobs sent to it and runs
81
+ * that job only once. If you send the job Sum with args 1, 2, 3 to the
82
+ * server 10 times in a second Gearman will only run that job once and then
83
+ * return the result 10 times.
84
+ *
85
+ * @var string $uniq
86
+ */
87
+ public $uniq = '';
88
+
89
+ /**
90
+ * Is this task finished?
91
+ *
92
+ * @var boolean $finished
93
+ * @see Net_Gearman_Set::finished()
94
+ * @see Net_Gearman_Task::complete()
95
+ * @see Net_Gearman_Task::fail()
96
+ */
97
+ public $finished = false;
98
+
99
+ /**
100
+ * The result returned from the worker
101
+ *
102
+ * @var object $result
103
+ */
104
+ public $result = '';
105
+
106
+ /**
107
+ * Callbacks registered for each state
108
+ *
109
+ * @var array $callback
110
+ * @see Net_Gearman_Task::attachCallback()
111
+ * @see Net_Gearman_Task::complete()
112
+ * @see Net_Gearman_Task::status()
113
+ * @see Net_Gearman_Task::fail()
114
+ */
115
+ protected $callback = array(
116
+ self::TASK_COMPLETE => array(),
117
+ self::TASK_FAIL => array(),
118
+ self::TASK_STATUS => array()
119
+ );
120
+
121
+ /**
122
+ * Normal job
123
+ *
124
+ * Normal jobs are ran against a worker with the result being returned
125
+ * all in the same thread (e.g. Your page will sit there waiting for the
126
+ * job to finish and return it's result).
127
+ *
128
+ * @var integer JOB_NORMAL
129
+ */
130
+ const JOB_NORMAL = 1;
131
+
132
+ /**
133
+ * Background job
134
+ *
135
+ * Background jobs in Gearman are "fire and forget". You can check a job's
136
+ * status periodically, but you can't get a result back from it.
137
+ *
138
+ * @var integer JOB_BACKGROUND
139
+ */
140
+ const JOB_BACKGROUND = 2;
141
+
142
+ /**
143
+ * High priority job
144
+ *
145
+ * @var integer JOB_HIGH
146
+ */
147
+ const JOB_HIGH = 2;
148
+
149
+ /**
150
+ * Callback of type complete
151
+ *
152
+ * The callback provided should be ran when the task has been completed. It
153
+ * will be handed the result of the task as its only argument.
154
+ *
155
+ * @var integer TASK_COMPLETE
156
+ * @see Net_Gearman_Task::complete()
157
+ */
158
+ const TASK_COMPLETE = 1;
159
+
160
+ /**
161
+ * Callback of type fail
162
+ *
163
+ * The callback provided should be ran when the task has been reported to
164
+ * have failed by Gearman. No arguments are provided.
165
+ *
166
+ * @var integer TASK_FAIL
167
+ * @see Net_Gearman_Task::fail()
168
+ */
169
+ const TASK_FAIL = 2;
170
+
171
+ /**
172
+ * Callback of type status
173
+ *
174
+ * The callback provided should be ran whenever the status of the task has
175
+ * been updated. The numerator and denominator are passed as the only
176
+ * two arguments.
177
+ *
178
+ * @var integer TASK_STATUS
179
+ * @see Net_Gearman_Task::status()
180
+ */
181
+ const TASK_STATUS = 3;
182
+
183
+ /**
184
+ * Constructor
185
+ *
186
+ * @param string $func Name of job to run
187
+ * @param array $arg List of arguments for job
188
+ * @param string $uniq The unique id of the job
189
+ * @param integer $type Type of job to run task as
190
+ *
191
+ * @return void
192
+ */
193
+ public function __construct($func, $arg, $uniq = null,
194
+ $type = self::JOB_NORMAL)
195
+ {
196
+ $this->func = $func;
197
+ $this->arg = $arg;
198
+
199
+ if (is_null($uniq)) {
200
+ $this->uniq = md5($func . serialize($arg) . $type);
201
+ } else {
202
+ $this->uniq = $uniq;
203
+ }
204
+
205
+ $this->type = $type;
206
+ }
207
+
208
+ /**
209
+ * Attach a callback to this task
210
+ *
211
+ * @param callback $callback A valid PHP callback
212
+ * @param integer $type Type of callback
213
+ *
214
+ * @return void
215
+ * @throws Net_Gearman_Exception
216
+ */
217
+ public function attachCallback($callback, $type = self::TASK_COMPLETE)
218
+ {
219
+ if (!is_callable($callback)) {
220
+ throw new Net_Gearman_Exception('Invalid callback specified');
221
+ }
222
+
223
+ $this->callback[$type][] = $callback;
224
+ }
225
+
226
+ /**
227
+ * Run the complete callbacks
228
+ *
229
+ * Complete callbacks are passed the name of the job, the handle of the
230
+ * job and the result of the job (in that order).
231
+ *
232
+ * @param object $result JSON decoded result passed back
233
+ *
234
+ * @return void
235
+ * @see Net_Gearman_Task::attachCallback()
236
+ */
237
+ public function complete($result)
238
+ {
239
+ $this->finished = true;
240
+ $this->result = $result;
241
+
242
+ if (!count($this->callback[self::TASK_COMPLETE])) {
243
+ return;
244
+ }
245
+
246
+ foreach ($this->callback[self::TASK_COMPLETE] as $callback) {
247
+ call_user_func($callback, $this->func, $this->handle, $result);
248
+ }
249
+ }
250
+
251
+ /**
252
+ * Run the failure callbacks
253
+ *
254
+ * Failure callbacks are passed the name of the job and the handle of the
255
+ * job that failed (in that order).
256
+ *
257
+ * @return void
258
+ * @see Net_Gearman_Task::attachCallback()
259
+ */
260
+ public function fail()
261
+ {
262
+ $this->finished = true;
263
+ if (!count($this->callback[self::TASK_FAIL])) {
264
+ return;
265
+ }
266
+
267
+ foreach ($this->callback[self::TASK_FAIL] as $callback) {
268
+ call_user_func($callback, $this);
269
+ }
270
+ }
271
+
272
+ /**
273
+ * Run the status callbacks
274
+ *
275
+ * Status callbacks are passed the name of the job, handle of the job and
276
+ * the numerator/denominator as the arguments (in that order).
277
+ *
278
+ * @param integer $numerator The numerator from the status
279
+ * @param integer $denominator The denominator from the status
280
+ *
281
+ * @return void
282
+ * @see Net_Gearman_Task::attachCallback()
283
+ */
284
+ public function status($numerator, $denominator)
285
+ {
286
+ if (!count($this->callback[self::TASK_STATUS])) {
287
+ return;
288
+ }
289
+
290
+ foreach ($this->callback[self::TASK_STATUS] as $callback) {
291
+ call_user_func($callback,
292
+ $this->func,
293
+ $this->handle,
294
+ $numerator,
295
+ $denominator);
296
+ }
297
+ }
298
+ }
299
+
300
+ ?>