HUNYING / GET STARTED
上传文件,和队友见面。
魂影聊天室 · PHP 8.2 无数据库版
版权归魂影技术论坛。
一、上传和打开
- 在电脑解压源码包,打开里面的 hunying 文件夹。
- 使用主机面板的“文件管理”上传里面的全部文件和文件夹,包括 assets、storage、.htaccess。放到网站根目录,或单独的 chat 子目录。没有数据库配置,也不需要安装软件依赖。
- 在虚拟主机面板把 PHP 版本设为 8.2,为域名申请并开启 SSL / HTTPS。
- 访问 https://你的域名/。如果放在 chat 子目录,就访问 https://你的域名/chat/。
- 访问同目录下的 check.php 环境检查页,确认 PHP、HTTPS、写入和上传条件。建议让服务商设置 upload_max_filesize 至少 3M、post_max_size 至少 4M。
- 先用同一网络的两台设备测试,再用 Wi-Fi 和手机流量分别测试。务必实际听到双方声音,连接状态数字不能代替听音验收。
首次访问会自动准备文件存储,无需安装向导。需要 PHP 能写入 storage 目录。正常使用不需要编辑源码。
二、创建频道和邀请朋友
点击“创建频道”,填写频道名称和自己的用户名称。公开频道直接从大厅加入;私密频道使用 4–12 位数字私密码。密码留空时会随机生成,并在创建后显示一次,请保存好。
点击“复制邀请”发给朋友。私密频道的密码请单独发送,邀请链接不包含密码。朋友必须填写自己的用户名称和私密码;同频道不能重名。
无需账号,房主身份保存在当前浏览器 Cookie。不要清除它;更换设备或浏览器不会自动找回房主身份。同一浏览器身份在一个频道只允许一个页面在线,新页面加入会取代旧页面。不要在同一个浏览器里打开多个页面冒充不同队友,请用不同浏览器或设备测试。
三、开麦、按键说话和录音
- 进频道后默认“仅收听”。点击“开启麦克风”,在浏览器提示中选择允许。
- 点击声音设置,选择耳机麦克风。避免选择“立体声混音”、虚拟回环或系统输出设备。
- 默认自由麦,也可切换为按键说话。点击设置按键,再按自己想用的单键。默认 V。
- 按键仅在当前网页获得焦点时有效。切换到游戏后请用自由麦;纯网页不能注册系统全局热键。松键、切后台或失去焦点后会关闭按键发声,避免卡住一直说话。
- 手机使用按键模式时,可按住页面下方的“按住说话”。手机锁屏或切后台会受浏览器和系统限制,可能断开。
- 点击“录制语音”开始留言,再点击“停止并发送”。最长 60 秒、2 MB。录音时不会把同一麦克风同时送到实时通话。录音需要麦位及语音、文字权限,发送失败可重试。
名字后的小点会在实际收到声音时变绿,静音时为灰色。这是音量活动指示,不是声纹识别,噪声或共享音乐也可能点亮。文字与录音发送都由服务器限制为至少间隔 5 秒。
四、游戏音效和音乐分享
本程序默认只请求麦克风,不会主动采集电脑系统声音。开启回声消除、降噪和自动增益,并佩戴耳机,可以减少游戏外放串入麦克风。物理环境嘈杂、设备回环、声卡驱动混音时,网页不能保证完全分离人声。
浏览器无法列出并采集任意桌面软件进程。可选的“选择音乐标签页音频”适用于支持该能力的桌面 Chrome / Edge:先在另一个标签页打开音乐,再选择那个标签页,并勾选“共享标签页音频”。不要选择整个屏幕。代码不会发送视频画面;浏览器仍会显示共享授权提示。
自己讲话时,程序会自动降低自己所共享的音乐音量。浏览器或系统不提供标签页音频时,这个可选功能不可用。其他人的共享音乐不会由你的设备远程调整。
五、房主和管理员
| 能力 | 房主 | 二级管理员 |
|---|---|---|
| 语音 / 文字禁言、解除禁言 | 普通成员及管理员 | 仅普通成员 |
| 删除公屏文字 / 录音、上下麦位 | 可管理全部成员 | 仅普通成员及本人消息 |
| 踢出频道 | 有 | 房主单独授权,默认有 |
| 永久封禁频道身份 | 有,二次确认 | 房主单独授权,默认无 |
| 任命 / 撤销管理员、分配踢人和封禁权限 | 有 | 无 |
| 转让房主、公开 / 私密切换、锁定麦位、解封 | 有 | 无 |
| 查看最近 200 次操作日志 | 有 | 有 |
点击队友右侧“⋯”管理。永久封禁和转让房主都会再次确认。日志记录操作者、时间、对象和原因。被踢者 60 秒内不能重进;禁言会在同一身份重新加入后保留。
锁定麦位会阻止普通成员新上麦,已在麦位的人保留麦位。管理员可单独让成员下麦或抱上麦。转让房主后,原房主变为普通成员。
永久封禁针对匿名 Cookie 身份,在频道销毁或房主解除前持续有效。没有登录体系就无法可靠阻止清除 Cookie 后换身份绕过。点对点语音由标准客户端执行收发两端静音;若要抵抗恶意改造客户端并强制隔离媒体,需要额外的账号体系和中心媒体服务,普通 PHP 文件方案不具备这些条件。
六、实时语音跨网络为什么可能接不通
网页实时语音使用 WebRTC。PHP 负责频道和连接协商,实际声音通过浏览器点对点传输,不经 PHP 服务器持续转发。默认 STUN 只帮助寻找直连地址,不能保证所有 NAT、防火墙、企业网络或运营商之间互通。
若文字正常、录音能播放,但实时语音一直连不上,请让主机服务商配置 TURN 中继。普通 PHP 虚拟主机通常不能自己运行 TURN 服务。需要额外的 TURN 服务或具备相应条件的服务器,可能产生费用。本源码不能承诺只上传到任意虚拟主机就能跨所有网络通话。
你可以把下面这段交给服务商:
请提供并验证可用的 WebRTC TURN 服务,在 config.php 填写 turn_urls、turn_username 和 turn_credential。如果支持 coturn REST 临时凭证,则填写 turn_secret,固定账号可留空。支持 UDP / TCP 的 turn: 地址及 TLS 的 turns: 地址更便于跨受限网络连接。必要时测试 relay_only=true。不要把管理密钥填写到前端 JavaScript。
程序仅将所需的 ICE 凭证交给浏览器,TURN 服务端密钥保留在 PHP。公开站点优先使用短期凭证;固定 TURN 账号会被浏览器用户看到,需设置配额和来源限制。默认 STUN 服务是否能在你的所在地访问,也要实际验证。
七、清理、容量与性能
- 默认每频道最多 8 人,全站最多 40 个频道。面向游戏小队,容量是保护上限,不代表主机已通过满负载测试。每个浏览器最多连接其他 7 人,使用音频连接,不传摄像头。
- 正常离开后,连续空房 5 分钟过期。异常断开先等待最多 60 秒心跳超时,然后再计算 5 分钟。
- 无需计划任务,过期数据在下一次请求时清理。无人访问时 PHP 不会在后台自动执行,但过期频道下次访问不会复活。
- 公屏最多 80 条消息、24 条录音,最长保留 1 小时。管理日志最多 200 条,均随频道销毁。全站录音总量上限为 64 MB,达到上限会提示清理或稍后再试。不要把它用作永久档案。
- 前台约 1.4 秒拉取一次房间状态,后台降低请求频率。消息未变化时不重复传输消息正文。语音音量在本地检测,不逐帧上报。
- 不使用第三方前端库、网络字体、大图、背景模糊和装饰循环动画。退出时关闭麦克风、音频上下文、连接和计时器。浏览器自行决定 GPU 合成,程序不强制堆叠 GPU 图层。
- 实时语音的端到端内容不保存到主机;录音留言以文件临时保存,只有当前频道成员可通过接口读取。
八、常见问题
| 现象 | 处理方法 |
|---|---|
| 打开网页显示 PHP 源码 | 立即停止使用,让主机服务商开启 PHP 解析。不要在未解析 PHP 的目录存放本程序。 |
| 500 错误或无法写入 | 确认 PHP 8.2、storage 目录可写、主机空间未满。让服务商查看 PHP 错误日志。若 Apache 不支持随包的 .htaccess 指令,让服务商修改兼容配置;不要取消 storage 的访问保护。 |
| 麦克风按钮不工作 | 用 HTTPS 打开,在地址栏允许麦克风。内嵌浏览器可改用系统浏览器;检查系统麦克风权限。 |
| 实时语音没有声音 | 确认双方已上麦、开启麦克风、未被禁言;检查收听音量,点击“恢复声音”和“重新连接语音”。不同网络仍失败时配置 TURN。 |
| 录音不能上传 / 播放 | 检查 file_uploads、upload_max_filesize 和 post_max_size。WebM、Ogg、MP4 支持由浏览器决定,旧 Safari 可能无法播放其他浏览器录制的格式;请升级浏览器。文件过期或被删除后不可播放。 |
| 游戏声音盖住人声 | 选择真实的耳机麦克风而非回环设备,佩戴耳机、降低外放,开启降噪。音乐分享只选音乐标签页。 |
| 手机切后台就断线 | 这是系统对后台网页的限制。保持页面前台;回到页面后重新加入。纯网页不能保证锁屏持续通话。 |
| 提示另一页面已加入 | 关闭同浏览器中这个频道的重复页面,再重新加入。每个真实用户用自己的设备或浏览器。 |
| 更新后样式不一致 | 上传完整 assets 目录和 PHP 文件;让服务商同时提升 config.php 的 version,刷新页面。不要只上传部分文件。 |
九、备份和升级
备份整个程序目录。升级时保留 storage 里的已有数据及 secret.php,这个密钥决定浏览器身份。请保护 storage 和备份,不要把运行中的数据重新打包公开分享。源码包不含运行数据、测试文件或升级日志。
本版本具备基础访问校验、CSRF 防护、内容转义、文件锁、上传格式与大小限制、角色授权和限流。匿名公开站点仍需服务商提供 HTTPS、主机安全和网络层防刷;没有账号的匿名身份和小队直连架构有上述边界。