1--TEST--
2swoole_server: dispatch_mode = 3
3--SKIPIF--
4<?php
5require __DIR__ . '/../include/skipif.inc';
6skip_if_in_valgrind();
7?>
8--FILE--
9<?php
10require __DIR__ . '/../include/bootstrap.php';
11const WORKER_N = 16;
12
13use Swoole\Coroutine\Client;
14use Swoole\Timer;
15use Swoole\Event;
16use Swoole\Server;
17
18global $stats;
19$stats = array();
20$count = 0;
21$port = get_one_free_port();
22
23$pm = new SwooleTest\ProcessManager;
24$pm->parentFunc = function ($pid) use ($port) {
25    global $count, $stats;
26    for ($i = 0; $i < MAX_CONCURRENCY; $i++) {
27        go(function () use ($port) {
28            $cli = new Client(SWOOLE_SOCK_TCP);
29            $cli->set([
30                'package_eof' => "\r\n\r\n",
31                'open_eof_split' => true,
32            ]);
33            $r = $cli->connect(TCP_SERVER_HOST, $port, 1);
34            Assert::assert($r);
35            for ($i = 0; $i < MAX_REQUESTS; $i++) {
36                $cli->send("hello world\r\n\r\n");
37            }
38            $cli->count = 0;
39            for ($i = 0; $i < MAX_REQUESTS; $i++) {
40                $data = $cli->recv();
41                global $stats;
42                $wid = trim($data);
43                if (isset($stats[$wid])) {
44                    $stats[$wid]++;
45                } else {
46                    $stats[$wid] = 1;
47                }
48                $cli->count++;
49                if ($cli->count == MAX_REQUESTS) {
50                    $cli->close();
51                }
52            }
53        });
54    }
55    Event::wait();
56    Swoole\Process::kill($pid);
57    phpt_var_dump($stats);
58    Assert::eq(count($stats), WORKER_N);
59    Assert::lessThan($stats[5], MAX_REQUESTS);
60    Assert::lessThan($stats[10], MAX_REQUESTS);
61    Assert::same(array_sum($stats), MAX_REQUESTS * MAX_CONCURRENCY);
62    echo "DONE\n";
63};
64
65$pm->childFunc = function () use ($pm, $port) {
66    $serv = new Server('127.0.0.1', $port, SWOOLE_PROCESS);
67    $serv->set(array(
68        "worker_num" => WORKER_N,
69        'dispatch_mode' => 3,
70        'package_eof' => "\r\n\r\n",
71        'enable_coroutine' => false,
72        'open_eof_split' => true,
73        'log_file' => '/dev/null',
74    ));
75    $serv->on("WorkerStart", function (Server $serv) use ($pm) {
76        $pm->wakeup();
77    });
78    $serv->on('receive', function (Server $serv, $fd, $rid, $data) {
79        if ($serv->worker_id == 10 or $serv->worker_id == 5) {
80            usleep(5000);
81        }
82        $serv->send($fd, $serv->worker_id . "\r\n\r\n");
83    });
84    $serv->start();
85};
86
87$pm->childFirst();
88$pm->run();
89?>
90--EXPECT--
91DONE
92