hacklang中的异步服务器

时间:2016-01-08 18:37:33

标签: asynchronous async-await hhvm 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 {
    \HH\Asio\join(server('192.168.0.97', 8080));
}

run();

但这不起作用。 hh_client对此代码说:

  

first.php:16:3,29:这个表达式是Awaitable,但是它的表达式是   在等待之前被丢弃或以危险的方式使用   (打字[4015])

     

first.php:20:39,47:这就是我认为它是等待的原因

但我不想阻止并等待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

1 个答案:

答案 0 :(得分:1)

  

但我不想阻止并等待handleClient。

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

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

我强烈建议您阅读(最近重写的)official documentation of async,它解释了它的优点以及如何使用它。

  

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

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