我正在将 ReactPHP 用于 TCP 侦听器组件。该组件侦听传入连接并与它们交换数据。$connections 数组随着客户端与侦听器的连接/断开而更新。
$loop = React\EventLoop\Factory::create();
$connections = [];
$socket = new React\Socket\Server($loop);
$socket->on('connection', function ($conn) use($loop, $db){
global $connections;
$connections[] = $conn;
$conn->on('data', function ($data) use ($conn,$loop, $db) {
global $connections;
// ...
// ...
$conn->on('close', function ($conn) use($loop, $db){
global $connections;
if(($key = array_search($conn, $connections, true)) !== FALSE) {
unset($connections[$key]);
}
});
});
$socket->listen(16555, '127.0.0.1');
$loop->run();
如果客户端通过 telnet 连接,将发出“关闭”,以便我可以从 $connection 数组中删除关闭的连接。但是,一些连接到我的听众的设备也有问题。如果我关闭设备“关闭”将不会发出。我试图用定期定时器解决问题:
$loop->addPeriodicTimer(10, function () use($db, $loop){
global $connections;
foreach($connections as $c) {
$remoteAddress = $c->getRemoteAddress();
$metaData = @stream_get_meta_data($c->stream);
if(!$metaData) {
if(($key = array_search($c, $connections, true)) !== FALSE) {
unset($connections[$key]);
}
}
}
});
但似乎它不够可靠。即使客户端断开连接,函数 stream_get_meta_data 也会返回有效的元数据数组。