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ステートメントで中断するかもしれません。

ここで正確に何をしようとしているのかは不明ですが、非同期は適切な機能ではない可能性があります。Hack の asyncは multithreadingではなく、そのように使用しようとしているようです。そのためには、PHP の 1 リクエスト 1 スレッド モデルに従ってください。

(最近書き直された) async の公式ドキュメントを読むことを強くお勧めします。このドキュメントでは、非同期の利点と使用方法が説明されています。

次に、次のようにコードを実行します: hhvm -d hhvm.hack.lang.auto_typecheck=0 first.php

タイプチェッカーをオフにしないでください。最初からコードに問題があることを示していました。:)

于 2016-01-08T20:13:09.637 に答える