-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathQueue.php
132 lines (116 loc) · 2.86 KB
/
Queue.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
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
<?php
namespace wh\queue;
use Yii;
use yii\base\Component;
abstract class Queue extends Component
{
/**
* @var string Queue prefix
*/
public $queuePrefix = 'queue';
/** @var bool Debug mode */
public $debug = false;
/**
* Builds queue prefix
*
* @param string|null $name Queue name
* @return string
*/
public function buildPrefix($name = null)
{
if (empty($name)) {
$name = 'default';
} elseif ($name && preg_match('/[^[:alnum:]]/', $name)) {
$name = md5($name);
}
return $this->queuePrefix . ':' . $name;
}
/**
* Push job to the queue
*
* @param string $job Fully qualified class name of the job
* @param mixed $data Data for the job
* @param string|null $queue Queue name
* @return string ID of the job
*/
public function push($job, $data = null, $queue = null, $options = [])
{
return $this->pushInternal($this->createPayload($job, $data), $queue, $options);
}
/**
* Get job from the queue
*
* @param string|null $queue Queue name
* @return mixed
*/
public function pop($queue = null)
{
return $this->popInternal($queue);
}
/**
* Create job array
*
* @param string $job Fully qualified class name of the job
* @param mixed $data Data for the job
* @return array
*/
protected function createPayload($job, $data)
{
$payload = [
'job' => $job,
'data' => $data
];
$payload = $this->setMeta($payload, 'id', $this->getRandomId());
return $payload;
}
/**
* Set additional meta on a payload string.
*
* @param string $payload
* @param string $key
* @param string $value
* @return string
*/
protected function setMeta($payload, $key, $value)
{
$payload[$key] = $value;
return json_encode($payload);
}
/**
* Get random ID.
*
* @return string
*/
protected function getRandomId()
{
return Yii::$app->security->generateRandomString();
}
/**
* Get prefixed queue name
*
* @param $queue Queue name
* @return string
*/
protected function getQueue($queue)
{
return $this->buildPrefix($queue);
}
/**
* Class-specific realisation of adding the job to the queue
*
* @param array $payload Job data
* @param string|null $queue Queue name
* @param array $options
*
* @return mixed
*/
abstract protected function pushInternal($payload, $queue = null, $options = []);
/**
* Class-specific realisation of getting the job to the queue
*
* @param string|null $queue Queue name
*
* @return mixed
*/
abstract protected function popInternal($queue = null);
}