我试图在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,但它要么被丢弃,要么在等待之前以危险的方式使用(Typing4015) 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
发布于 2016-01-08 20:13:09
但我不想阻止和等待handleClient。
好吧,如果你不await
他们,那就不能保证他们会跑!Hack的异步功能允许您以异步方式运行不同的数据获取,但是您需要以某种方式获得结果。在编写这段代码时,HHVM并没有承诺运行多少handleClient
。它可能是全部,可能不是,它可能挂起handleClient
在它中间的一些随机的await
语句。
您在这里到底想做什么还不清楚,但是异步可能不是正确的工具。Hack的异步不是多线程,看起来您可能正试图以这种方式使用它。请继续使用PHP的单请求单线程模型。
我强烈建议您阅读(最近重写的) 异步的正式文档,它解释了它的优点以及如何使用它。
然后我以这样的方式运行代码: hhvm -d hhvm.hack.lang.auto_typecheck=0 first.php
不要关掉打字机--这表明你的代码在开始的时候出了问题。:)
https://stackoverflow.com/questions/34683827
复制相似问题