1--TEST-- 2swoole_http_server/task: use async io and coroutine in task process 3--SKIPIF-- 4<?php require __DIR__ . '/../../include/skipif.inc'; ?> 5--FILE-- 6<?php 7require __DIR__ . '/../../include/bootstrap.php'; 8$randoms = []; 9for ($n = MAX_REQUESTS; $n--;) { 10 $randoms[] = get_safe_random(mt_rand(0, 65536)); 11} 12$pm = new ProcessManager; 13$pm->parentFunc = function ($pid) use ($pm) { 14 go(function () use ($pm) { 15 for ($n = MAX_REQUESTS; $n--;) { 16 if (!Assert::assert(($res = httpGetBody("http://127.0.0.1:{$pm->getFreePort()}/task?n={$n}")) === 'OK')) { 17 echo "{$res}\n"; 18 break; 19 } 20 } 21 }); 22 Swoole\Event::wait(); 23 $pm->kill(); 24 echo "DONE\n"; 25}; 26$pm->childFunc = function () use ($pm) { 27 $server = new swoole_http_server('127.0.0.1', $pm->getFreePort(), SWOOLE_PROCESS); 28 $server->set([ 29 'log_file' => '/dev/null', 30 'task_worker_num' => 1, 31 'task_enable_coroutine' => true 32 ]); 33 $server->on('workerStart', function ($serv, $wid) use ($pm) { 34 $pm->wakeup(); 35 }); 36 $server->on('request', function (swoole_http_request $request, swoole_http_response $response) use ($server) { 37 global $randoms; 38 $n = $request->get['n']; 39 switch ($request->server['path_info']) { 40 case '/task': 41 { 42 list($ret_n, $ret_random) = $server->taskCo([$n], 1)[0]; 43 if ($ret_n !== $n) { 44 $response->end("ERROR MATCH {$ret_n} with {$n}"); 45 return; 46 } elseif ($ret_random !== $randoms[$n]) { 47 $response->end("ERROR EQUAL {$ret_n}(" . strlen($ret_random) . ") with {$n}(" . strlen($randoms[$n]) . ")"); 48 return; 49 } 50 $response->end('OK'); 51 break; 52 } 53 case '/random': 54 { 55 $response->end($randoms[$n]); 56 break; 57 } 58 } 59 }); 60 $server->on('task', function (swoole_http_server $server, swoole_server_task $task) use ($pm) { 61 $cli = new Swoole\Coroutine\Http\Client('127.0.0.1', $pm->getFreePort()); 62 $cli->get("/random?n={$task->data}"); 63 $task->finish([$task->data, $cli->body]); 64 }); 65 $server->on('finish', function () { }); 66 $server->start(); 67}; 68$pm->childFirst(); 69$pm->run(); 70?> 71--EXPECT-- 72DONE 73