This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include
, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
1 | <?php |
||
2 | |||
3 | namespace dmank\gearman; |
||
4 | |||
5 | use dmank\gearman\event\ConnectToServerEvent; |
||
6 | use dmank\gearman\event\FunctionEvent; |
||
7 | use dmank\gearman\event\FunctionFailureEvent; |
||
8 | use dmank\gearman\event\RegisterFunctionEvent; |
||
9 | use dmank\gearman\event\WorkerEvent; |
||
10 | use dmank\gearman\event\WorkerExceptionEvent; |
||
11 | use dmank\gearman\exception\NoFunctionGiven; |
||
12 | use Symfony\Component\EventDispatcher\EventDispatcherInterface; |
||
13 | |||
14 | class Worker |
||
15 | { |
||
16 | /** |
||
17 | * @var \GearmanWorker |
||
18 | */ |
||
19 | private $realWorker; |
||
20 | /** |
||
21 | * @var bool |
||
22 | */ |
||
23 | private $connectedToServer = false; |
||
24 | /** |
||
25 | * @var bool |
||
26 | */ |
||
27 | private $registeredFunctions = false; |
||
28 | /** |
||
29 | * @var ServerCollection |
||
30 | */ |
||
31 | private $serverCollection; |
||
32 | |||
33 | /** |
||
34 | * @var JobCollection |
||
35 | */ |
||
36 | private $jobs = []; |
||
37 | |||
38 | /** |
||
39 | * @var EventDispatcherInterface |
||
40 | */ |
||
41 | private $dispatcher; |
||
42 | |||
43 | /** |
||
44 | * @var bool |
||
45 | */ |
||
46 | private $killRequested = false; |
||
47 | |||
48 | 3 | public function __construct( |
|
49 | ServerCollection $servers, |
||
50 | JobCollection $jobs, |
||
51 | EventDispatcherInterface $dispatcher |
||
52 | ) { |
||
53 | 3 | $this->serverCollection = $servers; |
|
54 | 3 | $this->jobs = $jobs; |
|
55 | 3 | $this->dispatcher = $dispatcher; |
|
56 | 3 | } |
|
57 | |||
58 | /** |
||
59 | * @param \GearmanWorker $worker |
||
60 | */ |
||
61 | 3 | public function setImplementation(\GearmanWorker $worker) |
|
62 | { |
||
63 | 3 | $this->realWorker = $worker; |
|
64 | 3 | } |
|
65 | |||
66 | 3 | public function run() |
|
67 | { |
||
68 | 3 | $this->getEventDispatcher()->dispatch( |
|
69 | 3 | WorkerEvent::EVENT_BEFORE_RUN, |
|
70 | 3 | new WorkerEvent($this) |
|
71 | 3 | ); |
|
72 | |||
73 | try { |
||
74 | |||
75 | 3 | while ($this->workerIsPending()) { |
|
76 | |||
77 | $gearmanReturnCode = $this->getWorker()->returnCode(); |
||
78 | |||
79 | if ($gearmanReturnCode == GEARMAN_IO_WAIT) { |
||
80 | |||
81 | $this->getEventDispatcher()->dispatch( |
||
82 | WorkerEvent::EVENT_ON_IO_WAIT, |
||
83 | new WorkerEvent($this) |
||
84 | ); |
||
85 | |||
86 | @$this->getWorker()->wait(); |
||
0 ignored issues
–
show
|
|||
87 | } |
||
88 | |||
89 | if ($gearmanReturnCode == GEARMAN_NO_JOBS) { |
||
90 | |||
91 | $this->getEventDispatcher()->dispatch( |
||
92 | WorkerEvent::EVENT_ON_NO_JOBS, |
||
93 | new WorkerEvent($this) |
||
94 | ); |
||
95 | |||
96 | } |
||
97 | |||
98 | if ($gearmanReturnCode != GEARMAN_SUCCESS) { |
||
99 | |||
100 | $this->getEventDispatcher()->dispatch( |
||
101 | WorkerEvent::EVENT_ON_WORK, |
||
102 | new WorkerEvent($this) |
||
103 | ); |
||
104 | } |
||
105 | |||
106 | if ($gearmanReturnCode == GEARMAN_SUCCESS) { |
||
107 | |||
108 | $this->getEventDispatcher()->dispatch( |
||
109 | WorkerEvent::EVENT_AFTER_RUN, |
||
110 | new WorkerEvent($this) |
||
111 | ); |
||
112 | } |
||
113 | |||
114 | } |
||
115 | 3 | } catch (NoFunctionGiven $e) { |
|
116 | 1 | throw $e; |
|
117 | } catch (\Exception $e) { |
||
118 | $this->getEventDispatcher()->dispatch( |
||
119 | WorkerExceptionEvent::EVENT_ON_FAILURE, |
||
120 | new WorkerExceptionEvent($this, $e) |
||
121 | ); |
||
122 | |||
123 | } |
||
124 | 2 | } |
|
125 | |||
126 | /** |
||
127 | * @return EventDispatcherInterface |
||
128 | */ |
||
129 | 3 | protected function getEventDispatcher() |
|
130 | { |
||
131 | 3 | return $this->dispatcher; |
|
132 | } |
||
133 | |||
134 | /** |
||
135 | * @return \GearmanWorker |
||
136 | */ |
||
137 | 3 | private function getWorker() |
|
138 | { |
||
139 | 3 | if (!$this->realWorker) { |
|
140 | $this->realWorker = new \GearmanWorker(); |
||
141 | $this->realWorker->setOptions(GEARMAN_WORKER_NON_BLOCKING); |
||
142 | } |
||
143 | |||
144 | 3 | if (!$this->connectedToServer) { |
|
145 | |||
146 | 3 | $this->getEventDispatcher()->dispatch( |
|
147 | 3 | ConnectToServerEvent::CONNECT_TO_SERVER_EVENT, |
|
148 | 3 | new ConnectToServerEvent($this->serverCollection) |
|
149 | 3 | ); |
|
150 | |||
151 | /* @var \dmank\gearman\Server $server */ |
||
152 | 3 | foreach ($this->serverCollection->getServers() as $server) { |
|
153 | 3 | $this->realWorker->addServer($server->getHost(), $server->getPort()); |
|
154 | 3 | } |
|
155 | |||
156 | 3 | $this->getEventDispatcher()->dispatch( |
|
157 | 3 | ConnectToServerEvent::CONNECTED_TO_SERVER_EVENT, |
|
158 | 3 | new ConnectToServerEvent($this->serverCollection) |
|
159 | 3 | ); |
|
160 | |||
161 | 3 | $this->connectedToServer = true; |
|
162 | 3 | } |
|
163 | |||
164 | 3 | if (!$this->registeredFunctions) { |
|
165 | 3 | $this->registerFunctions(); |
|
166 | |||
167 | 2 | $this->registeredFunctions = true; |
|
168 | 2 | } |
|
169 | |||
170 | 2 | return $this->realWorker; |
|
171 | } |
||
172 | |||
173 | 3 | private function registerFunctions() |
|
174 | { |
||
175 | 3 | $this->getEventDispatcher()->dispatch( |
|
176 | 3 | RegisterFunctionEvent::EVENT_ON_BEFORE_REGISTER_FUNCTIONS, |
|
177 | 3 | new RegisterFunctionEvent($this->jobs) |
|
178 | 3 | ); |
|
179 | |||
180 | 3 | if (count($this->jobs) == 0) { |
|
181 | |||
182 | 1 | throw new NoFunctionGiven( |
|
183 | 1 | sprintf('Didnt have jobs to register. So we need to stop here. My bad!') |
|
184 | 1 | ); |
|
185 | } |
||
186 | |||
187 | /* @var JobHandlerInterface $jobClass */ |
||
188 | 2 | foreach ($this->jobs->getJobs() as $jobName => $jobClass) { |
|
189 | 2 | $this->realWorker->addFunction( |
|
190 | 2 | $jobName, |
|
191 | function (\GearmanJob $gearmanJob) use ($jobClass, $jobName) { |
||
192 | |||
193 | $job = new Job($jobName, $gearmanJob->workload()); |
||
194 | |||
195 | try { |
||
196 | |||
197 | $this->getEventDispatcher()->dispatch( |
||
198 | FunctionEvent::FUNCTION_BEFORE_EXECUTE, |
||
199 | new FunctionEvent($jobClass, $job) |
||
200 | ); |
||
201 | |||
202 | $result = $jobClass->execute($job); |
||
203 | |||
204 | $this->getEventDispatcher()->dispatch( |
||
205 | FunctionEvent::FUNCTION_AFTER_EXECUTE, |
||
206 | new FunctionEvent($jobClass, $job, $result) |
||
207 | ); |
||
208 | } catch (\Exception $e) { |
||
209 | |||
210 | $this->getEventDispatcher()->dispatch( |
||
211 | FunctionFailureEvent::FUNCTION_ON_FAILURE, |
||
212 | new FunctionFailureEvent($jobClass, $e, $job) |
||
213 | ); |
||
214 | |||
215 | $result = $e; |
||
216 | } |
||
217 | |||
218 | if (is_object($result) || is_array($result)) { |
||
219 | $result = serialize($result); |
||
220 | } |
||
221 | |||
222 | $gearmanJob->sendComplete($result); |
||
223 | } |
||
224 | 2 | ); |
|
225 | 2 | } |
|
226 | |||
227 | 2 | $this->getEventDispatcher()->dispatch( |
|
228 | 2 | RegisterFunctionEvent::EVENT_ON_AFTER_REGISTER_FUNCTIONS, |
|
229 | 2 | new RegisterFunctionEvent($this->jobs) |
|
230 | 2 | ); |
|
231 | |||
232 | 2 | } |
|
233 | |||
234 | /** |
||
235 | * @return bool |
||
236 | */ |
||
237 | 3 | private function workerIsPending() |
|
238 | { |
||
239 | return ( |
||
240 | 3 | $this->getWorker()->work() || |
|
241 | 2 | $this->getWorker()->returnCode() == GEARMAN_IO_WAIT || |
|
242 | 2 | $this->getWorker()->returnCode() == GEARMAN_NO_JOBS |
|
243 | 2 | ) && !$this->killRequested; |
|
244 | } |
||
245 | |||
246 | public function destroyWorker() |
||
247 | { |
||
248 | $this->getEventDispatcher()->dispatch( |
||
249 | WorkerEvent::EVENT_ON_BEFORE_DESTROY, |
||
250 | new WorkerEvent($this) |
||
251 | ); |
||
252 | |||
253 | $this->killRequested = true; |
||
254 | } |
||
255 | } |
||
256 |
If you suppress an error, we recommend checking for the error condition explicitly: