Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
Workerman中你不得不知道的属性reusePort_创想鸟

Workerman中你不得不知道的属性reusePort

workerman是一款纯php开发的开源高性能的异步php socket框架。支持tcp长连接,支持websocket、mqtt等诸多协议。今天我们来介绍一下workerman中的reuseport属性,有需要的可以参考参考。

Workerman中你不得不知道的属性reusePort

Workerman是一个高性能的PHP Socket服务器框架。可以用 Workerman 直接在 TCP 层编程,基本的编程套路是:

$w = new WorkermanWorker('tcp://0.0.0.0:80');$w->count = 4;$w->onMessage = function(WorkermanCOnnectionTcpConnection $connection, array $data) {    $connection->send('Hello World');};Worker::runAll();

在使用的过程中,不知道你是否留意过 reusePort 这个参数,他默认被设置为 false。这个参数有什么用?什么情况下我们需要把他设置为 true,从而提高性能呢?

1. reuseport 的作用

关于 reusePort 参数,Workerman官方的文档是这么解释的:

开启监听端口复用后允许多个无亲缘关系的进程监听相同的端口,并且由系统内核做负载均衡,决定将socket连接交给哪个进程处理,避免了惊群效应,可以提升多进程短连接应用的性能。

如果没有深入研究过 Linux 网络编程,很难理解这句话。在此简单解释一下:

服务端程序通常通过监听服务器上的某个端口号,来接收客户端的请求。在Linux中,服务器网卡 + 端口号被抽象成了一个 Socket 。

为了提升性能,一般的服务端程序在运行时都有多个进程(俗称 Worker)监听同一个 Socket,在没有客户端连接到来的时候,这些Worker是处于挂起状态的,不消耗CPU资源。

如果某一刻有一个客户端连接到来,Linux 内核就会同时唤醒这些 Worker,让他们竞争去处理这个连接,

结果只有一个 Worker 可以获得处理这个连接的机会,其他Worker在竞争失败后继续回到挂起状态。唤醒 Worker 的过程是要消耗CPU资源的,Worker 数量越多,消耗的 CPU 资源就越多,造成了资源的浪费。这就是常说的 惊群效应。

你也许会问:为什么不每次只唤醒一个Worker呢?很遗憾,Linux内核并没有这样的功能。

幸好,在 Linux 3.9 及以后的版本,加入 reuseport 特性。这个特性有什么用呢?

在有 reuseport 之前,一个端口号只能被一个 Socket 监听,有了 reuseport 之后,这个限制就被打破了:一个端口号可以被多个 Socket 同时监听。

前面说到,Linux 内核没法做到一次只唤醒一个 Worker,但是,内核可以做到将客户端连接均匀地发送到监听统一端口的一群 Socket 上。

如图所示,每个 Worker 都有自己的 Socket,都监听同一个端口。当有客户端连接到来时,内核转发连接到一个 Socket 上,而这个 Socket 只会唤醒自己隶属的那个 Worker。这样就很巧妙地解决了 惊群效应,提高了整体的性能。

由此,我们可以得出结论:如果你的 Linux 内核版本是 3.9 及以上的话,那么在使用 Workerman 时,可以将 reusePort 设置为 true 提升程序运行效率。

2. Workerman 如何利用 reuseport

虽然你只要在 Workerman 中把 reusePort 设置为 true,就能享受到 Linux 的这个高级特性。但 Workerman 的源码中,并不只是开启一个内核参数那么简单。Workerman 为你隐藏了许多的设计细节,我们来研究下。

Worker 类是 Workerman 里最主要的类,其中有个 listen() 函数:

protected function listen(){    ...    if (!$this->_mainSocket) {        ...        $this->_mainSocket = stream_socket_server(...);        ...    }    ...}

listen() 函数的作用就是在当前进程创建一个 Socket 并开始监听请求。

当 reusePort 为 false 时,主进程在创建 Worker 之前就调用了 listen() 函数:

protected function initWorkers() {    ....    if (!$worker->reusePort) {        $worker->listen();    }    ....}

随后主进程通过 pcntl_fork() 创建 Worker。pcntl_fork() 有个特性:创建出来的子进程(Worker)中的变量都是父进程复制而来的,包括父进程创建的 mainSocket。所以,当reusePort为∗∗false∗∗时,所有的Worker都复制父进程的mainSocket。所以,当reusePort为∗∗false∗∗时,所有的Worker都复制父进程的_mainSocket,也即共用一个 Socket。

而当 reusePort 为 true 时,情况就不同了。主进程在创建 Worker 前不会调用 listen(),而是在创建完 Worker 后由每个 Worker 自行发起 listen() 调用:

