簡體   English   中英

Hacklang中的異步服務器

[英]Async server in 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,但是在被等待之前它已經被丟棄或以危險的方式使用(Typing [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

但是我不想阻止並等待handleClient。

好吧,如果您不await它們,則無法保證它們會運行! Hack的異步功能使您可以異步運行不同的數據獲取,但是您實際上需要以某種方式獲得結果。 在編寫此代碼后,HHVM 無法保證將運行多少handleClient 可能是全部,也可能全都不是,它可能會在中間的某個隨機await語句中掛起handleClient

目前尚不清楚您到底想在這里做什么,但是異步可能不是正確的工具。 Hack的異步不是多線程的 ,看起來您可能正在嘗試以這種方式使用它。 為此,請遵循PHP的“一請求一線程”模型。

我強烈建議您閱讀(最近重寫) 異步的正式文檔,文檔解釋了異步的好處以及使用方法。

然后我以這種方式運行代碼:hhvm -d hhvm.hack.lang.auto_typecheck = 0 first.php

不要關閉類型檢查器-這表明一開始的代碼有問題。 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM