Tob*_*son 10 php tcp websocket
我正在制作一个基于Web浏览器的多人游戏.鉴于其实时性,我已经确定websockets是处理通信的最佳方式.客户端使用HTML5画布渲染游戏和websockets以与主机通信.
我选择使用PHP来托管游戏,因为它似乎是托管服务提供商的首选.我以前没有使用PHP,但是在Java中使用websockets做了类似的事情,但是在很大程度上依赖于多线程.
我一直在寻找有关多个客户端的PHP套接字的一些教程; 但是他们中的大多数都会为每个客户端分配新流程.由于我将有一个不断运行的游戏循环,我不认为这是合适的.
我想要实现的是在连接时为每个客户端分配端口,监听新客户端,与当前客户端列表交换数据以及一起运行游戏循环的方法.
我需要帮助的地方是:
谁能给我一些关于如何实现这些目标的技术建议?我不认为这对于PHP的问题看起来太多了但是如果我错了就纠正我!
我想要实现服务器端的一些伪代码.这些函数都不应该阻塞:数组客户端;
while(gamerunning)
{
CheckForNewClients();
GetStatusFromClients();
DoGameUpdate();
SendGameStateToClients();
}
Run Code Online (Sandbox Code Playgroud)
[更新]对于任何感兴趣的人,我创建了一个支持Web套接字的专用应用程序(特别是使用Java和'TooTallNates'的Web套接字库)而不是实际的Web服务,因为它似乎更有意义,尽管似乎大多数Web浏览器都有由于安全问题,因此在垃圾箱中挂起网络插座.
你真的需要运行一个PHP守护进程才能有效地执行此操作(并且它需要是PHP 5.3).我写了一个相当完整的概述,将PHP用于守护进程.无论你选择什么,我建议你使用基于事件的运行循环系统.
我设计了一个名为LooPHP的基本RunLoop库,它可能会有所帮助,特别是如果你要处理的话*_select.我非常乐意回答你对此有任何疑问.
编辑:
在基于事件的系统中,您不仅仅是while一个命令列表,而是对侦听器作出反应.例如...
而不是做:
while( 1 ) {
... /* listen, react */
} /* repeat */
Run Code Online (Sandbox Code Playgroud)
通过注册监听器(套接字和其他异步事件生成器)来运行循环工作
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
Run Code Online (Sandbox Code Playgroud)
上面的例子是一个非常简单的1源EventLoop和一个手动添加定时功能(这些功能甚至可以在调用中添加ReactClass).
在我正在工作的应用程序中,我需要将异步事件提供到后端(通过套接字),然后需要能够从原始事件调用函数任意偏移量(对于超时客户端等).
如果您想了解更多示例,可以在github上找到它们.
希望这个对你有帮助.
我不建议将PHP用于此类应用程序.PHP没有正式支持多线程,并且在未定义的时间段内运行PHP脚本(如服务器)并不是一个真正的广告功能.
当然你可以尝试创造历史:)
(如果我错了,请纠正我)