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

2024-06-24

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

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

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

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

我需要帮助的地方是:

  • 如何查找端口并将其分配给新客户端,通知客户端该端口,并在它们断开连接时清理它。
  • 如何在不阻塞游戏循环的情况下执行上述操作以及所有其他套接字事务。以部分块的形式接受来自客户端的消息并且仅对完整消息进行操作是可以接受的。

谁能给我一些关于如何实现这些目标的技术建议? 我不认为这一切看起来对 PHP 要求太多,但如果我错了,请纠正我!

我理想中想要在服务器端实现的一些伪代码。任何函数都不应阻塞: 数组客户端;

while(gamerunning)
{
    CheckForNewClients();
    GetStatusFromClients();
    DoGameUpdate();
    SendGameStateToClients();
}

[更新] 对于任何感兴趣的人,我创建了一个支持 Web 套接字的专用应用程序(特别是使用 Java 和“TooTallNates”Web 套接字库),而不是一个实际的 Web 服务,因为它似乎更有意义,尽管顺便说一句,大多数 Web 浏览器似乎已经不再支持 Web由于安全问题,插座放在垃圾箱中。


您确实需要运行 PHP 守护程序才能有效地执行此操作(并且需要是 PHP 5.3)。我写了一个相当完整的使用概述用于守护进程的 PHP https://stackoverflow.com/questions/4169412/how-to-design-a-daemon-with-a-mysql-db-connection/4169523#4169523。无论您选择什么,我都建议您使用基于事件的运行循环系统。

我设计了一个基本的 RunLoop 库,名为LooPHP https://github.com/Wordi/LooPHP这可能会有所帮助,特别是如果您要处理*_select。我非常乐意回答您对此的任何问题。

EDIT:

在基于事件的系统中,您不只是while命令列表,您对侦听器做出反应。例如...

而不是做:

while( 1 ) {
    ... /* listen, react */
} /* repeat */

运行循环通过注册侦听器(套接字和其他异步事件生成器)来工作

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

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

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

如果您想要更多示例,可以在以下位置找到它们github https://github.com/Wordi/LooPHP/blob/master/examples/.

