Skip to content

Commit c4b477d

Browse files
committed
smart parse arguments for task`s driver method
1 parent 6c38efd commit c4b477d

File tree

3 files changed

+76
-45
lines changed

3 files changed

+76
-45
lines changed

README.md

Lines changed: 18 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,39 +4,32 @@ task load balancer for php (like the nginx load balancing)
44
# Usage
55

66
```php
7-
//define tas
7+
//define task
88
Balancer::task('task1', function($task){
9-
//define driver
10-
$task->driver('driver1')
11-
->weight(3)->backUp()
12-
->data(['this is data 1'])
13-
->work(function($driver, $data){
9+
//define a driver
10+
$task->driver('driver_1 100 backup', function($driver, $data){
11+
$person = new Person($data['name'], $data['age']);
1412
$driver->failed();
15-
$msg = 'working! by '.$driver->name.'<br>';
16-
print_r($msg);
17-
return [$msg, $data];
13+
print_r('run work! by '.$driver->name.'<br>');
14+
return ['test.driver1 working', $person->toString()];
1815
});
1916

20-
//define driver
21-
$task->driver('driver2')
22-
->weight(3)->backUp(false)
23-
->data(['this is data 2'])
24-
->work(function($driver, $data){
25-
$driver->success();
26-
$msg = 'working! by '.$driver->name.'<br>';
27-
print_r($msg);
28-
return [$msg, $data];
29-
});
17+
//define a driver
18+
$task->driver('driver_2', 100, function($driver, $data){
19+
$driver->failed();
20+
print_r('run work! by '.$driver->name.'<br>');
21+
return ['test.driver2 working', $data];
22+
})
23+
->data(['this is data 2']);
3024

31-
//define driver
32-
$task->driver('driver3')
25+
//define a driver
26+
$task->driver('driver_3')
3327
->weight(0)->backUp()
3428
->data(['this is data 3'])
3529
->work(function($driver, $data){
3630
$driver->failed();
37-
$msg = 'working! by '.$driver->name.'<br>';
38-
print_r($msg);
39-
return [$msg, $data];
31+
print_r('run work! by '.$driver->name.'<br>');
32+
return ['test.driver3 working', $data];
4033
});
4134
});
4235

@@ -47,6 +40,6 @@ $result = Balancer::run('task1');
4740

4841
- [x] remember every tasks` start time and end time.
4942
- [x] remember every drivers` start time and end time.
50-
- [ ] smart parse driver`s create arguments in task class
43+
- [x] smart parse driver`s create arguments in task class
5144
- [ ] define task`s lifecycle and hook
5245
- [ ] pause and continue task

src/TaskBalancer/Task.php

Lines changed: 50 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -273,17 +273,22 @@ public function driverNameRand()
273273
return array_rand(array_keys($this->drivers));
274274
}
275275

276+
276277
/**
277278
* create a new driver instance for current task
278-
* @param $name
279-
* @param int $weight
280-
* @param bool|false $isBackup
281-
* @param \Closure|null $work
282-
*
283-
* @return mixed
279+
* @return null|static
280+
* @throws \Exception
284281
*/
285-
public function driver($name, $weight = 1, $isBackup = false, \Closure $work = null)
282+
public function driver()
286283
{
284+
$args = func_get_args();
285+
if (!count($args)) {
286+
throw new \Exception('please give task`s method `driver` some args');
287+
}
288+
extract($this->parseDriverArgs($args));
289+
if (!$name) {
290+
throw new \Exception('please set driver`s name!');
291+
}
287292
$driver = $this->getDriver($name);
288293
if (!$driver) {
289294
$driver = Driver::create($this, $name, $weight, $isBackup, $work);
@@ -296,7 +301,44 @@ public function driver($name, $weight = 1, $isBackup = false, \Closure $work = n
296301
}
297302

298303
/**
299-
* current task has driver?
304+
* parse arguments for method `driver()`
305+
* @param $args
306+
*
307+
* @return array
308+
*/
309+
private function parseDriverArgs($args)
310+
{
311+
$result = [
312+
'name' => '',
313+
'work' => null,
314+
'weight' => 1,
315+
'isBackup' => false,
316+
];
317+
foreach ($args as $arg) {
318+
//find work
319+
if (is_callable($arg)) {
320+
$result['work'] = $arg;
321+
}
322+
//find weight, backup, name
323+
if (is_string($arg) || is_numeric($arg)) {
324+
$arg = preg_replace('/\s+/', ' ', "$arg");
325+
$subArgs = explode(' ', trim($arg));
326+
foreach ($subArgs as $subArg) {
327+
if (preg_match('/^[0-9]+$/', $subArg)) {
328+
$result['weight'] = $subArg;
329+
} elseif (preg_match('/(backup)/', strtolower($subArg))) {
330+
$result['isBackup'] = true;
331+
} else {
332+
$result['name'] = $subArg;
333+
}
334+
}
335+
}
336+
}
337+
return $result;
338+
}
339+
340+
/**
341+
* current task has character driver?
300342
* @param $name
301343
*
302344
* @return bool

test/index.php

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,25 +13,21 @@
1313
'age' => '25!'
1414
];
1515
$t = Balancer::task('test1', $data, function($task){
16-
$task->driver('driver1')
17-
->weight(100)->backUp()
18-
->work(function($driver, $data){
16+
$task->driver('driver_1 100 backup', function($driver, $data){
1917
$person = new Person($data['name'], $data['age']);
2018
$driver->failed();
2119
print_r('run work! by '.$driver->name.'<br>');
2220
return ['test.driver1 working', $person->toString()];
2321
});
2422

25-
$task->driver('driver2')
26-
->weight(100)
27-
->data(['this is data 2'])
28-
->work(function($driver, $data){
29-
$driver->failed();
30-
print_r('run work! by '.$driver->name.'<br>');
31-
return ['test.driver2 working', $data];
32-
});
23+
$task->driver('driver_2', 90, function($driver, $data){
24+
$driver->failed();
25+
print_r('run work! by '.$driver->name.'<br>');
26+
return ['test.driver2 working', $data];
27+
})
28+
->data(['this is data 2']);
3329

34-
$task->driver('driver3')
30+
$task->driver('driver_3 ')
3531
->weight(0)->backUp()
3632
->data(['this is data 3'])
3733
->work(function($driver, $data){

0 commit comments

Comments
 (0)