【实践】高性能PHP应用容器workerman快速入门

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: workerman是一款开源高性能PHP应用容器,它大大突破了传统PHP应用范围,被广泛的用于互联网、即时通讯、APP开发、硬件通讯、智能家居、物联网等领域的开发。他是纯php实现的,跟swoole不一样,Swoole 是一个使用 C++ 语言编写的基于异步事件驱动和协程的并行网络通信引擎,对比来看workerman对PHPer更加友好,入门门槛更低,而且跨平台性更好,和已有的项目的对接更简单,更快速。因为它本身是PHP编写的,所以只要服务器支持php运行几乎就可以支持workerman的使用,无需更换运行环境或者对代码或者框架进行大幅的修改。集成到常见的框架比如thinkphp、larave

前言

workerman--极简、稳定、高性能、分布式


workerman是什么


workerman是一款开源高性能PHP应用容器,它大大突破了传统PHP应用范围,被广泛的用于互联网、即时通讯、APP开发、硬件通讯、智能家居、物联网等领域的开发。他是纯php实现的,跟swoole不一样,Swoole 是一个使用 C++ 语言编写的基于异步事件驱动和协程的并行网络通信引擎,对比来看workerman对PHPer更加友好,入门门槛更低,而且跨平台性更好,和已有的项目的对接更简单,更快速。因为它本身是PHP编写的,所以只要服务器支持php运行几乎就可以支持workerman的使用,无需更换运行环境或者对代码或者框架进行大幅的修改。集成到常见的框架比如thinkphp、laravel也很简单,兼容性好,特别是当服务器使用windows系统环境的时候swoole的支持不是很友好,这时候workerman就更显优势。不过事物都有两面性,有优点肯定也有缺点,最明显的就是workerman没有swoole强大,毕竟workerman是PHP实现的至少在运行效率上swoole略胜一筹。除了性能,在高并发上swoole也有较大的优势。


Workerman不是重复造轮子,它不是一个MVC框架,而是一个更底层更通用的服务框架,你可以用它开发tcp代理、梯子代理、做游戏服务器、邮件服务器、ftp服务器、甚至开发一个php版本的redis、php版本的数据库、php版本的nginx、php版本的php-fpm等等。Workerman可以说是PHP领域的一次创新,让开发者彻底摆脱了PHP只能做WEB的束缚。

实际上Workerman类似一个PHP版本的nginx,核心也是多进程+Epoll+非阻塞IO。Workerman每个进程能维持上万并发连接。由于本身常驻内存,不依赖Apache、nginx、php-fpm这些容器,拥有超高的性能。同时支持TCP、UDP、UNIXSOCKET,支持长连接,支持Websocket、HTTP、WSS、HTTPS等通讯协议以及各种自定义协议。拥有定时器、异步socket客户端、异步Redis、异步Http、异步消息队列等众多高性能组件。


为什么选择workerman

不管使用任何框架,都不会达到最完美的,因为世界本就没有完美的东西。而是要根据自己的需求,有所取舍地去选择合适的框架或者架构,就比如:我们现在要做一个小网站,流量很小,如果我们不做分析,一开始直接就选择分布式架构,考虑高并发,高可用,高性能等三高方案全部考虑进去,对于小网站来说,无非就是入不敷出,付出远远大于回报,完全是一种浪费大量成本,吃力不讨好的操作。所以这时候先选择单机架构,预留扩展的空间即可,等流量起来了再一步一步扩展架构,而不是想着一步到位。因此,选择合适的更重要,不但能解决问题还能节约成本,最重要的是选择从简单架构开始,更容易实现,更快速上线,对应快速占领市场很有优势,如果选择复杂的架构,可能还没上线风都停了。workerman有以下优势:


1.性能提升

基于常驻内存、epoll高性能事件循环库、高性能协议解析,workerman可将基于php-fpm的架构应用性能提升十倍甚至近百倍


2.稳定性

经过多年的不断打磨及完善,workerman早已具备企业级的稳定性,已经被众多公司用在生产环境上


3.兼容性

兼容现有composer生态。即将推出的workerman v5版本将支持PHP自带的Fiber协程以及Swoole、ReactPHP、AmPHP等协程库


4.易用性

少既是多,workerman只提供必要的功能接口,在保证workerman简约的同时,你会发现它使用真的很简单


5.应用场景广泛

Workerman不同于传统MVC框架,Workerman不仅可以用于Web开发,同时还有更广阔的应用领域,例如即时通讯类、物联网、游戏、服务治理、其它服务器或者中间件

