hacklang中的异步服务器



我正在尝试在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 {
    HHAsiojoin(server('192.168.0.97', 8080));
}
run();

但这并不奏效。hh_client在这个代码上说:

first.php:16:3,29:这个表达式的类型是Awaitable,但它在等待之前被丢弃或以危险的方式使用(打字【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

但我不想阻塞并等待handleClient。

好吧,如果你不await它们,那么就不能保证它们会运行!Hack的异步功能可以让你异步运行不同的数据提取,但你需要以某种方式实际得到结果。在编写此代码时,HHVM没有对handleClient的运行量做出任何承诺。它可能是全部,也可能不是全部,它可能在中间的某个随机await语句中挂起handleClient

目前还不清楚你在这里到底想做什么,但async可能不是合适的工具。Hack的async不是多线程的,看起来你可能正试图以这种方式使用它。保持PHP的一个请求一个线程模型。

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

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

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

相关内容

  • 没有找到相关文章

最新更新