1--TEST--
2swoole_server/task: task queue
3--SKIPIF--
4<?php require __DIR__ . '/../../include/skipif.inc'; ?>
5--FILE--
6<?php
7require __DIR__ . '/../../include/bootstrap.php';
8const N = 2048;
9use Swoole\Server;
10$pm = new SwooleTest\ProcessManager;
11$pm->parentFunc = function ($pid) use ($pm)
12{
13    $cli = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_SYNC);
14    $cli->connect('127.0.0.1', $pm->getFreePort(), 10) or die("ERROR");
15    $cli->send("task-01") or die("ERROR");
16    echo $cli->recv();
17    $cli->close();
18    $pm->kill();
19};
20
21$pm->childFunc = function () use ($pm)
22{
23    ini_set('swoole.display_errors', 'Off');
24    $serv = new Server('127.0.0.1', $pm->getFreePort(), SWOOLE_BASE);
25    $serv->set(array(
26        "worker_num" => 1,
27        'task_worker_num' => 1,
28        'log_file' => '/dev/null',
29    ));
30    $serv->on("WorkerStart", function (Server $serv)  use ($pm)
31    {
32        $pm->wakeup();
33    });
34    $serv->on('receive', function (Server $serv, $fd, $rid, $data)
35    {
36        for ($i = 0; $i < 2048; $i++)
37        {
38            $data = array('id' => $i, 'fd' => $fd, 'data' => RandStr::getBytes(rand(2048, 4096)));
39            if ($serv->task($data) === false)
40            {
41                $serv->send($fd, "ERROR\n");
42                return;
43            }
44        }
45    });
46
47    $serv->on('task', function (Server $serv, $task_id, $worker_id, $data)
48    {
49        if ($task_id == 0)
50        {
51            sleep(1);
52        }
53        if ($task_id != $data['id'])
54        {
55            echo "ERROR, $task_id, {$data['id']}\n";
56        }
57        if ($data['id'] == N - 1)
58        {
59            $serv->send($data['fd'], "OK");
60        }
61    });
62
63    $serv->on('finish', function (Server $serv, $fd, $rid, $data)
64    {
65
66    });
67    $serv->start();
68};
69
70$pm->childFirst();
71$pm->run();
72?>
73--EXPECT--
74OK
75