PHP游戏服务器,多个TCP客户端?

PHP游戏服务器,多个TCP客户端?,php,tcp,websocket,Php,Tcp,Websocket,我正在制作一个基于网络浏览器的多人游戏。鉴于WebSocket的实时性,我认为WebSocket是处理通信的最佳方式。客户端使用HTML5画布渲染游戏,并使用WebSocket与主机通信 我选择使用PHP来托管游戏,因为托管提供商似乎更喜欢它。我以前没有使用过PHP,但在Java中用WebSocket做过类似的事情,但严重依赖多线程 我一直在看一些关于多客户端php套接字的教程;但是他们中的大多数人都会为每个客户机提供新的流程。因为我会有一个不断运行的游戏循环,我认为这不合适 我试图实现的是在每

我正在制作一个基于网络浏览器的多人游戏。鉴于WebSocket的实时性,我认为WebSocket是处理通信的最佳方式。客户端使用HTML5画布渲染游戏,并使用WebSocket与主机通信

我选择使用PHP来托管游戏,因为托管提供商似乎更喜欢它。我以前没有使用过PHP,但在Java中用WebSocket做过类似的事情,但严重依赖多线程

我一直在看一些关于多客户端php套接字的教程;但是他们中的大多数人都会为每个客户机提供新的流程。因为我会有一个不断运行的游戏循环,我认为这不合适

我试图实现的是在每个客户端连接时为其分配端口、侦听新客户端、与当前客户端列表交换数据以及一起运行游戏循环

我需要帮助的地方有:

  • 如何查找端口并将其分配给新客户端,通知客户端该端口,以及在断开连接时清理端口
  • 如何在不阻塞游戏循环的情况下执行上述操作以及所有其他套接字事务。可以接受部分地接受来自客户端的消息,并且只对完整的消息进行操作
有谁能给我一些关于如何实现这些目标的技术建议吗? 我不认为这一切看起来像是太多的PHP要求,但纠正我,如果我错了

一些我理想情况下希望在服务器端实现的伪代码。任何函数都不应阻止: 阵列客户端

while(gamerunning)
{
    CheckForNewClients();
    GetStatusFromClients();
    DoGameUpdate();
    SendGameStateToClients();
}
[更新]
对于任何感兴趣的人,我创建了一个支持web套接字的专用应用程序(特别是使用Java和“Tootallates”web套接字库),而不是一个实际的web服务,因为它似乎更有意义,尽管顺带一提,由于安全问题,大多数web浏览器似乎都将web套接字挂在了垃圾箱中。

我不建议将PHP用于此类应用程序。PHP并不正式支持多线程,并且在未定义的时间段内运行PHP脚本(如服务器)并不是真正的广告特性

当然,你可以尝试创造历史:)


(如果我弄错了,请纠正我)

您确实需要运行一个PHP守护进程才能有效地执行此操作(需要是PHP5.3)。我写了一篇相当完整的使用概述。无论您选择什么,我都建议您使用基于事件的运行循环系统

我设计了一个名为的基本运行循环库,它可能会很有帮助,特别是当您要处理
*\u select
时。我非常乐意回答你关于这方面的任何问题

编辑:

在一个基于事件的系统中,当你查看一系列命令时,你不会简单地
,你会对监听器做出反应。例如

而不是做:

while( 1 ) {
    ... /* listen, react */
} /* repeat */
运行循环通过注册侦听器(套接字和其他异步事件生成器)工作

上面的例子是一个非常简单的1源EventLoop和一个手动添加定时函数(甚至可以在调用
ReactClass
的过程中添加这些函数)

在我正在使用的应用程序中,我需要将异步事件馈送到后端(通过套接字),然后需要能够调用原始事件的任意偏移量的函数(对于超时客户端等)

如果你想要更多的例子,你可以在


我希望您觉得这很有用。

如果您可以获得VPS或允许您在其上运行Node.js的东西,我强烈建议您选择节点路径。Node.js中的多人服务器是小菜一碟。Node.js不是WebSocket的客户端解决方案吗?不,简而言之,nodejs是一种用于编写服务器的快速、事件驱动的服务器端javascript。另外:我建议使用nodejs来完成此任务。PHP并不是解决此问题的最佳解决方案,您需要一种基于事件的语言(nodejs),或者有一个事件框架(ruby-eventmachine、python-twisted、tornado等等)。长时间运行的PHP脚本是通往痛苦和眼泪的道路(这里是经验之声…)也许我创造了历史。。。我过去用PHP做过socket服务器守护进程(因为我的雇主强制执行了这项技术),但我不知道问题出在哪里。无论是单个进程还是多个进程,它都可以正常工作。它通过XMPP网关侦听/写入消息。到目前为止,它运行得非常好(不是很快,但比不上PHP的可用性)。@Kendall:我不认为速度是一个真正的问题。我也用Java编写了socket守护进程,PHP在速度上超过了大多数。首先,没有要启动的JVM。第二,PHP非常接近C原始套接字,不像Java的抽象套接字层;如果我的目标主机不允许服务器脚本不确定地运行,那么PHP将采用另一种技术&主机。有人建议将游戏状态存储在SQL数据库中,但我不知道这将如何工作,因为游戏事件将在服务器端发生,加上可能会有很大的CPU开销。我喜欢这个外观。你能告诉我如何设置它,使事件函数能够访问在单独的游戏循环中不断更新的对象数组吗?是否可以将此库用作游戏服务器,web游戏将连接到该服务器以更新其状态(例如每秒3次)?@psychobrm这取决于你的负载、大小和成本。我会试试看它是否适合你。
class ReactClass { ... }

$loop = new LooPHP_EventLoop( new ReactClass );

//add one time event
$loop->addEvent( function() {
    print "This event was called 0.5 second after being added\n";
}, 0.5 /* in seconds */ );

//this creates a repeating event, this is called right away and repeats
$add_event = function() use ( $loop, &$add_event ) {
    print "This event is REPEATEDLY called 0.1 every second\n";
    $loop->addEvent( $add_event, 0.1 );
};
$add_event();

//start the loop processing, no events are processed until this is done
$loop->run(); //php doesn't leave this call until the daemon is done
exit(0); //cleanly exit