希望这个对你有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP游戏服务器,多个TCP客户端? 的相关文章

  • 如何使用 mysqli 设置排序规则?

    我的数据库使用 utf8 czech ci 排序规则 我也想将其设置为我的数据库连接 如果我不想要默认的 utf8 general ci Mysqli set charset 不会让我设置排序规则 Here https bugs php n
  • 无法加载动态库“php_wincache.dll”?

    因为我已经使用 ASP NET 所以我决定在 IIS 上使用 PHP 我使用 Wep PI 安装它 但是当我尝试安装 Composer 时 他失败并出现 PHP 设置错误 我尝试将 php ini 中的 extension dir 更改为绝
  • 检查行是否存在,Laravel

    我有以下数据库结构 items id name user id users table id name user favorites table id user id item id 在我的项目永久链接页面上 我有一个 添加到收藏夹 按钮
  • 使用php从图像中获取第一个像素

    我正在尝试获取图像的第一个像素 最好是最左上角或最右上角的一个像素 我看到了这个问题 它有最接近我的问题的答案 获取图像颜色 https stackoverflow com questions 1746530 get image color
  • AppCache清单错误

    Edit 我不得不删除一些链接 我的清单页面似乎导致我的网页出现错误 当您第一次访问该页面时 所有内容似乎都已成功缓存 但刷新后无法获取存在的文件 我在这里制作了一个快速测试页面来查看 这是我的清单文件 这是一个由 php 和 javasc
  • 在 php 文件上调用 exec 并传递参数?

    我想使用调用 php 文件exec http nz php net manual en function exec php 当我调用它时 我希望能够通过 id 传递变量 我可以打电话echo exec php var www unity s
  • IOS 向特定用户推送通知?

    是否可以向特定设备发送 iOS 推送通知 我构建了一个论坛类型的应用程序 用户可以创建问题 其他人可以回答它 我需要向提出问题的特定用户发送 iOS 推送通知 通知他们问题已得到解答 这可以通过 PHP 或其他方法来完成吗 是的 您绝对可以
  • Laravel 7 会话在不同域中的 IFRAME 上中断

    我尝试在这里开发一个简单的 Laravel 应用程序 https shopifyapp sjranjan com https shopifyapp sjranjan com 此登录工作正常 现在我将上面的 URL 推送到此页面的 ifram
  • WordPress 中的随机永久链接键

    我想为 WordPress 中的每个新帖子都有一个自定义永久链接 例如 http mysite com x5Kvy6 http mysite com x5Kvy6 如 bit ly 我尝试了这个小脚本 但它只在永久链接的帖子标题中添加了 5
  • WordPress、PHP、URL 编码问题

    Wordpress 提供了一个名为 the permalink 的函数 您猜对了 在帖子循环中返回给定帖子的永久链接 我正在尝试对该永久链接进行 URL 编码 当我执行此代码时 它以 HTML 形式生成以下结果 http
  • 如何在 Windows 上以纯 PHP 形式提取 .tar 文件?

    我有一个 PHP 脚本 我想在 Windows 上运行 我需要提取 tar 文件 如何提取 tar 文件 我知道 PharData 类 它可以在 Linux 上运行 但不能在 Windows 上运行 我的脚本就死了 没有错误输出或任何东西
  • Laravel 4 类如何检测它是在 Artisan 任务中运行还是在浏览器请求中运行?

    我有一些应用程序启动代码 需要知道它当前是在 artisan 任务中运行还是在浏览器请求中调用 我如何在 Laravel 4 中检测到这一点 这是最好的方法 if App runningInConsole echo Running in a
  • PHP:注意:定义会话变量的索引未定义

    我正在制作一个带有电子邮件验证器的注册系统 您典型的 使用此代码来验证 类型的事情 我希望存储一个会话变量 以便当人们在注册页面上完成帐户注册并意外导航回该页面时 它会提醒他们需要在使用前激活帐户 使这个问题如此难以诊断的原因是我以类似的方
  • Outlook 2007 接收 html 邮件作为带有标头的源,其他 MUA 工作正常。为什么?

    我有几个简单的表单 可以发送纯 html 电子邮件 大多数客户端 Gmail Lotus Notes 8 hotmail live windows live mail outlookexpress 都能正常接收电子邮件 但 Outlook
  • PHP、MySQL 验证故障且搜索不起作用?

    我创建了一个小的注册粘性表格 一切工作正常 但如果我输入任何错误的值 例如姓名中的数字 年龄中的字母甚至错误的电子邮件格式 那么数据仍然保存在数据库中 我无法找出验证问题 另外一个是搜索选项 每当我在搜索框中输入任何名字或姓氏时 它都应该显
  • 停止警告:date() [function.date]:来自本地主机

    警告 date function date 依赖系统的时区设置是不安全的 你是required使用 date timezone 设置或 date default timezone set 函数 如果您使用任何这些方法并且仍然收到此警告 则很
  • 是否可以倒回 PDO 结果?

    我正在尝试为 PDO 语句的结果编写一个迭代器 但找不到任何回退到第一行的方法 我想避免调用 fetchAll 和存储所有结果数据的开销 first loop works fine foreach statement as result d
  • 在 imagick php 中使用 svg 原始数据生成 SVG 图像

    我正在尝试使用从 Fabric js 获取的 svg 原始数据创建 svg 图像 我使用下面的代码使用 svg 原始数据生成 svg 但它无法正常工作 public function generate svg raw svg prefix
  • 特殊字符和 URL 重写

    我目前正在开发一个应用程序 该应用程序从暴雪社区 API 中提取 JSON 数据并使用 PHP 对其进行解析 一切正常 直到我遇到一个名字中有特殊字符的角色 为了提取角色数据 我需要知道他们的角色名称和他们所在的领域 我将名称和领域通过 U
  • Laravel 5 中的两个登录表单

    我一直想知道如何在 laravel 5 中制作两个登录表单一段时间 原因是因为我有一个多站点项目 我在一个项目中拥有管理站点和公共站点 我对路由进行了分组 以便管理路由回答一个域 公共路由回答另一个域 如下所示 Route group ar

