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