Php 什么';在一组人中共享实时GPS坐标的最佳方式是什么?

Php 什么';在一组人中共享实时GPS坐标的最佳方式是什么?,php,javascript,mysql,mobile,gps,Php,Javascript,Mysql,Mobile,Gps,我正在设计一款游戏,要求玩家实时(接近)知道其他玩家的GPS真实世界位置。可能会有约5秒的延迟,但仍能正常工作 目标平台是Android,但是我对包括我的iPhone朋友感兴趣,所以我希望使用HTML5、Javascript和PHP在web上构建这个平台 我尝试过几种不同的方法,比如BeaconPush和不断地读/写MySQL数据库,但我不确定最好、最有效的方法。我开始写一堆代码,然后发现一个问题并尝试另一种方法,似乎一直在撞我的头 这个游戏有点像吃豆人。三名球员试图“抓住”一名球员。一个玩家在

我正在设计一款游戏,要求玩家实时(接近)知道其他玩家的GPS真实世界位置。可能会有约5秒的延迟,但仍能正常工作

目标平台是Android,但是我对包括我的iPhone朋友感兴趣,所以我希望使用HTML5、Javascript和PHP在web上构建这个平台

我尝试过几种不同的方法,比如BeaconPush和不断地读/写MySQL数据库,但我不确定最好、最有效的方法。我开始写一堆代码,然后发现一个问题并尝试另一种方法,似乎一直在撞我的头

这个游戏有点像吃豆人。三名球员试图“抓住”一名球员。一个玩家在现实世界地图上有一个特定的目标。游戏从数据库中获取坐标,并在谷歌地图上生成对象/图标。游戏使用navigator.geolocation.watchPosition检查物品的命中检测,玩家可以在经过物品时拾取物品。所有这些都很好,但地图必须能够在对象图标被移除时更新它们,并在接近实时的情况下使用其他玩家的位置更新图标。我不知道如何以最有效的方式分享每个人的GPS位置。整个游戏基本上运行正常,除了这一块(尽管是巨大的)拼图


谢谢你的指导

好的,那么您的问题是如何在服务器和多个客户端之间进行近实时的有效通信。你有两个问题,与客户的有效沟通。以及服务器上“会话”之间的有效通信

HTTP客户端到服务器 http协议不是有状态的。这意味着您发送一个请求,服务器响应,然后连接关闭。这使得它很难像游戏要求的那样以双向或事件驱动的方式进行沟通。这就是大多数网络游戏使用UDP的原因,UDP发送信息的开销要小得多。 我们必须使用TCP/IP,在这种情况下我们必须使用HTTP协议,那么我们如何才能有效地做到这一点

彗星就是答案。Comet服务器只是一个“术语”,它意味着一个服务器可以保持连接长时间打开,以持续向客户机发送数据。Comet服务器使用异步流(ajax)连接,允许客户端“知道”新信息何时到达,而无需读取整个响应。 另请参见:长轮询

每届会议 当服务器收到请求时,它需要问“其他人在哪里”的问题,并且需要经常有效地问这个问题。 Mysql不会是解决此类问题的最佳技术解决方案。您希望非常快速地从多个进程(每个http客户端)写入和读取小值

为什么要通过网络连接发送数据,从字符串(sql)解码数据,然后等待服务器解码插入或响应,等等?这听起来像是额外的开销

您需要的是真正的IPC(进程间通信)。这在PHP中很难实现,但可以做到。使用共享内存,甚至写入内存映射文件将是读取和写入GPS坐标更新的最高速率的最佳解决方案。

将其捆绑在一起: 客户端向服务器发送请求并开始轮询它。服务器读取共享内存以查看其他内存的坐标。服务器向开放连接写入一行,其中包含一个JSON字符串,描述所有玩家的位置。 在客户端轮询服务器的同时,它还必须向服务器发送一个描述其位置的请求,并且服务器必须将该值写入共享内存。 在客户端关闭http连接之前,程序一直处于连续循环中

请看这些:

如果共享内存不是一个选项,那么我建议使用不同的数据库或更简单的东西,比如键值存储(memcache),甚至mongodb。它们都将具有更少的事务开销,并且能够比MySQL更快地插入和轮询

第三种选择是使用PostgreSQL作为IPC机制。您可以使用LISTEN事件进行此操作,但这有点做作

笔记: 这个解决方案在PHP中无法很好地扩展。假设您正在使用apache,并且您的工作池中有20个工作人员。当您达到20个连接时,所有的服务器php进程都将被其他请求占用,因此第21个请求将无休止地等待工作进程可用


最好的解决方案是在Twisted或任何其他异步框架中实现Comet服务器/长轮询。

考虑到大多数GPS设备都不是非常精确(~20m),你需要一个相当大的地方来玩这个游戏,嗯?即使使用WiFi,我也不希望在5秒内从设备到DB同步到其他设备。听起来像是过度曝光。祝你好运。@是的,这是一场全城性的比赛;碰撞检测当前设置为四分之一英里@M'vy这就是我害怕的…我希望找到最好的折衷方案,考虑到这项技术,看看它是否能工作。不要告诉我你需要一辆车来玩这个。关于这项技术,您在服务器端使用的内容很难成为一个因素。用MySQL/PHP试试,看看它是如何工作的。如果速度太慢,我会在带宽/延迟更好的服务器(或更好的电话/运营商)上投入更多资金。是的,想法是让每辆车(2对)都有一名司机和一名乘客/运营商,电话由汽车供电,显示器设置为永不关闭,以便GPS数据始终被发送。游戏中使用coords.speed有速度限制。游戏是基于策略的(设置陷阱,使用偏僻的道路),所以安全不是问题,因为鲁莽驾驶不会给你带来任何好处。我是莫