Ik wil een job queue implementeren met behulp van Beanstalkd in php. Het idee is vrij simpel, maar ik kom er niet achter waarom met mijn opstelling het geheugengebruik bij elke job toeneemt. Ik zou graag wat advies willen 
Een job is simpel:
Ik haal de job uit Beanstalkd via Pheanstalk, waarin ik de data van de job en de parameters als Json haal:
De reserve() van Beanstalkd is blocking, dus er wordt net zo lang gewacht tot er response is, oftwel totdat er een job in de queue verschijnt. Ik wil dit proces inzetten om continue jobs af te werken. Met de CLI apps van Zend Framework 2 kan je eenvoudig controllers dispatchen, dus ik dacht aan dit:
En dan dit:
Deze voeg ik 10.000 keer toe aan Beanstalkd en ga vervolgens ze uitvoeren. Het geheugengebruik (memory_get_usage) neemt toe:
Wat ik heb geprobeerd en wat niet werkt:
Een job is simpel:
PHP:
1
2
3
4
5
| interface Job { public function __invoke(); // For execution public function getId(); // For Pheanstalk compatibility } |
Ik haal de job uit Beanstalkd via Pheanstalk, waarin ik de data van de job en de parameters als Json haal:
PHP:
1
2
3
4
5
6
7
8
| $pheanstalk = new Pheanstalk('0.0.0.0'); $data = json_decode($pheanstalk->reserve()->getData()); $name = $data->name; $params = $data->params; $job = new $name($params); $job(); |
De reserve() van Beanstalkd is blocking, dus er wordt net zo lang gewacht tot er response is, oftwel totdat er een job in de queue verschijnt. Ik wil dit proces inzetten om continue jobs af te werken. Met de CLI apps van Zend Framework 2 kan je eenvoudig controllers dispatchen, dus ik dacht aan dit:
app.php worker reserve --watch-tube=my-tube --ignore-tube=default
En dan dit:
PHP:
Wat hier gebeurt is eigenlijk niet veel meer dan de outline van hierboven. Om te testen heb ik een job aangemaakt, SimpleJob:1
2
3
4
5
6
7
8
9
10
11
12
13
14
| class WorkerController extends ActionController } public function reserveAction () { while (true) { $job = $this->pheanstalk->reserve(); $job = $this->instantiateJob($job); $this->executeJob($job); } } // Andere methods instantiateJob() executeJob() } |
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| namespace SlmTesting\Job; use SlmQueue\Job\Job; class SimpleJob implements Job { protected $id; public function getId () { return $this->id; } public function setId ($id) { $this->id = $id; } public function __invoke () { $foo = 12.3; } } |
Deze voeg ik 10.000 keer toe aan Beanstalkd en ga vervolgens ze uitvoeren. Het geheugengebruik (memory_get_usage) neemt toe:
0: 57372 1000: 549812 2000: 1075444 3000: 1539636 4000: 2126708 5000: 2599092 6000: 3055092 7000: 3511092 8000: 4229236 9000: 4718004 10000: 5174004
Wat ik heb geprobeerd en wat niet werkt:
- Vóór while(true) een gc_enable() call doen
- In de loop (net als output, zo om de 1000 keer) een gc_collect_cycles() call doen
- Na execution de job expliciet unsetten unset($job)
- Na execution de $job naar null toewijzen