- 博客(29)
- 资源 (11)
- 收藏
- 关注
原创 Swoole从入门到入土(28)——协程[核心API]
在一个协程中使用 go 嵌套创建新的协程。·每个协程都是相互独立的,需要创建单独的内存空间 (栈内存),在 PHP-7.2 版本中底层会分配 8K 的 stack 来存储协程的变量,zval 的尺寸为 16字节,因此 8K 的 stack 最大可以保存 512 个变量。逆序符合资源释放的正确逻辑,后申请的资源可能是基于先申请的资源的,如先释放先申请的资源,后申请的资源可能就难以释放。注意:协程之间并没有实质上的持续父子关系,协程之间是相互隔离,独立运作的,此 Pcid 可理解为创建了当前协程的协程 id。
2023-06-28 10:16:20
891
原创 Swoole从入门到入土(27)——协程[协程容器]
调用 Swoole 提供的 2 个进程管理模块 Process 和 Process\Pool 的 start 方法,此种启动方式会在进程启动的时候创建协程容器,参考这两个模块构造函数的 enable_coroutine 参数。(Co\run() 里面的逻辑如果有未处理的事件在 Co\run() 之后就进行 EventLoop,后面的代码将得不到执行,反之,如果没有事件了将继续向下执行,可以再次 Co\run()。如果程序中仅添加了协程,未调用 start 启动,协程函数 $fn 将不会被执行。
2023-06-28 10:11:53
465
原创 Swoole从入门到入土(26)——多进程[进程间锁]
如读写锁、文件锁可以支持 $lock->lock_read()。另外除文件锁外,其他类型的锁必须在父进程内创建,这样 fork 出的子进程之间才可以互相争抢锁。- 当另外一个进程获得了独占锁 (调用 $lock->lock()/$lock->trylock()) 时,$lock->lock_read() 会发生阻塞,直到持有独占锁的进程释放锁。- 但不能 $lock->lock() 或 $lock->trylock(),这两个方法是获取独占锁,在独占锁加锁时,其他进程无法再进行任何加锁操作,包括读锁;
2023-06-28 10:09:28
277
原创 Swoole从入门到入土(25)——多进程[进程间无锁计数器]
cmp_value:如果当前数值等于 $cmp_value 返回 true,并将当前数值设置为 $set_value,如果不等于返回 false【必须为小于 42 亿的整数】- 当前原子计数如果为 1 时,表示当前有进程正在 wait,wakeup 会唤醒等待的进程,并返回 true;- 被唤醒的进程返回后,会将原子计数设置为 0,这时可以再次调用 wakeup 唤醒其他正在 wait 的进程。- 当前原子计数如果为 0 时,表示没有进程正在 wait,wakeup 会立即返回 true;
2023-06-28 10:07:57
177
原创 Swoole从入门到入土(23)——多进程[进程池Process\Pool]
该模块的核心功能为进程管理,相比 Process 实现多进程,Process\Pool 更加简单,封装层次更高,开发者无需编写过多代码即可实现进程管理功能,配合 Co\Server 可以创建纯协程风格的,能利用多核 CPU 的服务端程序。- 设置为 SWOOLE_IPC_MSGQUEUE 表示使用系统消息队列通信,可设置 $msgqueue_key 指定消息队列的 KEY,未设置消息队列 KEY,将申请私有队列;如果工作进程未监听 SIGTERM 信号,底层会强行终止当前进程,造成部分逻辑丢失。
2023-06-28 10:03:31
861
原创 Swoole从入门到入土(24)——多进程[进程管理器Process\Manager]
相比与 Process\Pool,可以非常方便的创建多个执行不同任务的进程,并且可以控制每一个进程是否要处于协程环境。$ipcType:进程间通信的模式,和 Process\Pool 的 $ipc_type 一致【默认为 0 表示不使用任何进程间通信特性】$msgQueueKey:消息队列的 key,和 Process\Pool 的 $msgqueue_key 一致。$ipcType:进程间通信的模式。$func:当前进程执行的回调函数。$func:这些进程执行的回调函数。
2023-06-28 10:03:15
327
原创 Swoole从入门到入土(22)——多进程[Process]
【启用此选项后,在子进程内输出内容将不是打印屏幕,而是写入到主进程管道。返回值:成功返回子进程的 PID。$enable_coroutine:在 callback function 中启用协程,开启后可以直接在子进程的函数中使用协程 API。$which:由于 unixSocket 是全双工的,指定关闭哪一端【默认为 0 表示同时关闭读和写,1:关闭写,2 关闭读】让我们先看一下例子:创建 3 个子进程,主进程用 wait 回收进程,主进程异常退出时,子进程会继续执行,完成所有任务后退出。
2023-06-28 09:56:54
757
原创 Swoole从入门到入土(21)——毫秒定时器
callback_function:时间到期后所执行的函数,必须是可以调用的,格式为:callbackFunction(int $timer_id, ...$params),可以使用匿名函数的 use 语法传递参数到回调函数中。$callback_function:时间到期后所执行的函数,必须是可以调用的,格式为:callbackFunction(int $timer_id, ...$params),可以使用匿名函数的 use 语法传递参数到回调函数中。返回值:定时器的ID。返回值:定时器的ID。
2023-06-28 09:50:26
366
原创 Swoole从入门到入土(20)——WebSocket服务器[协程版本]
每当有个新的客户端使用websocket向服务端发起连接请求时,服务端都会调用handle中使用的回调函数(即,有几个客户端连接,就有几次回调函数的调用),这些函数共同运行在一个协程容器内部。若传入的 $data 是 Swoole\WebSocket\Frame 对象则其后续参数会被忽略,支持发送各种帧类型。这一段代码中,我们以协程的形式实例化了协程版本的http服务器。· $ws->upgrade():向客户端发送 WebSocket 握手消息。接下来,让我们一起看一下$ws中每个成员函数的使用方法。
2023-06-27 18:34:40
315
原创 Swoole从入门到入土(19)——WebSocket服务器[文件传输]
我们可以设定自己的机制,连续传输图片数据,不断画到canvas上,造成小电影即视感;到这里,有一点需要进行强调,利用slice对文件进行分割发送,多次send将文件内容多次传输到接收端,websocket协议会保证先发的先到达,后发的后达到,不会存在乱序问题。接下来,如果arraybuffer存储的是字符串数据,我们面临的就是要判断这些二进制数是是GBK还是UTF-8,并转成对应的string。要利用WebSocket进行文件传输,我们需要讨论两种情况,分别是:发送方可以是客户端,和 发送方是服务端。
2023-06-27 18:30:43
977
原创 Swoole从入门到入土(18)——WebSocket服务器[心跳ping]
由于 WebSocket 是长连接,如果一定时间内没有通讯,连接可能会断开。这时候需要心跳机制,WebSocket 协议包含了 Ping 和 Pong 两个帧,可以定时发送 Ping 帧来保持长连接。从原文可知,Ping的协议头是0x9,Pong的协议头是0xA,控制帧最大载荷为125bytes且不能拆分。· 在响应Ping帧的的Pong帧中,必须携和被响应的Ping帧中相同的数据。· 当收到Ping帧的时候需要立即返回一个Pong帧。· 在连接建立之后,随时都可以发送Ping帧。1) 发送ping帧。
2023-06-27 18:28:02
1149
原创 Swoole从入门到入土(17)——WebSocket服务器[成员函数与配置选项]
自 v4.4.12 版本起,finish 参数(bool 型)改为 flags 参数(int 型)以支持 WebSocket 压缩,finish 对应 SWOOLE_WEBSOCKET_FLAG_FIN 值为 1,原有 bool 型值会隐式转换为 int 型,此改动向下兼容无影响。$opcode:指定发送数据内容的格式 【默认为WEBSOCKET_OPCODE_TEXT。$fd:客户端连接的 ID 【如果指定的 $fd 对应的 TCP 连接并非 WebSocket 客户端,将会发送失败】
2023-06-27 18:26:32
542
原创 Swoole从入门到入土(16)——WebSocket服务器[事件]
Swoole\WebSocket\Server继承自Swoole\Http\Server,所以websocket server支持http server和tcp server的所有事件。答:通过使用 $server->connection_info($fd) 获取连接信息,返回的数组中有一项为 websocket_status,根据此状态可以判断是否为 WebSocket 客户端。---------- 正文的分割线 -------------· onMessage 回调必须被设置,未设置服务器将无法启动。
2023-06-27 18:23:10
480
原创 Swoole从入门到入土(14)——HTTP服务器[协程风格]
而协程风格的HTTP则很好处理了IO等待的问题。这里要注意完全协程化的 HTTP 服务器实现,Co\Http\Server 由于 HTTP 解析性能原因使用 C++ 编写,因此并非由 PHP 编写的 Co\Server 的子类。在这之间,我们讨论了异步风格HTTP服务器,它继承自异步风格的TCP服务器,有着异步风格的所有优点,同时如果碰到了大量的IO等待也会存在阻塞的缺点。$host:监听的 IP 地址【若是本地 UNIXSocket 则应以形如 unix://tmp/xxx.sock 的格式填写 】
2023-06-27 18:22:02
211
原创 Swoole从入门到入土(15)——WebSocket服务器[初步接触]
在Swoole中,通过内置的 WebSocket 服务器支持,通过几行 PHP 代码就可以写出一个异步 IO 的多进程的 WebSocket 服务器。WebSocket\Server 继承自 Http\Server,所以 Http\Server 提供的所有 API 和配置项都可以使用。这时候我们需要一个本地的websocket调试器。本人在网上寻找了挺久,除了apache jmeter有相关的插件支持websocket调试之外,就没有太理想的工具。所以,暂时自己写了简单的一个调试工具,勉强应付使用。
2023-06-27 18:20:54
242
原创 Swoole从入门到入土(13)——HTTP服务器[配置]
与官网相比,这里有几个配置没有讨论,比如:document_root、enable_static_handler。如果想要了解这些细节,请查看官网。-br 压缩格式依赖 google 的 brotli 库,安装方式请自行搜索 install brotli on linux,在编译 Swoole 时底层会检测系统是否存在 brotli。http_compression:针对 Response 对象的配置,启用压缩。-http-chunk 不支持分段单独压缩,若使用 write 方法,将会强制关闭压缩。
2023-06-27 18:20:04
238
原创 Swoole从入门到入土(12)——HTTP服务器[Response]
Http\Response 对象自带的 end 方法无法满足需求,可以使用 detach 分离响应对象,然后自行组装 HTTP 协议响应数据,并使用 Server::send 发送数据。响应对象主要用于将数据发现到客户端。-如果设置了第二个参数 $reason,$http_status_code 可以为任意的数值,包括未定义的 HttpCode,如 499。$fd:参数为需要绑定的连接 $fd【调用 Http\Response 对象的 end 与 write 方法时会向此连接发送数据】
2023-06-27 18:16:25
295
原创 Swoole从入门到入土(11)——HTTP服务器[Request]
http服务器的本质是应答式的服务器。我们只需关注onRequest事件中的request(请求)和response(响应)对象。有些情况下服务器不需要解析 HTTP POST 请求参数,通过 http_parse_post 配置,可以关闭 POST 数据解析。注意:POST 与 Header 加起来的尺寸不得超过 package_max_length 的设置,否则会认为是恶意请求。Swoole的http服务器非常精练,关于请求对象的属性与函数只有以上这些。下一节,我们将近入响应对象的讨论。
2023-06-27 17:14:49
407
原创 Swoole从入门到入土(10)——HTTP服务器[初步接触]
注意,这里用“一般”是以前多数是这样做的,在“HTTP协议白皮书”中没有规定HTTP协议底层要搭载在哪种协议上,而且在HTTP3(由谷歌QUIC进化而成)所在的传输层就是搭载在UDP协议上。-Swoole\Http\Server 继承自 Swoole\Server,所以TCP服务器所有的配置项、函数、事件在Http服务器中都可以使用,进程模型也是一致的。-Swoole\Http\Server对 HTTP 协议的支持并不完整,一定要作为应用服务器处理动态请求。HTTP初步实验到这里结束,大家下一篇再见:)
2023-06-27 17:10:47
147
原创 Swoole从入门到入土(9)——TCP服务器[协程风格]
但是这里存在一个问题,500人的请求业务并不是全都是阻塞行为(访问数据库、读写文件等),所以我们完全可以在一个线程中开辟N个协程,一个线程同时接受N个请求,对于有阻塞的业务请求进行等待直到业务完成,对于没有阻塞的请求,我们就可以立即响应,这样就可以将“并发”从300,提高到300*N(N>=2)。同样的,如果现在有一个任务,需要5个“线程”同时执行,那么执行顺序是,主线程同时开辟启动5个线程,这5个线程哪一个先执行,当先执行的线程让出时间片后,接下来由哪一个线程接上,这些完全听天由命。先看以下这段代码:。
2023-06-27 15:53:39
276
原创 Swoole从入门到入土(8)——协程初探
当大家第一次看到“协程”这个词的时候,应该都一样会打开某度、某歌搜索一翻,然后搜到一堆很玄幻的概念,比如以下这一句:“协程(coroutine)也是一种程序组件。同样的道理,我们可以把线程看成是一个容器,协程是线程中具体干活的过程。虽然swoole提供了“一键协程化”的神仙操作,可以把文件操作,sleep,Mysqli,PDO,streams等都变成异步IO,但是要注意,底层是使用了HOOK的方式把原PHP的代码调用转移到了swoole的函数内,接下去,我们会先了解协程版本的TCP服务器。
2023-06-27 10:32:55
362
原创 Swoole从入门到入土(7)——TCP服务器[大杂烩]
队列的大小由 backlog 参数和配置 somaxconn 的最小值决定,我们可以通过 ss -lt 命令查看最终的 accept queue 队列大小,Swoole 的主进程调用 accept,从 accept queue 里面取走。这时如果进程强制退出,SQL 的执行结果就会丢失了。-如果 sendMessage() 是异步 IO 的,如果对端进程因为种种原因不接收数据,千万不要一直 sendMessage(),会导致占用大量的内存资源,可以做个应答机制,对端不回应就不要发了;
2023-06-26 17:57:58
462
1
原创 Swoole从入门到入土(6)——TCP服务器[粘包]
是不是很神奇,swoole底层根据package_eof配置设置的结束符帮我们把客户端发过来的数据包进行分包与合包,让我们在onRecieve业务层拿到的数据都是完整的业务数据包。而在发送端发送数据时,发送的第一个字节是该数值在内存中的起始地址处对应的那个字节,也就是说,该数值在内存中的起始地址处对应的那个字节就是要发送的第一个高位字节(即:高位字节存放在低地址处);(4)服务端分两次读取到了两个数据包,第一次读取到了D1包的部分内容D1_1,第二次读取到了D1包的剩余内容D1_2和D2包的整包。
2023-06-26 17:34:39
290
1
原创 Swoole从入门到入土(5)——TCP服务器[异步任务]
全名 UNIX Domain Socket, 简称 UDS, 使用套接字的 API (socket,bind,listen,connect,read,write,close 等),和 TCP/IP 不同的是不需要指定 ip 和 port,而是通过一个文件名来表示 (例如 FPM 和 Nginx 之间的 /tmp/php-fcgi.sock),UDS 是 Linux 内核实现的全内存通信,无任何 IO 消耗。如果服务端需要执行很耗时的操作,就需要异步任务处理机制,保证当前的响应速度不受影响。
2023-06-26 17:24:39
300
1
原创 Swoole从入门到入土(4)——TCP服务器[正确重启]
如果没有reload_async,Worker 进程收到重启信号或达到 max_request 时,会立即停止服务,这时 Worker 进程内可能仍然有事件监听,这些异步任务将会被丢弃。如果旧的 Worker 一直不退出,底层还增加了一个定时器,在max_wait_time 秒内旧的 Worker 没有退出,底层会强行终止,并会产生一个 WARNING 报错。- 发生致命错误或者代码中主动调用 exit 时,Worker/Task 进程会退出,管理进程会重新创建新的进程。
2023-06-26 17:12:02
692
1
原创 Swoole从入门到入土(3)——TCP服务器[基本配置项]
PHP 应用程序有缓慢的内存泄漏,但无法定位到具体原因、无法解决,可以通过设置 max_request 临时解决,但是项目要持久运行还是必须找到内存泄漏的代码并修复。dispatch_mode 配置在 SWOOLE_BASE 模式是无效的,因为 BASE 不存在投递任务,当收到客户端发来的数据后会立即在当前线程 / 进程回调 onReceive,不需要投递 Worker 进程。在这一节的开篇,让我们先解决上一节的“配置”话题。但开的进程越多,占用的内存就会大大增加,而且进程间切换的开销就会越来越大。
2023-06-26 16:53:53
447
1
原创 Swoole从入门到入土(2)——TCP服务器[初步接触]
当使用 dispatch_mode = 1(轮循模式)或3(抢占模式) 配置时,考虑到这种数据包分发策略用于无状态服务,当连接断开后相关信息会直接从内存中删除,所以 Server->getClientInfo 是获取不到相关连接信息的。$host:监听的IP地址,可支持IPV4也可支持IPV6,0.0.0.0为IPV4的所有地址,::(相当于0:0:0:0:0:0:0:0)为IPV6的所有地址。$mode:SWOOLE_PROCESS(默认,多进程模式),SWOOLE_BASE(基要模式)。
2023-06-26 16:46:30
281
1
转载 Swoole从入门到入土(1)——入坑
Swoole提供给了php长连接、协程、异步任务、微服务的能力,弥补了php短板,让php有了在即时通讯、物联网、区块链的领域中发力的可能。接下来,做好准备,让我们一起徜徉在知识的海洋。安装Swoole有两种方式,即编译成php的扩展,或者在编译php的过程过静态编译到php中。有好多话题可供选择,但是思来想去,对于PHPer进阶与其急着去掌握一门新的语言,匆忙地踏足一个新的知识体系,还不如先把php圈子的技能点攒齐了。在这一系列的文章中,我们会假设大家已经有良好的php基础,对于扩展的编译已经熟练掌握。
2023-06-26 16:37:40
193
1
转载 钢琴的乐理知识以及musicXml属性介绍
钢琴白键加黑键共有88个按键,分成9组按键(每组按键有7个白键,5个黑键,白键与黑键对应音阶如图二所示),左边的按键音调总比右边按键音调低,一组按键中,相邻两个键音调高低相差一个半音,比如图二中C和#C(Db)音调高低上相差一个半音;谱号主要是为了定义一个基本音调(或者说确定钢琴的一个大概按键范围),谱号主要有高音谱号(G谱号)、低音谱号(F谱号)、中音谱号、次中音谱号。(其实只用一个谱号也可以表示很大范围的音,但是为了避免在一个谱号上加上过多的线,不便读取,所以,衍生出了四种谱号)
2023-01-10 17:10:06
1248
【最新最全的】全国行政区划-省市区邮编区号拼音经纬度-全面标准数据库
2019-02-20
SVN1.8.6-X64含中文包
2014-12-12
TortoiseSVN-1.7.10.23359-win32+LanguagePac汉化文件很好用
2014-12-12
CentOS 6.2编译安装Nginx1.2.0+MySQL5.5.25+PHP5.3.13
2012-07-13
CentOS下Nginx1.1.15+Php5.3.10+Mysql5.5.20编译安装.手工编译成功
2012-07-13
开发文档最标准化的需求说明书
2011-06-03
ECSHOP数据结构。html,chm
2010-03-26
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人