Skip to content

Commit 43966f3

Browse files
committed
upgrade hooks system
1 parent 6de830a commit 43966f3

File tree

4 files changed

+116
-22
lines changed

4 files changed

+116
-22
lines changed

README.md

+37-15
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ lightweight and powerful task load balancing for php
1313
# Install
1414

1515
```php
16-
composer require 'toplan/task-balancer:~0.1.5'
16+
composer require 'toplan/task-balancer:~0.2.0'
1717
```
1818

1919
# Usage
@@ -63,7 +63,8 @@ The `$result` structure:
6363
'finished_at' => ''
6464
],
6565
'logs' => [
66-
'driver_1' => [
66+
'0' => [
67+
'driver' => 'Luosimao',
6768
...
6869
],
6970
...
@@ -163,27 +164,48 @@ get data value of task instance.
163164

164165
| Hook name | handler arguments | handler return value |
165166
| --------- | :----------------: | :-----: |
166-
| beforeCreateDriver | $task | no effect |
167-
| afterCreateDriver | $task | no effect |
168-
| beforeRun | $task | if `false` will stop run task and return `false` |
169-
| beforeDriverRun | $task | no effect |
170-
| afterDriverRun | $task | no effect |
171-
| afterRun | $task, $results | override run task`s results data |
167+
| beforeCreateDriver | $task, $preReturn, $index | no effect |
168+
| afterCreateDriver | $task, $preReturn, $index | no effect |
169+
| beforeRun | $task, $preReturn, $index | if `false` will stop run task and return `false` |
170+
| beforeDriverRun | $task, $preReturn, $index | no effect |
171+
| afterDriverRun | $task, $preReturn, $index | no effect |
172+
| afterRun | $task, $results, $preReturn, $index | if not boolean will override result value |
172173

173-
### $task->hook($hookName, $handler)
174+
### $task->hook($hookName, $handler, $override)
174175

175-
### $task->beforeCreateDriver($handler)
176+
### $task->beforeCreateDriver($handler, $override)
176177

177-
### $task->afterCreateDriver($handler)
178+
### $task->afterCreateDriver($handler, $override)
178179

179-
### $task->beforeRun($handler)
180+
### $task->beforeRun($handler, $override)
180181

181-
### $task->beforeDriverRun($handler)
182+
### $task->beforeDriverRun($handler, $override)
182183

183-
### $task->afterDriverRun($handler)
184+
### $task->afterDriverRun($handler, $override)
184185

185-
### $task->afterRun($handler)
186+
### $task->afterRun($handler, $override)
186187

188+
> `$override` default value is `false`, if `true` will override hooks handler.
189+
190+
```php
191+
//example
192+
$task->beforeRun(function($task, $preReturn, $index ){
193+
//what is $preReturn?
194+
echo $preReturn == null; //true
195+
//what is $index?
196+
echo $index == 0; //true
197+
//do something..
198+
return 'beforeRun_1';
199+
}, false);
200+
201+
$task->beforeRun(function($task, $preReturn, $index ){
202+
//what is $preReturn?
203+
echo $preReturn == 'beforeRun_1'; //true
204+
//what is $index?
205+
echo $index == 1; //true
206+
//do other something..
207+
}, false);
208+
```
187209

188210
# Todo
189211

composer.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "toplan/task-balancer",
33
"description": "lightweight and powerful task load balancing for php (like the nginx load balancing)",
44
"license": "MIT",
5-
"version": "0.1.5",
5+
"version": "0.2.0",
66
"keywords": ["task", "balance", "load balancing", "balancer"],
77
"authors": [
88
{

src/TaskBalancer/Task.php

+21-6
Original file line numberDiff line numberDiff line change
@@ -486,20 +486,28 @@ public function data($data)
486486
* set hook handler
487487
* @param $hookName
488488
* @param null $handler
489+
* @param boolean $override
489490
*
490491
* @throws TaskBalancerException
491492
*/
492-
public function hook($hookName, $handler = null)
493+
public function hook($hookName, $handler = null, $override = false)
493494
{
494495
if ($handler && is_callable($handler) && is_string($hookName)) {
495496
if (in_array($hookName, self::$hooks)) {
496-
$this->handlers[$hookName] = $handler;
497+
if (!isset($this->handlers[$hookName])) {
498+
$this->handlers[$hookName] = [];
499+
}
500+
if ($override) {
501+
$this->handlers[$hookName] = [$handler];
502+
} else {
503+
array_push($this->handlers[$hookName], $handler);
504+
}
497505
} else {
498506
throw new TaskBalancerException("Don`t support the hook [$hookName]");
499507
}
500508
} elseif (is_array($hookName)) {
501509
foreach ($hookName as $k => $h) {
502-
$this->hook($k, $h);
510+
$this->hook($k, $h, false);
503511
}
504512
}
505513
}
@@ -514,8 +522,14 @@ public function hook($hookName, $handler = null)
514522
protected function callHookHandler($hookName, $data = null)
515523
{
516524
if (array_key_exists($hookName, $this->handlers)) {
517-
$handler = $this->handlers[$hookName];
518-
$result = call_user_func_array($handler, [$this, $data]);
525+
$handlers = $this->handlers[$hookName] ?: [];
526+
$result = null;
527+
foreach ($handlers as $key => $handler) {
528+
$handlerArgs = $data == null ?
529+
[$this, $result, $key]:
530+
[$this, $data, $result, $key];
531+
$result = call_user_func_array($handler, $handlerArgs);
532+
}
519533
if ($result === null) {
520534
return true;
521535
}
@@ -552,7 +566,8 @@ public function __call($name, $args)
552566
{
553567
if (in_array($name, self::$hooks)) {
554568
if (isset($args[0]) && is_callable($args[0])) {
555-
$this->hook($name, $args[0]);
569+
$override = isset($args[1]) ? !!$args[1] : false;
570+
$this->hook($name, $args[0], $override);
556571
} else {
557572
throw new TaskBalancerException("Please give the method [$name()] a callable argument");
558573
}

test/demo2.php

+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?php
2+
//test multiple handlers
3+
4+
//require('../vendor/autoload.php');
5+
require('../src/TaskBalancer/Balancer.php');
6+
require('../src/TaskBalancer/Driver.php');
7+
require('../src/TaskBalancer/Task.php');
8+
require('../src/TaskBalancer/TaskBalancerException.php');
9+
10+
use Toplan\TaskBalance\Balancer;
11+
12+
//define task:
13+
Balancer::task('task1', $data, function($task){
14+
$task->driver('driver1 10 backup', function($driver, $data){
15+
$driver->failed();
16+
print_r('run work! by '.$driver->name.'<br>');
17+
});
18+
19+
$task->beforeRun(function($task, $preReturn, $index){
20+
print_r("before run ---$preReturn-----$index<br>");
21+
return 11;
22+
});
23+
24+
$task->beforeRun(function($task, $preReturn, $index){
25+
print_r("before run ---$preReturn-----$index<br>");
26+
return 22;
27+
}, true);
28+
29+
$task->beforeRun(function($task, $preReturn, $index){
30+
print_r("before run ---$preReturn-----$index<br>");
31+
});
32+
33+
$task->hook('beforeDriverRun', function($task, $preReturn, $index){
34+
print_r("before driver run ---$preReturn-----$index<br>");
35+
return [1];
36+
});
37+
38+
$task->hook('beforeDriverRun', function($task, $preReturn, $index){
39+
print_r("before driver run ---".implode(',', $preReturn)."-----$index<br>");
40+
return [1,2];
41+
}, true);
42+
43+
$task->hook('beforeDriverRun', function($task, $preReturn, $index){
44+
print_r("before driver run ---".implode(',', $preReturn)."-----$index<br>");
45+
return [1,2,3];
46+
});
47+
48+
$task->afterRun(function($task, $results){
49+
print_r("after run --------!<br>");
50+
});
51+
});
52+
53+
//run task:
54+
$result = Balancer::run('task1', $data);
55+
56+
print_r('<br>');
57+
print_r($result);

0 commit comments

Comments
 (0)