/
PingPongWorkerManager.php
67 lines (53 loc) · 1.68 KB
/
PingPongWorkerManager.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
<?php
use ParallelLibrary\WorkerManager;
use ParallelLibrary\interfaces\IWorker;
use ParallelLibrary\interfaces\IMessage;
use ParallelLibrary\Message;
class PingPongWorkerManager extends WorkerManager
{
const MESSAGE_TYPE_PING = 'PING';
const MESSAGE_TYPE_PONG = 'PONG';
protected function getWorkerCommand($_workerID)
{
$startupScript = __DIR__ .'/start-child-process.php';
$processsClass = 'PingPongProcess';
return 'php ' .$startupScript .' ' .$processsClass;
}
protected function runWorkers()
{
$this->setupOutput();
parent::runWorkers();
foreach ($this->workerList as $worker) {
$this->sendPing($worker);
}
}
protected function doWork()
{
}
protected function handleMessage(IWorker $worker, IMessage $message)
{
echo 'Receive: '.$message->type.' (workerID = '.$worker->getInternalID().')<br>';
switch ($message->type) {
case self::MESSAGE_TYPE_PONG:
$this->sendPing($worker);
break;
default:
break;
}
}
private function sendPing($worker)
{
$message = new Message(self::MESSAGE_TYPE_PING);
$worker->sendMessage($message);
echo 'Send: '.$message->type.' (workerID = '.$worker->getInternalID().')<br>';
}
private function setupOutput()
{
ini_set('output_buffering', 'off');
ini_set('zlib.output_compression', false);
ini_set('implicit_flush', true);
ob_implicit_flush(true);
while (@ob_end_clean());
set_time_limit(-1);
}
}