我们上面简单对比了workerman和swoole的优缺点.简单分析了我们为什么选择workerman.接下来我们看看worker怎么使用.


安装

workerman从3.5.3版本开始同时支持linux系统和windows系统,不再区分linux版本和windows版本

环境准备

需要PHP>=5.4,并配置好PHP的环境变量,最新版本的workerman需要PHP>=7.0

本文的环境以PHP7.2为主

配置环境变量:

workerman在windows和linux的区别参考:https://www.workerman.net/windows


workerman的在Windows下与Linux下区别

1、win版本单个进程只支持200+个连接

2、win版本count属性无效,全部为单进程

3、不支持start stop reload restart status命令

4、cmd命令行启动,后面可接多个文件,例如 php start_web.php start_gateway.php start_worker.php

5、无法守护进程,cmd窗口关掉后服务即停止

6、每个启动文件只能实例化一个容器(Worker/WebServer/Gateway/BusinessWorker),需要实例化多个容器时需要拆成多个文件,例如 start_web.php start_gateway.php start_worker.php 分别初始化web gateway worker


Windows版本workerman的启动与停止


cmd命令行中运行 php your_file.php(注意后面可以接多个文件)注意windows版本没有stop、reload、restart、status命令,启动时直接运行 php 文件.php 即可,停止运行按ctrl+c

安装很简单,除了php的环境配置,跟其他的php第三方库的安装一样简单.只需要通过composer命令安装即可,或者下载源码放到项目中就可使用

项目源码地址:https://gitee.com/walkor/workerman

composer:https://www.phpcomposer.com(不熟悉composer的童鞋可以点击链接跳转了解)


composer安装命令如下:

composer require workerman/workerman

日常生产的流程主要分以下三种情况:


流程一:新项目流程 创建 composer.json,并添加依赖到的扩展包; 运行 composer install,安装扩展包并生成 composer.lock; 提交 composer.lock 到代码版本控制器中,如:git


流程二:项目协作者安装现有项目 克隆项目后,根目录下直接运行 composer install 从 composer.lock 中安装 指定版本 的扩展包以及其依赖

此流程适用于生产环境代码的部署。


流程三:为项目添加新扩展包

使用 composer require vendor/package 添加扩展包; 提交更新后的 composer.json 和 composer.lock 到代码版本控制器中,如:git

composer install - 如有 composer.lock 文件,直接安装,否则从 composer.json 安装最新扩展包和依赖

  • composer update - 从 composer.json 安装最新扩展包和依赖
  • composer update vendor/package - 从 composer.json 或者对应包的配置,并更新到最新
  • composer require new/package - 添加安装 new/package, 可以指定版本,如: composer require new/package ~2.7


安装步骤:

  1. 新建项目文件夹wmtest
    网络异常,图片无法展示
    |
  2. 进入项目根目录
  3. 初始化项目
  4. 执行上面的命令或者composer init


新建的文件还是空的:

网络异常,图片无法展示
|


方法1:


我们这个是新项目执行composer init对项目进行初始化,执行操作如下图:

网络异常,图片无法展示
|


一直下一步等待安装完成即可

网络异常,图片无法展示
|


方法2:

进入项目目录执行composer require workerman/workerman

执行过程如下:

网络异常,图片无法展示
|


安装完成之后项目目录会增加三个文件,如下图

网络异常,图片无法展示
|


vendor就是composer安装所有依赖的文件夹.现在里面有我们刚安装的workerman依赖:

网络异常,图片无法展示
|

从composer.json的内容中也可以看到安装了哪些依赖

网络异常,图片无法展示
|

从上图可以看出,我们只安装了workerman4.0的依赖

安装完接下来就是使用了


workerman的简单使用


