我在服务器(游戏)上有一个交互式cli程序。我想创建一个与该程序通信的Web应用程序。 proc_open似乎可以解决问题,但我必须在处理完每个请求后关闭进程。
此流程输出需要发送到客户端,客户端将使用适当的输入进行响应。因为这是一个游戏,这个循环可以持续一段时间。
我的问题是:如何在等待客户端输入的同时保持服务器上的进程运行。
我做了一些研究,我想知道Ratchet IO(websockets)是否是最佳选择?
答案 0 :(得分:0)
假设你有一个php标签,我建议你创建一个可以使用运行棘轮wsserver的命令行运行的php脚本。
我可以给你一个为laravel命令行编写的例子:
class StartServer extends Command {
/**
* The console command name.
*
* @var string
*/
protected $name = 'start:server';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Start WebSocket server';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function fire()
{
// This variable can be utilized before running the server
$socket_server = new SocketServer();
$server = IoServer::factory(new HttpServer(new WsServer($socket_server)), PORT);
$server->run();
}
}
你的SocketServer类看起来像这样:
class SocketServer implements MessageComponentInterface
{
public function __construct()
{
}
public function onOpen(ConnectionInterface $conn) {
// New connection handle it, store it if necessary, make sure a session and connection is well mapped. Alternatively you can use Ratchet's SessionProvider
}
public function onMessage(ConnectionInterface $from, $msg) {
// Got message, do something with it
}
/**
* @param \Ratchet\ConnectionInterface $conn
*/
public function onClose(ConnectionInterface $conn) {
echo "Connection {$conn->resourceId} has disconnected\n";
}
/**
* socket Error
* @param \Ratchet\ConnectionInterface $conn
* @param \Exception $e
*/
public function onError(ConnectionInterface $conn, \Exception $e) {
echo "An error has occurred: {$e->getMessage()}\n";
$conn->close();
}
}