【发布时间】:2016-02-21 18:41:22
【问题描述】:
我按照互联网上的一些教程(1)、(2) 创建了一个 PHP 套接字服务器,并且效果很好。唯一的问题是我的 PHP 脚本占用了大量的 CPU 使用率 (99%)。
这里不展示代码,因为我的代码和上面的教程差不多。
主要动作写在不定式循环中
而(真) { $this->selectChangedSockets(); $this->handleNewClients(); $this->receiveInput(); $this->checkDisconnections(); }my循环中的函数只是处理输入(新客户端的连接、客户端的消息等)和处理输出(发回客户端的消息等)
我的 php 脚本在 CPU 使用率方面始终处于领先地位 (99%)。我读了this,他们建议将“sleep(1)”放在循环中。我的套接字服务器用于实时应用程序,我不确定这是一个好方法吗?
任何有php socket经验的人可以给我任何建议吗?
是否有任何标准的 php 套接字服务器库? 还是我需要在后台运行脚本?
更新
因为你提到函数socket_select可能会暂停一点,我给你我的代码:
私有函数 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"; } } 公共函数运行() { 而(真){ $this->selectChangedSockets(); //$this->handleNewClients(); //$this->receiveInput(); //$this->checkDisconnections(); } }我的 PHP 脚本仍然占用 99% 的 CPU 使用率。
【问题讨论】:
-
我建议不要使用无限循环,它们会占用大量内存、停止页面加载等,通常是要避免做的事情......
-
那么,你会建议我做什么?
-
在 cron 中运行您的代码,尝试查看 this 之类的内容(但没有循环)
-
所以,每一秒,我都需要重新创建所有东西(socket 连接、mysql 连接、所有变量)?我认为这不是一个好方法。
-
那为什么不创建一个mysql实例呢?即,
$link = mysqli_init(); $link->real_connect("localhost", "dbUsername", "dbPassword", "dbName");或者套接字是固定的必需品?