WorkerMan开发与普通PHP开发的不同之处


  • 普通PHP开发一般是基于HTTP应用层协议,WebServer已经帮开发者完成了协议的解析
  • WorkerMan支持各种协议,目前内置了HTTP、WebSocket等协议。WorkerMan推荐开发者使用更简单的自定义协议通讯
  • PHP在Web应用中一次请求过后会释放所有的变量与资源
  • WorkerMan开发的应用程序在第一次载入解析后便常驻内存,使得类的定义、全局对象、类的静态成员不会释放,便于后续重复利用
  • 由于WorkerMan会缓存编译后的PHP文件,所以要避免多次require/include相同的类或者常量的定义文件。建议使用require_once/include_once加载文件。
  • 由于WorkerMan是常驻内存的,php类即函数的定义加载一次后便常驻内存,不会再次读取磁盘加载,所以每次修改完业务代码需要重启才能生效。
  • WorkerMan运行在PHP命令行模式下,当调用exit、die退出语句时,会导致当前进程退出。虽然子进程退出后会立刻重新创建一个的相同的子进程继续服务,但是还是可能对业务产生影响。
  • 由于WorkerMan不会在每次请求后释放全局对象及类的静态成员,在数据库等单例模式中,往往会将数据库实例(内部包含了一个数据库socket连接)保存在数据库静态成员中,使得WorkerMan在进程生命周期内都复用这个数据库socket连接。需要注意的是当数据库服务器发现某个连接在一定时间内没有活动后可能会主动关闭socket连接,这时再次使用这个数据库实例时会报错,(错误信息类似mysql gone away)。WorkerMan提供了数据库类,有断开重连的功能,开发者可以直接使用。


注意事项:有必要注意下代码是运行在主进程还是子进程,一般来说在Worker::runAll();调用前运行的代码都是在主进程运行的,onXXX回调运行的代码都属于子进程。注意写在Worker::runAll();后面的代码永远不会被执行

下面我们使用workerman编写一些简单的例子


利用workerman实现Http server


文件:test.php

<?phpuseWorkerman\Worker;
useWorkerman\Connection\TcpConnection;
useWorkerman\Protocols\Http\Request;
require_once__DIR__ . '/vendor/autoload.php';
// 创建一个Worker监听2345端口,使用http协议通讯$http_worker=newWorker("http://0.0.0.0:2345");
// 启动4个进程对外提供服务$http_worker->count=4;
// 接收到浏览器发送的数据时回复hello world给浏览器$http_worker->onMessage=function(TcpConnection$connection, Request$request)
{
// 向浏览器发送hello world$connection->send('你好,欢迎使用workerman~');
};
// 运行workerWorker::runAll();


打开命令行,执行以下命令然后访问http://127.0.0.1:2345/

php test.php start

执行效果如下:

网络异常,图片无法展示
|


网络异常,图片无法展示
|


利用workerman实现WebSocket


文件:ws_test.php

<?phpuseWorkerman\Worker;
useWorkerman\Connection\TcpConnection;
require_once__DIR__ . '/vendor/autoload.php';
// 注意:这里与上个例子不同,使用的是websocket协议$ws_worker=newWorker("websocket://0.0.0.0:2000");
// 启动4个进程对外提供服务$ws_worker->count=4;
// 当收到客户端发来的数据后返回hello $data给客户端$ws_worker->onMessage=function(TcpConnection$connection, $data)
{
// 向客户端发送hello $data$connection->send('你好,欢迎你找我聊天哦! ' . $data);
};
// 运行workerWorker::runAll();

通过前端进行请求.创建testws.html

<html><head><title>测试Websocket</title><style>body { margin: 0; } canvas { width: 100%; height: 100% } </style></head><body><script>ws=newWebSocket("ws://127.0.0.1:2000");
ws.onopen=function() {
console.log("连接成功");
ws.send('李白');
console.log("给服务端发送一个字符串:你好!我来了");
  };
ws.onmessage=function(e) {
console.log("收到服务端的消息:"+e.data);
  };
</script></body></html>


执行结果:

网络异常,图片无法展示
|

前端返回结果:

网络异常,图片无法展示
|


利用workerman实现直接使用TCP传输数据


文件:tcp_test.php

<?phpuseWorkerman\Worker;
useWorkerman\Connection\TcpConnection;
require_once__DIR__ . '/vendor/autoload.php';
// 创建一个Worker监听2347端口,不使用任何应用层协议$tcp_worker=newWorker("tcp://0.0.0.0:2347");
// 启动4个进程对外提供服务$tcp_worker->count=4;
// 当客户端发来数据时$tcp_worker->onMessage=function(TcpConnection$connection, $data)
{
// 向客户端发送hello $data$connection->send('你好,数据传输成功' . $data);
};
// 运行workerWorker::runAll();


执行结果:

启动tcp服务

网络异常,图片无法展示
|

测试tcp服务

telnet127.0.0.1 2347


执行结果:

网络异常,图片无法展示
|