随机推荐

  • scala 元组拆包

    我知道这个问题已经以不同的方式出现过很多次 但我仍然不清楚 有没有办法达到以下目的 def foo a Int b Int foo a b right way to invoke foo foo getParams is there a w
  • 禁用在 Visual Studio 2017 中不起作用的 Azure Functions 属性

    我有带计时器触发器的 Azure 功能 public static void Run TimerTrigger 0 15 Disable True TimerInfo myTimer TraceWriter log 这里的Disable t
  • 如何使用 nexus/maven 将依赖项添加到第 3 方库

    我正在尝试专业地使用 Nexus m2eclipse maven 3 并且我有一个巨大的第 3 方库 需要很多依赖项 有没有什么方法可以通过将这个第三方库及其所有链接的依赖项上传到 Nexus 来减轻我的痛苦 这样任何需要它的人都只需为这个
  • Java棋盘游戏

    基本上 我正在用 java 创建一个棋盘游戏 并设法使用数组创建单元格 使其看起来像 10x10 网格 现在我已经对它们进行了编号 它们从左到右从上到下 如图所示 我正在创建一个类似于蛇和梯子游戏的游戏 但有自己的特色 问题是 如何创建类似
  • 使函数调用中的括号可选

    嘿 我即将重写我的 JavaScript 库的核心文件 并且我正在寻找更好的方法来完成所有事情 其中之一是我如何使括号可选 例如某些函数调用如下所示 Spark p content Hello World 还有其他人也这样 Spark br
  • 在 Android Studio 中重新启动系统后,项目视图未显示

    重新启动系统后 我无法查看 Android Studio 中任何项目的项目结构 以前 我可以通过进入 视图 gt 项目 来选择 项目视图 但 视图 菜单现在不显示此类选项 请看下图 今天早上这个问题就发生在我身上 解释 Fabric Cra
  • 如何在Linux下生成系统范围的唯一ID

    我正在使用多进程 Linux 系统 需要生成唯一的 ID 安全性不是考虑因素 因此 ID 生成器从零开始递增就可以了 而且它只是在本地计算机内 不涉及网络 显然 实现这一点并不难 但我只是想知道是否已经提供了任何东西 最好是轻量级的 这听起
  • GSM SIM800C 文本转语音音频流

    I have 我已经成功地能够向它发送 AT 命令并执行一些操作 但我真正想要的是文本转语音功能 我能够生成 AMR 音频文件 将其上传到模块的内部存储器 并在有人时播放它来电 但是来电者听到的消息将是动态的 并且 TTS 将实时运行 因此
  • 合并 PDF iTextSharp

    我在网上查看了一些示例 并提出了使用 iTextSharp 合并 pdf 的代码 但我收到一个错误 该文档没有页面 它失败于页面 writer GetImportedPage reader X 这是堆栈跟踪 at iTextSharp te
  • 如何使用自定义数据生成器进行 keras 图像增强?

    我正在使用 Keras 自定义生成器 我想对从自定义数据生成器返回的数据应用图像增强技术 我想要这些图像增强技术 ImageDataGenerator rotation range 40 width shift range 0 2 heig
  • UIDatePicker,显示带有年份和时间的完整日期

    你能有一个UIDatePicker在 DatePicker 上显示日 月 年和时间 或者我需要进行自己的自定义UIPickerView i e 2000 年 11 月 12 日星期一 5 20 AM 目前日期选择器 datePickerMo
  • 如果内容超出使用 JavaScript 的 html 表格的固定宽度,则将文本拆分到下一行

    我有一个 div 它由应用了不同样式的表格组成 我正在尝试实现一个布局 如果文本超过表格 td 的宽度 它应该转到下一行 但我不能这样做 我的代码是
  • 尽管代码是正确的,为什么这个程序会显示其他内容? [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 include
  • 如何扩展 Selenium By.class 以创造更大的灵活性?

    我怎样才能延长硒By class创造更多的灵活性 我看了看By class http code google com p selenium source browse java client src org openqa selenium
  • jQuery outerHeight() 错误 - 在以下版本中无法正常工作1.8.3

    所以我有一个脚本可以均衡 x 轴上其他元素的高度 该脚本工作得很好 但只有当我使用 jQuery 1 8 3 时 问题似乎是由于outerHeight 功能 我试图找出进行了哪些更新outerHeight 对于 1 8 3 但我没有太多运气
  • strip_tags 不允许某些标签

    基于strip tags http php net manual en function strip tags php文档中 第二个参数采用允许的标签 但就我而言 我想做相反的事情 说我会接受标签script tags通常 默认 接受 但仅
  • PHP 中时间的乘法

    我需要在 PHP 中乘以时间 maritime 01 10 00 我需要增加这个 maritime到 5我想得到这样的答案 01 10 00 5 05 50 00 这是你应该做的 Step 1 将您的小时数转换为秒数 seconds str
  • 如何知道我安装的是哪个版本的 monotouch?

    如何知道我安装的是哪个版本的 monotouch 有多种方法可以获取版本号 从终端您可以执行以下操作 Developer MonoTouch usr bin mtouch version mtouch 5 3 5 1340204820 or
  • 在 componentDidMount 内部的回调中设置状态

    我目前正在使用React 16 3 React Native 编写here https reactjs org blog 2018 03 29 react v 16 3 html 这表明我SHOULD在 componentDidMount
  • PHP游戏服务器,多个TCP客户端?

    我正在制作一个基于网络浏览器的多人游戏 鉴于其实时性 我确定 Websocket 是处理通信的最佳方式 客户端使用 HTML5 画布来渲染游戏 并使用 Websocket 与主机进行通信 我选择使用 PHP 来托管游戏 因为托管提供商似乎更