经常报stream_select(): You MUST recompile PHP with a larger value of FD_SETSIZE 错误

freely

服务端我是使用Workerman+GatewayWorker+TP5组合使用。
在TP5的runtime>log下经常收到
截图
这样的错误。
这种会对服务端有影响吗?如何处理呢?

1011 6 0
6个回答

walkor

连接数超过1024要装event扩展

  • freely 2022-08-25

    event扩展有安装了啊,在服务器上使用php -m 查了下,有装event扩展的?然道安装没成功?如何确定event安装成功呢

  • walkor 2022-08-25

    执行php start.php status ,有select字样说明没使用event扩展,有可能是装了没重启。有event字样说明使用了event扩展

  • freely 2022-08-25

    执行了。结果在下面的图片,没看到select字样,有一个event-loop:\Workerman\Events\React\ExtEventLoop

freely

截图
截图
这样看应该是有装成功吧?

  • walkor 2022-08-25

    整个服务一共多少个gateway进程,1000多?

  • freely 2022-08-25

    没。gateway进程才8个左右而以。这个我是根据服务器的CPU核数设置的。

  • freely 2022-08-25

    有两块。一块是websocket,一个是自定义TCP协议的,两个都各8个左右而以。

  • walkor 2022-08-25

    这个没遇到过,看起来是业务进程和gateway建立起了1314个连接,按照你的配置应该最多建立16个连接才对。
    猜测是调用了某个接口,里面包含了大量client_id,这些client_id里的ip和端口信息是过时的或者是错误的。

  • freely 2022-08-26

    这个错,基本上都是在我重启服务端时出现的,我客户端是使用C#写的,现在大概有30-50个左右,客户端如果有连接上后会先触发注册登录操作,登录成功后,就开始大量发送数据给服务端。或与服务端交换数据处理。有比较频繁的操作数据库。不知与此有关否?如果是,如何减少它的压力呢?

  • walkor 2022-08-26

    这个问题没遇到过,不确认和什么有关

freely

这段时间跟踪分析发现,我的这几个问题,全部都是由于这个引起的
我在onconnect,onclose等能找到的相关联的地方都加上日记记录了,发现接收客户端发过来的信息都是正常的。
这个是在接收ping心跳信息时并且是在服务端重启后的刚开始一段时间内就会报这个错。但是过段时间就正常了。
还有这两个在半夜2点左右时接收ping心跳数据时就出错了。

这个调用某个接口包含大量client_id这种的,如何去调试呢?在业务代码上如果增加调试方式?
还是说只能等出这个错时,执行php start.php status去跟踪查看原因?
截图这是心跳的处理,心跳数据是每隔10秒一个,数据内容也不大就一些简单的验证而以。

  • walkor 2022-11-29

    报错里有文件及行数,在那里记录日志,看下报错时stream_select传递的参数是什么,1000多个IP和端口是什么

小W

确定不是因为ExtEventLoop有关?

  • 暂无评论
freely

运行php start.php status后出现几个busy的进程
通过strace -ttp 进程id发现好像是卡在这里
截图

运行lsof -nPp查看出现busy进程的显示
截图
发现好多是连接9200的,这个是我ES服务的
我ES只有插入或更新数据时才用到,是卡在插入这里?但是我看了是插入有成功的。
这个我ES的代码

<?php

namespace app\common\library;

use app\admin\library\Common;
use Elasticsearch\ClientBuilder;
use think\Exception;

class EsUtils{
    protected $dbName;
    protected $tbName;
    protected $client;
    public function __construct($dbName='vbox_wechat_message',$tbName='_doc',$hostUrl=[[
        'host'=>'8.8.8.8',
        'port'=>9200,
        'scheme'=>'http',
        'user'=>'elastic',
        'pass'=>'45454'
    ]])
    {
        //try{
            $this->dbName=$dbName;
            $this->tbName=$tbName;
            $this->client=ClientBuilder::create()->setHosts($hostUrl)->build();
        /*}catch (Exception $ex){
            $r=$ex->getMessage();
            echo json_encode($r);
        }*/
    }

    private function object2array($object){
        if(is_object($object)){
            foreach ($object as $key=>$value){
                $array[$key]=$value;
            }
        }else{
            $array=$object;
        }
        return $array;
    }

    /*
     * 初始化params参数
     * #return array
     * */
    protected function initParams(){
        return [
            'index'=>$this->dbName,         ##索引:数据库
            //'type'=>$this->tbName,          ##类型:数据表,7.0以后不再需要指定此值了,已默认为_doc
        ];
    }

    /*
     * 把数据库里的数据导入ES
     * $param $data
     * */
    public function add($client_id,$data){
        try{
            $params=$this->initParams();
            if(isset($data['id'])){
                $params['id']=$data['id'];
            }
            $params['body']=$data;
            $r=$this->client->index($params);
        }catch (Exception $ex){
            $r=$ex->getMessage();
            Common::logssave([
                '$client_id'=>$$client_id,
                'admin_id'=>0,
                'msg'=>'信息入到ES库里时出错',
                'data'=>json_encode($data),
                'errlogs'=>json_encode($r),
            ]);
        }
        return $r;
    }

    public function edit($client_id,$data){
        try{
            $params=$this->initParams();
            if(isset($data['id'])){
                $params['id']=$data['id'];
                unset($data['id']);
            }
            $params['body']=[
                'doc'=>$data
            ];
            $r=$this->client->update($params);
        }catch (Exception $ex){
            $r=$ex->getMessage();
            Common::logssave([
                'client_id'=>$client_id,
                'admin_id'=>0,
                'msg'=>'修改ES数据时出错了',
                'data'=>json_encode($data),
                'errlogs'=>json_encode($r),
            ]);
        }
        return $r;
    }
}

调用是使用

    public static function savepyqMsg($client_id,$data){
        if($data){
            $data['id']=$data['object_id'];
            $es=new EsUtils('moments');
            $resultData=$es->add($client_id,$data);
        }
    }

    //保存用户留言数据
    public static function savemessage($client_id,$data){
        try {
            if($data){
                $data['id']=$data['msgid'];
                $es=new EsUtils();
                $resultData=$es->add($client_id,$data);
            }
        }catch (Exception $ex){
            print_r('保存聊天数据到ES里出错:'.$ex->getMessage());
            print_r(PHP_EOL);
            Common::logssave([
                'client_id'=>$client_id,
                'admin_id'=>0,
                'msg'=>'保存聊天数据到ES里出错',
                'data'=>json_encode($data,true),
                'errlogs'=>'出错内容:'.$ex->getMessage(),
            ]);
        }
    }

在保存时,也没出现啥错误,都是正常的。

  • 小W 2022-12-03

    是不是client失效了

  • freely 2022-12-03

    没有,还可以使用这个client向客户端发送信息。或收到客户端发过来的信息。

freely

分析了连接信息后,应该是与ES连接,操作ES数据后没有释放导致的。做了修改后,这几天没再出现这问题了。
感谢各位的帮助,谢谢。

年代过于久远,无法发表回答
🔝