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