0

我正在尝试在 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
4

1 回答 1

1

但我不想阻塞等待handleClient。

好吧,如果您不使用await它们,则无法保证它们会运行!Hack 的异步功能允许您异步运行不同的数据获取,但您需要以某种方式实际获取结果。在您编写此代码时,HHVM不承诺handleClient将运行多少代码。它可能是全部,也可能不是,它可能会在中间的handleClient某个随机语句处暂停。await

目前尚不清楚您究竟想在这里做什么,但 async 可能不是适合它的工具。Hack 的 async不是 multithreading,看起来您可能正试图以这种方式使用它。为此,请遵循 PHP 的单请求单线程模型。

我强烈建议您阅读(最近重写的)async 官方文档,其中解释了它的优点以及如何使用它。

然后我以这种方式运行代码: hhvm -d hhvm.hack.lang.auto_typecheck=0 first.php

不要关闭类型检查器——它表明你的代码从一开始就有问题。:)

于 2016-01-08T20:13:09.637 回答