我正在尝试在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 {
HHAsiojoin(server('192.168.0.97', 8080));
}
run();
但这并不奏效。hh_client在这个代码上说:
first.php:16:3,29:这个表达式的类型是Awaitable,但它在等待之前被丢弃或以危险的方式使用(打字【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
但我不想阻塞并等待handleClient。
好吧,如果你不await
它们,那么就不能保证它们会运行!Hack的异步功能可以让你异步运行不同的数据提取,但你需要以某种方式实际得到结果。在编写此代码时,HHVM没有对handleClient
的运行量做出任何承诺。它可能是全部,也可能不是全部,它可能在中间的某个随机await
语句中挂起handleClient
目前还不清楚你在这里到底想做什么,但async可能不是合适的工具。Hack的async不是多线程的,看起来你可能正试图以这种方式使用它。保持PHP的一个请求一个线程模型。
我强烈建议您阅读(最近重写的)async的官方文档,其中解释了它的优点以及如何使用它
然后我以这种方式运行代码:hhvm-d hhvm.hack.lang.auto_typecheck=0 first.php
不要关闭类型检查器——这表明你的代码从一开始就有问题。:)