gpt4 book ai didi

PHP 套接字服务器占用大量 CPU 资源

转载 作者:行者123 更新时间:2023-12-03 11:56:54 24 4
gpt4 key购买 nike

我按照一些教程 (1) , (2)在互联网上创建一个 PHP 套接字服务器,它工作得很好。唯一的问题是我的 PHP 脚本占用了大量的 CPU 使用率(99%)。

我这里不展示代码,因为我的代码和上面的教程差不多。

主要 Action 写在不定式循环中

而(真)
{
$this->selectChangedSockets();
$this->handleNewClients();
$this->receiveInput();
$this->checkDisconnections();
}

my 循环中的函数只是处理输入(新客户端的连接、客户端的消息等)和处理输出(发送回客户端的消息等)

我的 php 脚本在 CPU 使用率(99%)上总是位居榜首。我读了this ,他们建议将“sleep(1)”放在循环中。我的套接字服务器用于实时应用程序,我不确定这是一个好方法吗?

任何有 php socket 经验的人都可以给我任何建议吗?

是否有任何标准的 php 套接字服务器库?
还是我需要在后台运行脚本?

更新

因为您提到函数 socket_select 可能会暂停一点,所以我给您我的代码:

私有(private)函数 selectChangedSockets()
{
//重置已更改套接字的数组
$this->changed = array_merge(array($this->socket), $this->clients);

$空=空;
$res = socket_select($this->changed, $null, $null, 0);
如果(假 === $res)
{
echo "socket_select() 失败,原因:"。
socket_strerror(socket_last_error()) 。 "\n";
}
}

公共(public)函数运行()
{
而(真){

$this->selectChangedSockets();
//$this->handleNewClients();
//$this->receiveInput();
//$this->checkDisconnections();
}
}

我的 PHP 脚本仍然占用 99% 的 CPU 使用率。

最佳答案

您的 selectChangedSockets方法应该是阻塞的,意思是在套接字发生变化之前不返回。见 socket_select .

一个 while ( true ) {}将使用 100% 的 CPU 时间。您将需要某种延迟。
由于您可以使用socket_select ,您可以在此处指定超时,使用 0% CPU 时间,直到实际上有一些工作要完成:

function selectChangedSockets() {
$read = array($socket1, $socket2); // array of your sockets
$write = NULL;
$except = NULL;
$num_changed_sockets = socket_select($read, $write, $except, NULL);
}

这将等到 $read 中的一个套接字有可用的数据。对于服务器套接字,当客户端建立新连接时会发生这种情况。对于连接的套接字,这发生在客户端发送数据时。

再次,参见 socket_select 有关详细信息和示例。尤其是第一个用户贡献的注释,它使用了 while (true) ,处理新连接,并从客户端读取数据。

但是请注意,在 socket_select 页面中,关于第 4 个参数:

tv_sec may be zero , causing socket_select() to return immediately. This is useful for polling. If tv_sec is NULL (no timeout), socket_select() can block indefinitely.

关于PHP 套接字服务器占用大量 CPU 资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33806995/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com