이 글에서는 workerman을 소개하고, 워커맨에서 워커 클래스의 사용법에 대해 이야기하겠습니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.
관련 추천: "workerman Tutorial"
Workerman은 오픈 소스 고성능 비동기 PHP 소켓 인스턴트 메시징 프레임워크입니다. 높은 동시성 및 매우 높은 안정성을 지원하며 모바일 앱, 모바일 통신, WeChat 애플릿, 모바일 게임 서버, 온라인 게임, PHP 채팅방, 하드웨어 통신, 스마트 홈, 차량 인터넷, 사물 인터넷 및 기타 분야에서 널리 사용됩니다. . 개발. TCP 긴 연결을 지원하고 Websocket, HTTP 및 기타 프로토콜을 지원하며 사용자 정의 프로토콜을 지원합니다. 비동기 Mysql, 비동기 Redis, 비동기 Http, MQTT IoT 클라이언트, 비동기 메시지 대기열 등과 같은 많은 고성능 구성 요소가 있습니다.
공식 웹사이트: https://www.workerman.net/
순수한 PHP 개발
PHP 다중 프로세스 지원
TCP, UDP 지원
긴 연결 지원
다양한 애플리케이션 계층 프로토콜 지원
높은 동시성 지원
원활한 서비스 재시작 지원
HHVM 지원
지정된 사용자로 하위 프로세스 실행 지원
내장 모니터링 제공
밀리초 수준 타이머 지원
비동기 IO 지원
개체 또는 리소스의 영구 보존 지원
고성능
분산 배포 지원
지원 하트비트 감지
Workerman은 버전 3.5.3부터 Linux와 Windows 시스템을 모두 지원할 수 있습니다.
PHP>=5.3.3이 필요하며 PHP 환경 변수를 구성합니다.
참고: 이 튜토리얼에서는 Linux를 사용하며 Windows에 대해서는 언급하지 않습니다. 실제 사용을 위해 Windows 시스템을 사용하는 것은 권장되지 않습니다.
Linux lnmp 원클릭 설치 스크립트
1. PHP>=5.3.3을 설치하고 pcntl을 설치합니다. 및 posix 확장 --enable- pcntl --enable-posix
2. 이벤트 또는 libevent 확장을 설치하는 것이 좋지만 필수는 아닙니다(이벤트 확장에는 PHP>=5.4가 필요함)
curl -Ss http:/ /www.workerman.net/check.php | php
git clone https://github.com/walkor/Workerman
yum install libevent-devel
php 버전이 7
이하입니다. http://pecl.php.net/get/ libevent-0.1.0.tgz
현재 libevent 확장은 php7을 지원하지 않으며 php7 사용자는 Event 확장만 사용할 수 있습니다.
wget http://pecl.php.net/get/event-2.4.3.tgz
컴파일 압축 해제
/user/local/php/bin/phpize
./configure --with-php-config=/ usr/local/php/bin/php-config
make && make install
php.ini
require_once 'workman/Autoloader.php'; use \Workerman\Worker; $http_work = new Worker('http://0.0.0.0:1111’); $http_work->onMessage = function($conn,$data){ $conn->send('hello workman'); }; Worker::runAll(); 浏览器 访问 ip:1111 即可
ws.php
require_once 'workman/Autoloader.php'; use \Workerman\Worker; $http_work = new Worker('websocket://0.0.0.0:2222'); $http_work->onMessage = function($conn,$data){ $conn->send('hello workman'.$data); }; Worker::runAll(); <!DOCTYPE HTML> <html> <body> <script> ws = new WebSocket("ws://192.168.113.136:2222"); ws.onopen = function(){ ws.send('lampol'); } ws.onmessage = function(e){ console.log(e.data) } </script> </body> </html>
WorkerMan에는 Worker와 Connection이라는 두 가지 중요한 클래스가 있습니다.
Worker 클래스는 포트 모니터링을 구현하는 데 사용되며, 클라이언트 연결 이벤트, 연결 메시지 이벤트, 연결 끊김 이벤트에 대한 콜백 함수를 설정하여 비즈니스 처리를 구현할 수 있습니다.
$worker = new Worker($listen,$context); //인스턴스화 반환된 객체
$listen의 형식은 a88b79ba1ccee8890e978c768d80530d://597b86729050bec83322e701454c0933
a88b79ba1ccee8890e978c768d80530d 형식:
tcp: 예: tcp://0.0.0.0:8686
udp: 예: udp://0.0.0.0:8686
unix: 예: unix:///tmp/my_file(Workerman> = 필수 3.2.7)
http: 예: http://0.0.0.0:80
websocket: 예: websocket://0.0.0.0:8686
text: 예: text://0.0.0.0: 8686(텍스트는 텔넷과 호환되는 Workerman 내장 텍스트 프로토콜입니다. 자세한 내용은 부록 텍스트 프로토콜 섹션을 참조하세요.)
$context는 소켓의 컨텍스트 옵션을 전달하는 데 사용됩니다.
count
현재 작업자 인스턴스에서 시작되는 프로세스 수를 설정합니다. 설정되지 않은 경우 기본값은 1입니다.
이 속성은 Worker::runAll()이 실행되기 전에 설정되어야 유효합니다. Windows 시스템은 이 기능을 지원하지 않습니다.
프로세스 수 설정 기준:
1. CPU 코어 수
2. 메모리 크기
3. 비즈니스가 IO 집약적인지 CPU 집약적인지
모르는 경우 귀하의 비즈니스가 선호하는 경우 프로세스 수를 CPU로 설정할 수 있습니다. 코어 수의 약 2배이면 충분합니다.
lscpu top 1 CPU 코어 수
id
확인当前worker进程的id编号,范围为0到$worker->count-1。进程重启后id编号值是不变的。
name
设置当前Worker实例的名称,方便运行status命令时识别进程。不设置时默认为none。
protocol
设置当前Worker实例的协议类。
transport
设置当前Worker实例所使用的传输层协议,目前只支持3种(tcp、udp、ssl)。不设置默认为tcp。
daemonize
此属性为全局静态属性,表示是否以daemon(守护进程)方式运行。如果启动命令使用了 -d参数,则该属性会自动设置为true。也可以代码中手动设置。
logFile
用来指定workerman日志文件位置。此文件记录了workerman自身相关的日志,包括启动、停止等。
Worker::$logFile = '/tmp/workerman.log’;
stdoutFile
此属性为全局静态属性,如果以守护进程方式(-d启动)运行,则所有向终端的输出(echo var_dump等)都会被重定向到stdoutFile指定的文件中。
Worker::$stdoutFile = 'test.log’;
pidFile
如果无特殊需要,建议不要设置此属性
Worker::$pidFile = '/var/run/workerman.pid’;
user
设置当前Worker实例以哪个用户运行。此属性只有当前用户为root时才能生效。不设置时默认以当前用户运行。
建议$user设置权限较低的用户,例如www-data、apache、nobody等。
connections
array(id=>connection, id=>connection, ...)
此属性中存储了当前进程的所有的客户端连接对象,其中id为connection的id编号
reloadable
设置当前Worker实例是否可以reload,即收到reload信号后是否退出重启。不设置默认为true,收到reload信号后自动重启进程。
reusePort
设置当前worker是否开启监听端口复用(socket的SO_REUSEPORT选项),默认为false,不开启。
globalEvent
此属性为全局静态属性,为全局的eventloop实例,可以向其注册文件描述符的读写事件或者信号事件。
设置Worker子进程启动时的回调函数,每个子进程启动时都会执行。
回掉函数参数 $worker Worker 对象
$worker->onWorkerStart = function($worker){ //代码 }; $worker->onWorkerStart = 'test’; function test($worker){ echo 'hhhhh'; }
onConnect
当客户端与Workerman建立连接时(TCP三次握手完成后)触发的回调函数。每个连接只会触发一次onConnect回调。
回调函数的参数
$connection
连接对象,即TcpConnection实例,用于操作客户端连接,如发送数据,关闭连接等
$worker->onConnect = function($connection){ echo 'new connect....'.$connection->getRemoteIp(); };
onMessage
当客户端通过连接发来数据时(Workerman收到数据时)触发的回调函数
回调函数的参数
$connection
连接对象,即TcpConnection实例,用于操作客户端连接,如发送数据,关闭连接等
$data
客户端连接上发来的数据,如果Worker指定了协议,则$data是对应协议decode(解码)了的数据
$worker->onMessage = function($connection,$data){ echo $data; $connection->send('hello '.$data.PHP_EOL); };
onClose
当客户端连接与Workerman断开时触发的回调函数。不管连接是如何断开的,只要断开就会触发onClose。每个连接只会触发一次onClose。由于断网或者断电等极端情况断开的连接 ,也就无法及时触发onClose,这种情况需要通过应用层心跳来解决
$worker->onClose = function($connection){ echo 'connection close'; };
onError
当客户端的连接上发生错误时触发。
目前错误类型有
1、调用Connection::send由于客户端连接断开导致的失败(紧接着会触发onClose回调) (code:WORKERMAN_SEND_FAIL msg:client closed)
2、在触发onBufferFull后(发送缓冲区已满),仍然调用Connection::send,并且发送缓冲区仍然是满的状态导致发送失败(不会触发onClose回调)(code:WORKERMAN_SEND_FAIL msg:send buffer full and drop package)
3、使用AsyncTcpConnection异步连接失败时(紧接着会触发onClose回调) (code:WORKERMAN_CONNECT_FAIL msg:stream_socket_client返回的错误消息)
onWorkerReload
此特性不常用到。
设置Worker收到reload信号后执行的回调。
可以利用onWorkerReload回调做很多事情,例如在不需要重启进程的情况下重新加载业务配置文件。
onBufferFull
每个连接都有一个单独的应用层发送缓冲区,如果客户端接收速度小于服务端发送速度,数据会在应用层缓冲区暂存,如果缓冲区满则会触发onBufferFull回调。
缓冲区大为TcpConnection::$maxSendBufferSize,默认值为1MB,可以为当前连接动态设置缓冲区大小例
onBufferDrain
每个连接都有一个单独的应用层发送缓冲区,缓冲区大小由TcpConnection::$maxSendBufferSize决定,默认值为1MB,可以手动设置更改大小,更改后会对所有连接生效。
runAll
运行所有Worker实例。
Worker::runAll()执行后将永久阻塞,也就是说位于Worker::runAll()后面的代码将不会被执行。所有Worker实例化应该都在Worker::runAll()前进行。
stopAll
停止当前进程(子进程)的所有Worker实例并退出。
此方法用于安全退出当前子进程,作用相当于调用exit/die退出当前子进程。
listen
用于实例化Worker后执行监听。
public function __construct($socket_name = '', $context_option = array()) public static function runAll() { static::checkSapiEnv(); //检测命令行模式 static::init(); //初始化日志 pid workid… static::lock(); //启动文件 加锁 独占锁 static::parseCommand(); //解析命令 start stop restart … static::daemonize(); //守护进程运行 static::initWorkers(); //初始化 所有worker 实例 static::installSignal(); //安装信号 static::saveMasterPid(); //保存主进程id static::unlock(); //解锁 static::displayUI(); //展示UI static::forkWorkers(); //fork 进程 static::resetStd(); //重置输入输出 static::monitorWorkers(); //主进程监控各个worker的状态 }
SAPI(Server Application Programming Interface)服务器应用程序编程接口,即PHP与其他应用交互的接口,PHP脚本要执行有很多方式,通过Web服务器,或者直接在命令行下,也可以嵌入在其他程序中。
常见的SAPI有:cgi、fast-cgi、cli、apache模块的DLL、isapi
01 SIGHUP 挂起(hangup)
02 SIGINT 中断,当用户从键盘按^c键或^break键时
03 SIGQUIT 退出,当用户从键盘按quit键时
04 SIGILL 非法指令
05 SIGTRAP 跟踪陷阱(trace trap),启动进程,跟踪代码的执行
06 SIGIOT IOT指令
07 SIGEMT EMT指令
08 SIGFPE 浮点运算溢出
09 SIGKILL 杀死、终止进程
10 SIGBUS 总线错误
11 SIGSEGV 段违例(segmentation violation),进程试图去访问其虚地址空间以外的位置
12 SIGSYS 系统调用中参数错,如系统调用号非法
13 SIGPIPE 向某个非读管道中写入数据
14 SIGALRM 闹钟。当某进程希望在某时间后接收信号时发此信号
15 SIGTERM 软件终止(software termination)
16 SIGUSR1 用户自定义信号1
17 SIGUSR2 用户自定义信号2
18 SIGCLD 某个子进程死
更多计算机编程相关知识,请访问:编程视频!!
위 내용은 Workererman에서 작업자 클래스의 사용법에 대한 간략한 토론의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!