书读百遍其义自见
学习Swoole必备基础
多进程/多线程
- 了解Linux操作系统
进程
和线程
的概念
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.
- 了解Linux
进程
/线程
切换调度的基本知识
在引入线程的操作系统中,线程是调度和分配的基本单位 ,进程是资源拥有的基本单位 。
把传统进程的两个属性分开,线程便能轻装运行,从而可显著地提高系统的并发程度。
在同一进程中,线程的切换不会引起进程的切换;在由一个进程中的线程切换到另一个进程中的线程时,才会引起进程的切换。
- 了解进程间通信的基本知识,如管道、
UnixSocket
、消息队列、共享内存
Socket
- 了解
SOCKET
的基本操作如accept/connect
、send/recv
、close
、listen
、bind
- 了解
SOCKET
的接收缓存区、发送缓存区、阻塞/非阻塞、超时等概念
IO复用
- 了解
select
/poll
/epoll
- 了解基于
select
/epoll
实现的事件循环,Reactor
模型 - 了解可读事件、可写事件
TCP/IP网络协议
- 了解
TCP
/IP
协议 - 了解
TCP
、UDP
传输协议
调试工具
使用 gdb
调试 Linux
程序
1 | gdb -p 进程ID |
gdb
有3种使用方式:
- 跟踪正在运行的PHP程序,使用
gdb -p 进程ID
- 使用gdb运行并调试PHP程序,使用
gdb php -> run server.php
进行调试 - PHP程序发生
coredump
后使用gdb
加载core
内存镜像进行调试gdb php core
使用 strace
跟踪进程的系统调用
strace
可以跟踪系统调用的执行情况,在程序发生问题后,可以用strace
分析和跟踪问题。 使用方法:
strace -o /tmp/strace.log -f -p $PID
-f
: 表示跟踪多线程和多进程,如果不加-f参数,无法抓取到子进程和子线程的运行情况-o
: 表示将结果输出到一个文件中-p $PID
: 指定跟踪的进程ID,通过ps aux
可以看到-tt
: 打印系统调用发生的时间,精确到微妙-s
: 限定字符串打印的长度,如recvfrom
系统调用收到的数据,默认只打印32
字节-c
实时统计每个系统调用的耗时-T
打印每个系统调用的耗时
使用 tcpdump
跟踪网络通信过程
1 | sudo tcpdump -i any tcp port 9501 |
-i
参数制定了网卡,any
表示所有网卡tcp
指定仅监听TCP
协议port
制定监听的端口
Server
强大的
TCP/UDP Server
框架,EventLoop
, 事件驱动, 异步,Worker
进程组,Task
异步任务, 毫秒定时器,SSL/TLS
隧道加密
Http\Server
是Server
的子类, 内置了Http
的支持WebSocket\Server
是Http\Server
的子类, 内置了WebSocket
的支持Redis\Server
是Server
的子类, 内置了Redis
服务器端协议的支持
子类可以调用父类的所有方法和属性
Client
TCP/UDP/UnixSocket
客户端,支持IPv4/IPv6
,支持SSL/TLS
隧道加密,支持SSL
双向证书,支持同步并发调用,支持异步事件驱动编程。
Coroutine
协程可以理解为纯用户态的线程,其通过
协作
而不是抢占
来进行切换。相对于进程或者线程,协程所有的操作都可以在用户态完成,创建和切换的消耗更低。Swoole
可以为每一个请求创建对应的协程,根据IO的状态来合理的调度协程,这会带来了以下优势:
开发者可以无感知的用同步的代码编写方式达到异步IO的效果和性能,避免了传统异步回调所带来的离散的代码逻辑和陷入多层回调中导致代码无法维护。
Process
进程管理模块,可以方便的创建子进程,进程间通信,进程管理。
Table
基于
共享内存
和自旋锁
实现的超高性能内存表。彻底解决线程,进程间数据共享,加锁同步等问题。Table
的性能可以达到单线程每秒读写200W
次
Event
EventLoop API
,让用户可以直接操作底层的事件循环,将socket
,stream
,管道等Linux
文件加入到事件循环中。eventloop
接口仅可用于socket
类型的文件描述符,不能用于磁盘文件读写
常见问题
无法连接到服务器的简单检测手段
- 在
Linux
下,使用netstat -an | grep 端口
,查看端口是否已经被打开处于Listening
状态
1 | [root@caoxl Start]# netstat -an | grep 9501 |
- 上一步确认后,再检查防火墙问题
1 | [root@caoxl Start]# iptables -h |
- 注意服务器所使用的IP地址,如果是
127.0.0.1
回环地址,则客户端只能使用127.0.0.1
才能连接上 - 用的阿里云服务或者腾讯服务,需要在安全权限组进行设置开发的端口