• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Swoole开发要点介绍

php 搞代码 4年前 (2022-01-22) 53次浏览 已收录 0个评论
文章目录[隐藏]

摘要:简介Swoole是一个PHP扩展,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS查询。 Swoole内置了Http/WebSo …

简介

现在,我们基于上面的例子修改代码,来看看一个简单的多进程Swoole Server的几个基本配置:

$server->set(array(    'demonize' => false,//是否后台运行    'reactor_num' => 2,    'worker_num' => 4));$server -> start();

reactor_num:表示Master进程中,Reactor线程总共开多少个,注意,这个可不是越多越好,因为计算机的CPU是有限的,所以一般设置为与CPU核心数量相同,或者两倍即可。

worker_num:表示启动多少个Worker进程,同样,Worker进程数量不是越多越好,仍然设置为与CPU核心数量相同,或者两倍即可。

我们可以在Shell里运行,使用pstree查看进程模型结构:

php swoole_tcp_server.phppstree -ap|grep swoole_tcp  |   |       `-php,2505 swoole_tcp_server.php  |   |           |-php,2507 swoole_tcp_server.php  |   |           |   |-php,2510 swoole_tcp_server.php  |   |           |   |-php,2511 swoole_tcp_server.php  |   |           |   |-php,2512 swoole_tcp_server.php  |   |           |   `-php,2513 swoole_tcp_server.php

回调函数

Swoole作为Server时,回调函数有很多。但可以简单分个类:
1) 进程启动时执行的:onStart、onManagerStart、onWorkerStart;onWorkerStop、onManagerStop、onShutdown;onWorkerError
2) 客户端交互时触发的:onReceive/onRequest/onPacket/onMessage、onOpen/onConnect、o*本5文来源gaodai$ma#com搞$$代**码)网@搞代码gaodaimanClose
3) Task:onTask、onFinish
4) Timer:onTimer

事件执行顺序:

  • 所有事件回调均在$server->start后发生

  • 服务器关闭程序终止时最后一次事件是onShutdown

  • 服务器启动成功后,onStart/onManagerStart/onWorkerStart会在不同的进程内并发执行。

  • onReceive/onConnect/onClose/onTimer在worker进程(包括task进程)中各自触发

  • worker/task进程启动/结束时会分别调用onWorkerStart/onWorkerStop

  • onTask事件仅在task进程中发生

  • onFinish事件仅在worker进程中发生

  • onStart/onManagerStart/onWorkerStart 3个事件的执行顺序是不确定的

  • UDP协议下只有onReceive事件,没有onConnect/onClose事件

  • 如果未设置onPacket回调函数,收到UDP数据包默认会回调onReceive函数

  • onOpen事件回调是可选的:当WebSocket客户端与服务器建立连接并完成握手后会回调此函数

实际使用的时候不是所有回调都可以使用的,例如UDP服务器没有onConnect/onClose;例如接收数据,在WebSocket里使用onReceive,在HttpServer使用onRequest,在UDPServer使用onPacket。

示例:

$server = new \swoole_server("127.0.0.1",8088);$server->set(array(    'daemonize' => false,    'reactor_num' => 2,    'worker_num' => 4));$server->on('connect', function ($serv, $fd){     echo "client connect. fd is {$fd}\n";});$server->on('receive', function ($serv, $fd, $from_id, $data){    echo "client connect. fd is {$fd}\n";});$server->on('close', function ($serv, $fd){    echo "client close. fd is {$fd}\n";});// 以下回调发生在Master进程$server->on("start", function (\swoole_server $server){    echo "On master start.\n";});$server->on('shutdown', function (\swoole_server $server){    echo "On master shutdown.\n";});// 以下回调发生在Manager进程$server->on('ManagerStart', function (\swoole_server $server){    echo "On manager start.\n";});$server->on('ManagerStop', function (\swoole_server $server){    echo "On manager stop.\n";});// 以下回调也发生在Worker进程$server->on('WorkerStart', function (\swoole_server $server, $worker_id){    echo "Worker start\n";});$server->on('WorkerStop', function(\swoole_server $server, $worker_id){    echo "Worker stop\n";});$server->on('WorkerError', function(\swoole_server $server, $worker_id, $worker_pid, $exit_code){    echo "Worker error\n";});$server -> start();

编程须知

  • 不要在代码中执行sleep以及其他睡眠函数,这样会导致整个进程阻塞

  • exit/die是危险的,会导致worker进程退出

  • 可通过register_shutdown_function来捕获致命错误,在进程异常退出时做一些请求工作,具体参看/wiki/page/305.html

  • PHP代码中如果有异常抛出,必须在回调函数中进行try/catch捕获异常,否则会导致工作进程退出

  • swoole不支持set_exception_handler,必须使用try/catch方式处理异常

  • Worker进程不得共用同一个RedisMySQL等网络服务客户端,Redis/MySQL创建连接的相关代码可以放到onWorkerStart回调函数中。原因是如果共用1个连接,那么返回的结果无法保证被哪个进程处理。持有连接的进程理论上都可以对这个连接进行读写,这样数据就发生错乱了。具体参考/wiki/page/325.html

  • 不能使用类的属性保存客户端连接信息,因为一个worker进程可以处理多个客户端连接,导致类属性数据错乱。常量则是可以的。

以上就是Swoole开发要点介绍的详细内容,更多请关注搞代码gaodaima其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Swoole开发要点介绍

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址