这里只是利用简单的例子抛转引玉,workman还有更多更好玩,更强大的用法等你探索.需要掌握workerman支持的各种通讯协议的用法.workerman目前已经支持HTTP、websocket、text协议、frame协议,ws协议,需要基于这些协议通讯时可以直接使用,使用方法为:在初始化Worker时指定协议,比如使用$tcp_worker = new Worker("tcp://0.0.0.0:2347");创建tcp服务.当workerman自带的通讯协议满足不了开发需求时,还可以可以根据需求定制自己的通讯协议.所以要想玩好workerman一定要熟悉掌握各种通讯协议的使用

目录
相关文章
|
24天前
|
PHP 开发者 UED
PHP中的异常处理:理解与应用
在编程的世界中,错误和异常就像是不请自来的客人——总是在你最不希望它们出现的时候敲门。对于PHP开发者来说,学会优雅地处理这些“不速之客”是提升代码质量和用户体验的关键。本文将带你深入理解PHP中的异常处理机制,通过实际的代码示例,展示如何捕获、处理以及自定义异常,让你的应用程序更加健壮和灵活。准备好迎接挑战,让我们共同探索PHP异常处理的奥秘吧!
98 66
|
10天前
|
人工智能 运维 监控
阿里云ACK容器服务生产级可观测体系建设实践
本文整理自2024云栖大会冯诗淳(花名:行疾)的演讲,介绍了阿里云容器服务团队在生产级可观测体系建设方面的实践。冯诗淳详细阐述了容器化架构带来的挑战及解决方案,强调了可观测性对于构建稳健运维体系的重要性。文中提到,阿里云作为亚洲唯一蝉联全球领导者的容器管理平台,其可观测能力在多项关键评测中表现优异,支持AI、容器网络、存储等多个场景的高级容器可观测能力。此外,还介绍了阿里云容器服务在多云管理、成本优化等方面的最新进展,以及即将推出的ACK AI助手2.0,旨在通过智能引擎和专家诊断经验,简化异常数据查找,缩短故障响应时间。
阿里云ACK容器服务生产级可观测体系建设实践
|
10天前
|
人工智能 Cloud Native 调度
阿里云容器服务在AI智算场景的创新与实践
本文源自张凯在2024云栖大会的演讲,介绍了阿里云容器服务在AI智算领域的创新与实践。从2018年推出首个开源GPU容器共享调度方案至今,阿里云容器服务不断推进云原生AI的发展,包括增强GPU可观测性、实现多集群跨地域统一调度、优化大模型推理引擎部署、提供灵活的弹性伸缩策略等,旨在为客户提供高效、低成本的云原生AI解决方案。
|
11天前
|
运维 Kubernetes 调度
阿里云容器服务 ACK One 分布式云容器企业落地实践
阿里云容器服务ACK提供强大的产品能力,支持弹性、调度、可观测、成本治理和安全合规。针对拥有IDC或三方资源的企业,ACK One分布式云容器平台能够有效解决资源管理、多云多集群管理及边缘计算等挑战,实现云上云下统一管理,提升业务效率与稳定性。
|
20天前
|
存储 Prometheus 监控
Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行
本文深入探讨了在Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行。
30 5
|
20天前
|
开发框架 安全 开发者
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。本文探讨了 Docker 在多平台应用构建与部署中的作用,包括环境一致性、依赖管理、快速构建等优势,以及部署流程和注意事项,展示了 Docker 如何简化开发与部署过程,提高效率和可移植性。
49 4
|
22天前
|
编译器 PHP 开发者
PHP 8新特性解析与实战应用####
随着PHP 8的发布,这一经典编程语言迎来了诸多令人瞩目的新特性和性能优化。本文将深入探讨PHP 8中的几个关键新功能,包括命名参数、JIT编译器、新的字符串处理函数以及错误处理改进等。通过实际代码示例,展示如何在现有项目中有效利用这些新特性来提升代码的可读性、维护性和执行效率。无论你是PHP新手还是经验丰富的开发者,本文都将为你提供实用的技术洞察和最佳实践指导。 ####
27 1
|
22天前
|
运维 Kubernetes Docker
深入理解容器化技术及其在微服务架构中的应用
深入理解容器化技术及其在微服务架构中的应用
43 1
|
23天前
|
安全 持续交付 Docker
深入理解并实践容器化技术——Docker 深度解析
深入理解并实践容器化技术——Docker 深度解析
43 2
|
24天前
|
持续交付 开发者 Docker
探索容器化技术Docker及其在现代软件开发中的应用
探索容器化技术Docker及其在现代软件开发中的应用
下一篇
DataWorks