我正在尝试在 hacklang 中创建异步服务器。文件名是first.php:
<?hh
namespace MyExperiment;
async function server(string $host, int $port): Awaitable<void> {
$master = stream_socket_server("tcp://$host:$port");
stream_set_blocking($master, 0);
while (true) {
await stream_await($master, STREAM_AWAIT_READ, 1.0);
$clientSocket = stream_socket_accept($master);
stream_set_blocking($clientSocket, 0);
handleClient($clientSocket);
}
}
async function handleClient($socket): Awaitable<void> {
await stream_await($socket, STREAM_AWAIT_READ, 1.0);
$data = fread($socket, 1024);
echo $data;
await stream_await($socket, STREAM_AWAIT_WRITE, 1.0);
fwrite($socket, 'aaaaaaaa');
fclose($socket);
}
function run(): void {
\HH\Asio\join(server('192.168.0.97', 8080));
}
run();
但这不起作用。这段代码上的 hh_client 说:
first.php:16:3,29:此表达式的类型为 Awaitable,但在等待之前它要么被丢弃,要么被以危险的方式使用(Typing[4015])
first.php:20:39,47: 这就是为什么我认为它是 Awaitable
但我不想阻塞等待handleClient。
然后我以这种方式运行代码: hhvm -d hhvm.hack.lang.auto_typecheck=0 first.php
服务器启动。但是,当我开始从浏览器服务器向服务器http://192.168.0.97:8080/发送请求时,在很长一段时间内很少请求并且不再接受新连接。
我做错了吗?是否可以在 hacklang 中创建这样的服务器?
$ hhvm --version
HipHop VM 3.11.0 (rel)
Compiler: tags/HHVM-3.11.0-0-g3dd564a8cde23e3205a29720d3435c771274085e
Repo schema: 52047bdda550f21c2ec2fcc295e0e6d02407be51