PHP:游戏循环(线程或排序)

PHP:游戏循环(线程或排序),php,multithreading,sockets,game-loop,Php,Multithreading,Sockets,Game Loop,我正在编写PHP代码作为一个游戏客户端。它使用插座;创建套接字,然后连接套接字,然后读取套接字。它工作正常,但问题是服务器可以随时发送数据包,这意味着套接字读取需要在“游戏循环”中不断发生。比如说: <?php $reply = ""; do { $recv = ""; $recv = socket_read($socket, '1400'); if($recv != "") { $reply .= $recv; }

我正在编写PHP代码作为一个游戏客户端。它使用插座;创建套接字,然后连接套接字,然后读取套接字。它工作正常,但问题是服务器可以随时发送数据包,这意味着套接字读取需要在“游戏循环”中不断发生。比如说:

<?php 
$reply = ""; 
do { 
     $recv = ""; 
     $recv = socket_read($socket, '1400'); 
     if($recv != "") { 
         $reply .= $recv; 
     } 
} while($recv != ""); 

echo($reply); 
?>

不起作用,因为它卡在循环中(服务器在客户端退出游戏之前不会终止连接),PHP代码需要处理数据包


所以PHP实际上没有线程。处理这个问题的最好方法是什么?

PHP没有多线程,所以你应该考虑使用更合适的语言(如评论中提到的安德烈)。

PHP没有多线程,所以你应该考虑使用更合适的语言(如安德烈在其注释中提到的)。但我同意@Andrey和@DampeS8N,这不是最好的选择。如果你下定决心要这么做,请看这本书:

可以做到,但我同意@Andrey和@DampeS8N,这不是最好的选择。如果你下定决心要做这件事,请阅读这本书:

如果你真的想做这件事,你必须睡一段时间,检查插座,再次睡眠,检查插座

要在不阻塞的情况下检查套接字,您需要使用非阻塞I/O,这可以通过或具有DONTWAIT标志来实现。

如果您确实想这样做,您必须睡眠一段时间,检查套接字,再次睡眠,检查套接字


要在不阻塞的情况下检查套接字,您需要使用非阻塞I/O,这可以通过或具有DONTWAIT标志来实现。

基本上,任何软件平台都会遇到这个问题。正如您所了解的,大多数问题都是通过线程来解决的。而线程在PHP中是可能的。它需要MAJORHAXXX。例如从php内部启动命令行php线程

这并不是理想的结局

然而,还有其他方法可以解决这个问题

但您需要首先检查此列表上的所有标记:

[]-我的游戏不需要经常检查服务器,例如玩家位置或复杂的移动。任何超出聊天室级别的数据传输和更新速率都应保持此框未选中

[]-我的游戏不需要服务器告诉我任何事情。客户要求任何需要的东西都是完全可以接受的,也许是每秒一次,或者最好是每分钟一次

[]-我的游戏不需要在服务器上持续模拟复杂世界的时间超过完成请求所需的时间。跟踪聊天是一回事,做物理和图形修改是另一回事

如果您选中了所有这些框,那么PHP仍然在游戏中!否则。不用麻烦了

基本上,我在这里说的是,PHP对于那些不是真正的多人游戏、基于回合或至少不是很互动的游戏来说是非常棒的。但是一旦你不得不在没有播放器的情况下继续工作,PHP就会失败

伏都教水平

但如果你必须这么做。有很多方法可以绕过它

A-创建一个运行您的世界的PHP守护进程,将所有其他流量通过管道传输到与数据库交互的getter或setter请求文件。因此,您可以请求获取游戏世界状态,或者设置玩家执行的值。所有其他与游戏世界相关的事情都可以由守护进程处理,游戏本身在数据库中进行

B-使用cron,而不是守护进程。(危险,但我们已经确定你是一个冒险者,对吗?)


C-只尝试一个守护进程并侦听套接字,然后发送线程(通过exec()进行响应)。有点像上面AndreKR的想法,只是你不需要睡觉。这里的问题是,你们几乎总是会丢失东西,或者被切断。如果守护进程以某种方式运行两次,整个问题可能会爆发。

基本上,任何软件平台都会遇到这个问题。正如您所了解的,大多数问题都是通过线程来解决的。而线程在PHP中是可能的。它需要MAJORHAXXX。例如从php内部启动命令行php线程

这并不是理想的结局

然而,还有其他方法可以解决这个问题

但您需要首先检查此列表上的所有标记:

[]-我的游戏不需要经常检查服务器,例如玩家位置或复杂的移动。任何超出聊天室级别的数据传输和更新速率都应保持此框未选中

[]-我的游戏不需要服务器告诉我任何事情。客户要求任何需要的东西都是完全可以接受的,也许是每秒一次,或者最好是每分钟一次

[]-我的游戏不需要在服务器上持续模拟复杂世界的时间超过完成请求所需的时间。跟踪聊天是一回事,做物理和图形修改是另一回事

如果您选中了所有这些框,那么PHP仍然在游戏中!否则。不用麻烦了

基本上,我在这里说的是,PHP对于那些不是真正的多人游戏、基于回合或至少不是很互动的游戏来说是非常棒的。但是一旦你不得不在没有播放器的情况下继续工作,PHP就会失败

伏都教水平

但如果你必须这么做。有很多方法可以绕过它

A-创建一个运行您的世界的PHP守护进程,将所有其他流量通过管道传输到与数据库交互的getter或setter请求文件。因此,您可以请求获取游戏世界状态,或者设置玩家执行的值。所有其他与游戏世界相关的事情都可以由守护进程处理,游戏本身在数据库中进行

B-使用cron,而不是守护进程。(危险,但我们已经确定你是一个冒险者,对吗?)

C-只尝试一个守护进程和li
while (connected) {
    while (messages in buffer < 1) {
        read from socket;
        add to buffer;
    }

    while (messages in buffer > 0) {
        extract message from buffer;
        process message;
    }
}