protected static function forkOneWorkerForLinux($worker) {    ...    $pid = pcntl_fork();    if ($pid === 0) {        if ($worker->reusePort) {            $worker->listen();        }        ...    }    ...}

这样的结果就是,每个子进程(Worker)都创建了自己的 Socket。

最后还有一点,如果想要内核开启 reuseport 功能,需要手动设置 Socket 的 context:

if ($this->reusePort) {    $context = stream_context_create();    stream_context_set_option($context, 'socket', 'so_reuseport', 1);}

推荐学习:php视频教程

以上就是Workerman中你不得不知道的属性reusePort的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/75685.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
产品经理的用途有哪些呢
上一篇 2025年11月14日 11:33:13
晨鸣集团产品经理有哪些
下一篇 2025年11月14日 11:33:26

相关推荐

  • Workerman服务启动失败的排查步骤

    workerman服务启动失败的排查步骤如下:1. 检查配置文件,确保无语法错误;2. 查看系统日志,寻找错误线索;3. 检查端口占用情况,确保端口未被占用;4. 调整文件权限,确保workerman有足够权限;5. 检查php环境,确保版本兼容且扩展已安装。 关于Workerman服务启动失败的排…

    2026年9月21日
    200
  • Workerman与WebAssembly(Wasm)的交互实践

    workerman和wasm结合使用是为了在高性能服务器环境中引入wasm的沙箱化和跨平台能力,实现更灵活、安全和高效的服务端应用。1) wasm模块的编译与加载:使用编译工具链将wasm模块编译成二进制文件并在workerman中加载。2) wasm模块的调用:通过php扩展或外部程序(如exec…

    2026年9月20日
    000
  • Docker容器化部署Workerman

    使用docker容器化workerman可以提高部署效率和资源利用率。1. 创建dockerfile,定义镜像构建过程。2. 编写workerman工作脚本。3. 使用docker网络功能配置外部访问。4. 通过docker的健康检查和重启策略管理进程。5. 优化性能,调整workerman进程数和…

    2026年9月20日
    000
  • 在Workerman中使用Composer依赖库

    在workerman中可以使用composer依赖库来扩展应用功能,但需要考虑异步编程特性。1. 创建composer.json文件并指定所需库,如monolog。2. 运行composer install命令安装库。3. 在worker进程中初始化和使用库,如monolog记录日志。4. 评估库的…

    2026年9月20日
    000
  • Workerman怎么处理业务逻辑?Workerman中间件使用方法?

    Workerman通过事件回调处理业务逻辑,中间件则用于优雅地拦截和处理请求。在请求处理流程中,中间件按注册顺序依次执行,形成处理链条,每个中间件可对请求进行验证、记录日志或拦截,例如权限验证未通过时直接返回401响应,阻止后续执行。中间件通过请求对象传递数据,如在前置中间件中注入用户信息,后续中间…

    2026年9月11日
    100
  • Workerman怎么进行性能监控?Workerman监控面板使用?

    Workerman性能监控可通过自带监控页面、Prometheus+Grafana等工具实现,重点关注CPU、内存、请求时间等指标,结合状态页面和第三方方案可有效分析性能与排查内存泄漏。 Workerman的性能监控,简单来说,可以通过一些工具和方法来实时了解你的应用运行状态,比如CPU占用、内存使…

    2026年9月11日
    200
  • Workerman如何监控状态?Workerman状态查看命令?

    Workerman的运行状态可通过自带的status命令查看,执行php your_start_file.php status可获取各Worker进程的连接数、内存占用、请求量等关键指标,是运维服务的核心工具。 Workerman的核心运行状态,我们通常是通过它自带的 status 命令来快速了解的…

    2026年9月11日
    000
  • Workerman如何监控性能?Workerman性能指标查看?

    要监控%ignore_a_1%性能,需结合系统工具、内置status命令和专业监控系统。首先通过top、htop查看CPU和内存使用,free -h检查内存,netstat分析连接状态;重点关注TIME_WAIT等异常。利用php your_start.php status获取各子进程PID、连接数…

    2026年9月11日
    200
  • Workerman怎么进行资源隔离?Workerman资源限制设置?

    Workerman通过多进程模型实现操作系统级资源隔离,每个Worker进程独立运行,互不影响,主进程可监控并重启异常进程以保障服务稳定。为防止资源滥用,可通过PHP的memory_limit限制单个进程内存,结合Worker::$max_request参数定期重启进程以释放内存;CPU资源则依赖操…

    2026年9月11日
    100
  • Workerman怎么进行代码调试?Workerman断点调试技巧?

    Workerman调试需结合日志、变量输出和Xdebug断点。日志可用Worker::log()或重定向输出;多进程调试建议设$worker->count=1或结合xdebug_break()与PID条件触发;推荐辅以Monolog日志体系、单元测试、服务监控和代码审查提升效率。 Worker…

    2026年9月11日
    100
  • Workerman怎么进行连接池管理?Workerman数据库连接池?

    Workerman通过每个Worker进程在启动时建立并复用单一数据库连接,利用进程隔离实现连接持久化,避免频繁创建销毁带来的性能损耗与数据库压力。该模式在onWorkerStart中初始化连接,存储于进程全局变量供后续请求复用,从而提升性能。为应对连接断开,推荐采用惰性重连策略:执行SQL失败后判…

    2026年9月11日
    300
  • Workerman如何实现服务降级?Workerman容错处理机制?

    Workerman通过超时控制、限流、熔断、多进程隔离、异步非阻塞I/O、消息队列解耦及异常捕获等机制实现服务降级与容错,核心在于提前应对依赖不稳定和高并发压力。 Workerman实现服务降级,核心在于在业务逻辑中植入各种“安全网”,例如熔断、限流和超时控制,以应对外部依赖服务不可用或自身负载过高…

    2026年9月11日
    200
  • Workerman支持哪些操作系统?WorkermanWindows能用吗?

    Workerman在Linux下性能最优,支持epoll、多进程和信号处理,适合高并发生产环境;Windows虽可运行,但使用select机制,性能受限,主要用于开发调试。 Workerman主要设计用于Linux环境,但在Windows上也能运行,不过功能和性能会受到限制。简单来说,Linux是它…

    2026年9月11日
    200
  • Workerman怎么进行单元测试?Workerman测试用例编写?

    Workerman单元测试需解耦业务逻辑与框架,通过模拟TcpConnection、Worker等组件,利用PHPUnit进行独立测试,解决持久化状态、异步事件和网络I/O带来的挑战,确保测试的高效与可维护性。 Workerman进行单元测试,核心在于将其业务逻辑与框架本身解耦,并利用PHPUnit…

    2026年9月11日
    100
  • Workerman如何记录日志?Workerman日志文件位置?

    Workerman日志通过Worker::$logFile配置,建议明确指定路径并确保写入权限,避免默认/tmp目录;应用日志应使用error_log或Monolog等专业库分离记录;需通过logrotate实现日志轮转,防止文件过大,生产环境推荐结合Monolog与集中式日志系统提升管理效率。 W…

    2026年9月11日
    200
  • Workerman怎么进行链路追踪?Workerman分布式追踪?

    链路追踪需为请求分配唯一Trace ID并跨服务传递,Workerman因长连接特性需通过自定义协议或上下文管理传递ID,可选用SkyWalking等现成库或手动实现,结合采样与异步上报降低性能影响。 链路追踪,简单来说,就是搞清楚一个请求在你的分布式系统里都经历了哪些服务,每个服务花了多少时间。对…

    2026年9月10日
    100
  • Swoole的onWorkerError事件在什么情况下触发

    onWorkerError事件在Swoole工作进程发生致命错误时触发,用于捕获PHP致命错误、内存耗尽、段错误等导致进程异常终止的情况。1. 触发条件包括PHP致命错误(如调用未定义函数)、内存超限崩溃、C层代码引发的段错误、子进程非正常退出及协程中未被捕获的致命异常。2. 使用场景主要为记录日志…

    2026年9月9日
    100
  • Swoole如何实现一个简单的MQTT服务器

    Swoole可通过TCP服务器实现MQTT协议解析,核心包括处理CONNECT、PUBLISH、SUBSCRIBE等报文,管理客户端订阅关系与消息转发,需手动解析变长头部与主题长度,支持PINGREQ心跳与连接状态维护,配合mosquitto工具测试基础通信,适用于轻量级物联网场景,但生产环境需扩展…

    2026年9月9日
    000
  • Workerman开发指南:构建高效的实时聊天应用

    workerman开发指南:构建高效的实时聊天应用 引言:随着网络技术的发展和智能手机的普及,实时聊天应用在我们的日常生活中变得越来越重要。在构建高效的实时聊天应用时,选择一个合适的框架是至关重要的。Workerman是一个优秀的PHP框架,可以帮助我们快速构建高效的实时聊天应用。本文将介绍如何使用…

    用户投稿 2026年9月5日
    000
  • Workerman网络通信探秘:实现分布式任务调度系统

    Workerman网络通信探秘:实现分布式任务调度系统 引言:随着互联网的迅猛发展,分布式系统成为了解决大规模任务处理的重要手段。在今天的文章中,我们将会深入探讨一种利用Workerman网络通信框架来实现分布式任务调度系统的方法。通过代码示例,我们将一步步引导读者了解Workerman的基本原理和…

    2026年9月5日
    400

发表回复

登录后才能评论
关注微信