[英]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.